我正试图在OpenGL中使用着色器,但似乎我无法编译着色器。更令人沮丧的是,错误日志也显示为空。我已经广泛搜索了这个网站,并检查了许多不同的教程,但似乎没有解释为什么它失败。我甚至买了一本处理着色器的书,但它没有说明日志文件消失。
我的感觉是,如何链接着色器源必定会出错。
//Create shader
GLuint vertObject;
vertObject = glCreateShader(GL_VERTEX_SHADER);
//Stream
ifstream vertfile;
//Try for open - vertex
try
{
//Open
vertfile.open(vertex.c_str());
if(!vertfile)
{
// file couldn't be opened
cout << "Open " << vertex << " failed.";
}
else
{
getline(vertfile, verttext, '\0');
//Test file read worked
cout << verttext;
}
//Close
vertfile.close();
}
catch(std::ifstream::failure e)
{
cout << "Failed to open" << vertfile;
}
//Link source
GLint const shader_length = verttext.size();
GLchar const *shader_source = verttext.c_str();
glShaderSource(vertObject, 1, &shader_source, &shader_length);
//Compile
glCompileShader(vertObject);
//Check for compilation result
GLint isCompiled = 0;
glGetShaderiv(vertObject, GL_COMPILE_STATUS, &isCompiled);
if (!isCompiled)
{
//Did not compile, why?
std::cout << "The shader could not be compiled\n" << std::endl;
char errorlog[500] = {'\0'};
glGetShaderInfoLog(vertObject, 500, 0, errorlog);
string failed(errorlog);
printf("Log size is %d", failed.size());
}
printf("Compiled state = %d", isCompiled);
着色器代码尽可能简单。
void main()
{
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}
我无法获得我的片段或顶点着色器进行编译。如果我可以显示错误日志,那么至少我将能够开始错误检查我自己的工作。但就目前而言,我甚至无法得到错误。
答案 0 :(得分:2)
似乎glCompile在没有日志的情况下失败的原因是因为我试图在OpenGL上下文初始化之前执行此操作(glutCreateWindow等)。
如果其他人在将来遇到此问题,请在尝试创建任何GLSL对象之前尝试获取您的版本。
printf("OpenGL version is (%s)\n", glGetString(GL_VERSION));
如果你得到&#34; OpenGL版本是(null)&#34;,那么你没有一个有效的上下文来创建你的着色器。找到创建上下文的位置,并确保随后创建着色器。