着色器源中的错误

时间:2013-11-23 13:30:01

标签: opengl glsl shader

我的着色器程序出了问题。它与消息通信:

顶点信息

(0):错误C0000:语法错误,令牌意外的$ end

片段信息

(0):错误C0000:语法错误,令牌意外的$ end

这是我的着色器加载功能。可能在这个函数中有一些错误(?)。

GLuint ConfigureShaders(string vsName, string fsName)
{
    // Utworz Shadery
    VS = glCreateShader(GL_VERTEX_SHADER);
    FS = glCreateShader(GL_FRAGMENT_SHADER);
    // Czytaj Shadery
    string LineBuffer;

    fstream VSFile(vsName.c_str(),ios::in);
    string VSSource;
    if(VSFile.is_open())
    {
        while(getline(VSFile,LineBuffer))
            VSSource.append("\n"+LineBuffer);
        VSFile.close();
    }

    fstream FSFile(fsName.c_str(),ios::in);
    string FSSource;
    if(FSFile.is_open())
    {
        LineBuffer.clear();
        while(getline(FSFile,LineBuffer))
            FSSource.append("\n"+LineBuffer);
        FSFile.close();
    }

    GLint result;
    // int infoLogLength;
    // Wprowadz, Kompiluj i Sprawdz Shadery
    char const* VSSrc = VSSource.c_str();
    glShaderSource(GL_VERTEX_SHADER,1,&VSSrc,NULL);
    glCompileShader(VS);
    glGetShaderiv(VS,GL_COMPILE_STATUS,&result);
    // glGetShaderiv(VS,GL_INFO_LOG_LENGTH,&infoLogLength);

  char VSErrMsg[256];
    glGetShaderInfoLog(VS,1024,NULL,VSErrMsg);
    cout<<VSErrMsg<<endl;

    char const* FSSrc = FSSource.c_str();
    glShaderSource(GL_FRAGMENT_SHADER,1,&FSSrc,NULL);
    glCompileShader(FS);
  glGetShaderiv(VS,GL_COMPILE_STATUS,&result);
    // glGetShaderiv(VS,GL_INFO_LOG_LENGTH,&infoLogLength);

  char FSErrMsg[256];
    glGetShaderInfoLog(FS,1024,NULL,FSErrMsg);
    cout<<FSErrMsg<<endl;

    // Polacz Shadery
    GLuint Shader = glCreateProgram();
    glAttachShader(Shader,VS);
    glAttachShader(Shader,FS);
    glLinkProgram(Shader);
    // Sprawdz Program
    glGetProgramiv(Shader,GL_LINK_STATUS,&result);
    // glGetProgramiv(Shader,GL_INFO_LOG_LENGTH,&infoLogLength);

    char PrgErrMsg[256];
    glGetProgramInfoLog(Shader,1024,NULL,PrgErrMsg);
    cout<<PrgErrMsg<<endl;

  // Kasuj Shadery
    glDeleteShader(VS);
    glDeleteShader(FS);
    return Shader;
}

Shader Sources很简单,似乎很好:

VS

#version 400
layout(location=0) vec3 vertexPos;

void main()
{
  gl_Position.xyz = vertexPos;
  gl_Position.w = 1.0f;
}

FS

#version 400

out vec3 color;

void main()
{
  color = vec3(0,0,1);
}

我错误地说:

char const* VSSrc = VSSource.c_str();
glShaderSource(GL_VERTEX_SHADER,1,&VSSrc,NULL);
...
char const* FSSrc = FSSource.c_str();
glShaderSource(GL_FRAGMENT_SHADER,1,&FSSrc,NULL);

@datenwolf:

  • 好的我明白最后一个参数中的NULL意味着NULL字符串 带有着色器源的字符串末尾的终结符。为什么是字符串 如果我使用c_str(),则不正确null终止,不是字符串类 可靠?
  • 我是否要将FSource.size()传递给最后一个参数?如何正确施放 它(GLint *)?

[编辑:] 我有错误:

char const* VSSrc = VSSource.c_str();
glShaderSource(VS,1,&VSSrc,NULL); // It Should be VS ID instead of GL_VERTEX_SHADER
...
char const* FSSrc = FSSource.c_str();
glShaderSource(FS,1,&FSSrc,NULL); // It Should be FS ID instead of GL_FRAGMENT_SHADER

例程中的问题是使用GL_VERTEX_SHADER和GL_FRAGMENT_SHADER作为VS和FS ID,这些在程序中是未定义的。

1 个答案:

答案 0 :(得分:4)

如果在没有长度信息的情况下调用glShaderSource且字符串未正确终止,则发生这种典型错误。我的建议是传递两个长度信息并将填充空字节添加到字符串的末尾。