0

我设法重新制作了我的着色器编译器,以免使用两个或多个 .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 错误是什么,但我不知道空间如何导致内存错误。

4

2 回答 2

2

可能是您的着色器编译器的显卡驱动程序实现期望着色器源以空白字符结尾。这可能来自 C 中源文件末尾的空行要求。我不确定 GLSL 标准是否要求这样做,但为了安全起见,您可能应该留一个空行。

编辑:

虽然我在GLSL 规范中找不到任何要求着色器源以新行或空格结尾的内容,但因为您的着色器#endif以此结尾可能是由预处理器规则引起的:

每个指令都以新行结束。

于 2013-10-18T20:08:33.493 回答
1

每个 gl 着色器都必须以\n. 我试图在我的时间里找到原因,但我失败了。但这是一个已知的错误/功能。

于 2013-10-18T20:06:20.333 回答