问题是,着色器(非常简单的,因为我学习的OpenGL)无法在一个看似随机的方式来编译(并随机错误信息*)。 相同的着色器,然而,在大约3或4次尝试编译。 下面是代码:
Shader::Shader(GLenum Type,std::string filename)
{
shader_type = Type;
std::ifstream ifs(filename);
if(!ifs)
throw(std::runtime_error("File:"+filename+" not opened."));
std::ostringstream stream;
stream<<ifs.rdbuf();
const GLchar* data = stream.str().c_str();
handle = glCreateShader(shader_type);
glShaderSource(handle,1,static_cast<const GLchar**>(&data),0);
glCompileShader(handle);
int status;
glGetShaderiv(handle,GL_COMPILE_STATUS,&status);
if(status == GL_FALSE)
{
int loglength;
glGetShaderiv(handle,GL_INFO_LOG_LENGTH,&loglength);
auto data = new char[loglength];
glGetShaderInfoLog(handle,loglength,&loglength,data);
std::string strdata(data);
delete [] data;
throw(std::runtime_error(strdata));
}
}
请注意,着色器不能在最后丢失换行符,赢得最后的分号后进行额外的空间,并使用制表符代替空格。 (如建议在不同的旧帖子在互联网上!)。
- 下面是来自同一个顶点着色器这里生产的两个错误信息,而不是在同一时间:
#version 330
in vec2 Position;
uniform mat4 transform;
void main()
{
gl_Position = transform*vec4(Position,0.0f,1.0f);
}
错误:
0(1) : error C0000: syntax error, unexpected $undefined at token "<undefined>"
0(6) : error C0000: syntax error, unexpected '!', expecting ',' or ')' at token "!"
有时,它只是工作! 它是我的驱动程序有问题? (我使用的是最近302.x稳定的NVIDIA二进制文件的Arch Linux的64位驱动程序,与年龄9600 GSO卡)
PS:该代码按预期工作,每当着色器编译正确,所以我认为这768,16是正确的。 我会很高兴地张贴工作(有时!)例如,作为一个zip文件,如果问题不能从这个发现,有人想看看。