我试图建立一个简单的OpenGL 3.2程序由单个片段着色器,但我似乎并没有能够真正编译着色器。 我相当肯定,我的着色器的语法是正确的,但即使它不是,我无法检索使用错误消息glGetShaderInfoLog
。
我开发了一个小程序,显示这个动作:
GLuint shader = glCreateShader(GL_FRAGMENT_SHADER);
const char *shaderData =
"#version 120\n"
"void main()\n"
"{\n"
" gl_FragColor = gl_Color;\n"
"}\n";
glShaderSource(shader, 1, &shaderData, NULL);
GLint status;
glGetShaderiv(shader, GL_COMPILE_STATUS, &status);
if (status == GL_FALSE)
{
GLint infoLogLength;
glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLogLength);
GLchar* strInfoLog = new GLchar[infoLogLength + 1];
glGetShaderInfoLog(shader, infoLogLength, NULL, strInfoLog);
fprintf(stderr, "Compilation error in shader %s: %s\n", this->name, strInfoLog);
delete[] strInfoLog;
}
这产生消息:
编译错误着色器片段着色器:
这个问题似乎是在调用getShaderiv
检索GL_INFO_LOG_LENGTH
值返回0每一次,因此我的观点分配一个空字符串。 我曾尝试这个值硬编码为100,但我仍然什么也得不到getShaderInfoLog
。
在这里,我关注的不是固定着色器(我可以做我自己,如果它是错误的),但要获得调试信息。 我知道,这是可以做到的,因为我已经使用着色器制造商简要地开发着色器,和我能够得到非常详细的调试信息。 例如:
ERROR: 0:11: 'undefined_variable' : syntax error syntax error
除非着色标记有内部自身的验证工具,我敢肯定,它必须使用我试图用同样的方法。 我已经看到了人们检索错误消息以同样的方式着色器在互联网上的几个例子,所以我相当肯定,我做正确。
现在,我得到一个编译时警告,这可能解释了这个问题:
#warning gl.h and gl3.h are both included. Compiler will not invoke errors if using removed OpenGL functionality.
做全文搜索后,我找不到任何地方,我打电话#include <OpenGL/gl.h>
所以我猜测,这头被包含在由一个NSOpenGL*
类。 我相当肯定,我不是在使用这套短节目的任何删除的功能,并且这个问题只有在谷歌约5安打,但我想我会更好反正提到这一点。