【发布时间】: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,这些在程序中未定义。
【问题讨论】: