我设法重新制作了我的着色器编译器,以免使用两个或多个 .txt 文件,只有一个带有#defines 的程序。现在它工作得很好,但是如果我在 shader.txt 的最后一行之后没有按回车或留出空格,它的行为就会很奇怪:我得到了标题中提到的错误。
我的着色器加载器:
m_vertexShader.source = readFile(m_vertexShader.filename);//.source is string
const GLchar defineVertex[] = "#define VERTEX \n";
const GLchar* vertexsource[2]={defineVertex,
static_cast<const GLchar*>(m_vertexShader.source.c_str())};
glShaderSource(m_vertexShader.id, 2, vertexsource, NULL);
片段程序也是如此。
来源阅读器:
string readFile(const string& filename)
{
ifstream fileIn(filename.c_str());
if (!fileIn.good())
{
std::cerr << "Could not load shader: " << filename << std::endl;
return string();
}
string stringBuffer(std::istreambuf_iterator<char>(fileIn),(std::istreambuf_iterator<char>()));
return stringBuffer;
}
好吧,在 .txt 我还有几行:
#version 400
layout (location = 0)
in vec3 a_Vertex;
uniform mat4 model_matrix;
uniform mat4 view_matrix;
uniform mat4 projection_matrix;
mat4 mvp = projection_matrix*view_matrix*model_matrix;
#ifdef VERTEX
void main(void)
{
gl_Position = mvp*vec4(a_Vertex,1);
}
#endif
#ifdef FRAGMENT void main(void)
{
gl_FragColor = vec4(gl_FragCoord.zzz,1);
}
#endif
因此,如果我以这种形式留下它,并且最后一个字符是#endif 的“f”,我会收到消息。这种形式会发生什么,当最后一个字符后面有空格时会有什么不同。
编辑:我知道feeefeee 错误是什么,但我不知道空间如何导致内存错误。