我的着色器程序出了问题。它与消息通信:
顶点信息
(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:
[编辑:] 我有错误:
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,这些在程序中是未定义的。
答案 0 :(得分:4)
如果在没有长度信息的情况下调用glShaderSource
且字符串未正确终止,则发生这种典型错误。我的建议是传递两个长度信息并将填充空字节添加到字符串的末尾。