顶点着色器无法编译,但信息日志中没有消息

Posted

技术标签:

【中文标题】顶点着色器无法编译,但信息日志中没有消息【英文标题】:Vertex shader fails to compile, but no message from Info Log 【发布时间】:2013-05-08 19:15:51 【问题描述】:

我正在尝试设置一个简单的顶点着色器。当我编译它时,它会失败(根据 GL_COMPILE_STATUS),但信息日志是空的,从调试的角度来看,我没有任何工作可做。

这是我的代码:

GLuint vertexShader, fragmentShader;

char *code =

"void main(void)\
\
    vec4 a = gl_Vertex;\
    a.x = a.x * 0.5;\
    a.y = a.y * 0.5;\
    gl_Position = gl_ModelViewProjectionMatrix * a;\
";


int length = strlen(code);

vertexShader = glCreateShader(GL_VERTEX_SHADER);
//fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(vertexShader, 1, &code, &length);

glCompileShader(GL_VERTEX_SHADER);

GLint compiled;
GLint logLength;

glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &compiled);

glGetShaderiv(vertexShader, GL_INFO_LOG_LENGTH , &logLength);
if (logLength > 1)

    GLchar* compiler_log = (GLchar*)malloc(logLength);
    glGetShaderInfoLog(vertexShader, logLength, 0, compiler_log);
    printf("%s\n", compiler_log);
    free (compiler_log);

我知道这很混乱,而且由于我是着色器新手,我确信我的着色器代码有问题。然而,让我心烦意乱的是缺乏调试信息。上面的代码导致compiledGL_FALSE(意味着代码编译失败)和logLength 为0(意味着信息日志为空)。是什么赋予了?这不是信息日志的重点吗?

【问题讨论】:

【参考方案1】:

glCompileShader 采用从glCreateShader 返回的着色器编号,而不是着色器类型。

在这种情况下

glCompileShader(GL_VERTEX_SHADER);

应该是

glCompileShader(vertexShader);

【讨论】:

哇,我觉得自己很笨。我想因为GLenum 基本上是GLuint 它并没有给我一个错误。它还解释了为什么vertexShader 上没有错误日志,因为我什至还没有尝试编译它!我要休息一会儿。

以上是关于顶点着色器无法编译,但信息日志中没有消息的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL 着色器编译但窗口中未出现渲染

GLSL 着色器未编译,没有错误消息

OpenGL 着色器无法编译但没有给出错误信息

如何在 C++ 中获取像素着色器版本和顶点着色器版本

OpenGL着色器版本编译错误

带有顶点/片段着色器的光。使用不同的变量。 (openGL)