在我的程序中,我尝试使用 Sasha Willems 的示例代码(https://github.com/SaschaWillems/openglcpp/blob/master/SPIRVShader/main.cpp)加载预编译的二进制着色器:
bool loadBinaryShader(const char *fileName, GLuint stage, GLuint binaryFormat, GLuint &shader)
{
std::ifstream shaderFile;
shaderFile.open(fileName, std::ios::binary | std::ios::ate);
if (shaderFile.is_open())
{
size_t size = shaderFile.tellg();
shaderFile.seekg(0, std::ios::beg);
char* bin = new char[size];
shaderFile.read(bin, size);
GLint status;
shader = glCreateShader(stage); // Create a new shader
glShaderBinary(1, &shader, binaryFormat, bin, size); // Load the binary shader file
glSpecializeShaderARB(shader, "main", 0, nullptr, nullptr); // Set main entry point (required, no specialization used in this example)
glGetShaderiv(shader, GL_COMPILE_STATUS, &status); // Check compilation status
return status;
}
else
{
std::cerr << "Could not open \"" << fileName << "\"" << std::endl;
return false;
}
}
我创建了以下两个简单的着色器进行测试:
测试片段
#version 450
in vec4 color;
out vec4 outCol;
void main()
{
outCol = vec4(1., 0., 0., 1.);
}
和 text.vert
#version 450
layout (location = 0) in vec3 inPos;
layout (location = 1) in vec3 inColor;
layout (location = 0) out vec3 outColor;
out gl_PerVertex
{
vec4 gl_Position;
};
void main()
{
outColor = vec3(0.2, 1., 0.2);
gl_Position = vec4(5.*inPos.xyz, 1.0);
}
我使用来自 github 的 glslangValidator 将它们转换为 SPIR-V 格式: https ://github.com/KhronosGroup/glslang 我使用了:
glslangValidator.exe test.vert -G -o anypath.spv
当我尝试加载这些着色器时,它会因在线分段错误而崩溃
glSpecializeShaderARB(shader, "main", 0, nullptr, nullptr);
我已经在另一台具有较旧 GPU(GeForce GTX 660)的 PC 上进行了相同的尝试,并且效果很好。但它不适用于我的带有 Radeon R9 Fury X 的新 PC。
有任何想法吗?