glGetShaderiv返回大于1的值

时间:2011-11-18 12:00:38

标签: opengl-es-2.0

我正在尝试在OpenGLES 2.0中编译我的着色器:

/* Try compiling the shader. */
GL_CHECK(glCompileShader(*pShader));
GL_CHECK(glGetShaderiv(*pShader, GL_COMPILE_STATUS, &iStatus));

glGetShaderiv返回大于1的iStatus,当我尝试获取日志信息时,我得到空字符串:

if (iStatus > 1)
{
    GLsizei slen = 0;
    GLchar* compiler_log = (GLchar*)malloc(iStatus);
    glGetShaderInfoLog(*pShader, iStatus, &slen, compiler_log);
    cout <<"compiler_log:\n"<<compiler_log<<endl;
    free (compiler_log);
}

着色器:

attribute vec4 av4position;
attribute vec3 av3colour;
attribute vec2 av2texture;

uniform mat4 mvp;

varying vec3 vv3colour;
varying vec2 vv2texture;

void main() 
{
  // Pass the texture coordinate attribute to a varying.
  vv2texture = av2texture;
  // Pass the color value to a varying.
  vv3colour = av3colour;
  gl_Position = mvp * av4position;
}

有人知道为什么吗?

3 个答案:

答案 0 :(得分:1)

GL_COMPILE_STATUS返回的值与信息日志的长度不同。它只是一个指示器,如果着色器是否成功编译,所以它实际上应该是GL_TRUEGL_FALSE。但我猜一个值&gt; 1可以算作成功(因为你的着色器也看起来完全合理),所以无论如何都不需要获取信息日志,如果编译成功,这可能只是一个空字符串。

要获取信息日志的长度,请致电

glGetShaderiv(*pShader, GL_INFO_LOG_LENGTH, &iLength)

并使用此值分配和查询信息日志。因此,您的代码应该类似于:

if (iStatus == GL_FALSE)
{
    GLsizei iLength, slen = 0;
    glGetShaderiv(*pShader, GL_INFO_LOG_LENGTH, &iLength);
    GLchar* compiler_log = new GLchar[iLength];
    glGetShaderInfoLog(*pShader, iLength, &slen, compiler_log);
    cout << "compiler_log:\n" << compiler_log << endl;
    delete[] compiler_log;
}

答案 1 :(得分:1)

glGetShaderiv没有返回大于1的值,它没有返回任何内容(变量未初始化)。

它没有返回任何内容的原因是没有安装包:

libglapi台面 填实libgl1台面-GLX 的libgl1-台面DRI

在Ubuntu 11.04上不可用,仅在Ubuntu 11.10上可用。所以我无法找到11.04的解决方案,我刚刚升级到11.10。

答案 2 :(得分:0)

根据文档,如果生成错误,则不会更改参数的值(glGetShaderiv的最后一个参数)。

为了更好地调试问题,请在着色器编译之前使用glGetError()。