2013-11-23 112 views
0

我遇到了着色器程序的問題。它comunicates與消息:着色器源錯誤

頂點信息

(0):錯誤C0000:語法錯誤,在令牌

片段信息意想不到的$結束

(0):錯誤C0000:語法錯誤,令牌意外$ end

這是我的Shader Loading函數。可能在這個函數中有一些類似的錯誤(?)。

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來源很簡單,似乎是不錯的:

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意味着空字符串在字符串的Shader來源結束 終止。爲什麼字符串是 不正確的空終止如果我使用c_str(),是不是字符串類 可靠?
  • 我是否將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,這些都在計劃不確定的。

回答

4

這是一個典型的錯誤發生,如果glShaderSource被稱爲沒有長度信息,並且字符串不正確空終止。我的建議是傳遞兩個長度信息並將填充空字節添加到字符串的末尾。