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,這些都在計劃不確定的。