【问题标题】:Error in Shader Source着色器源错误
【发布时间】:2013-11-24 01:42:55
【问题描述】:

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

顶点信息

(0) : 错误 C0000: 语法错误,意外 $end at token

片段信息

(0) : 错误 C0000: 语法错误,意外 $end at token

这是我的着色器加载功能。可能在此函数中存在类似错误(?)。

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,这些在程序中未定义。

【问题讨论】:

    标签: opengl glsl shader


    【解决方案1】:

    这是一个典型的错误,如果在没有长度信息的情况下调用 glShaderSource 并且字符串没有正确地以空值结尾。我的建议是同时传递长度信息并在字符串末尾添加填充空字节。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多