我正在尝试在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;
}
有人知道为什么吗?
答案 0 :(得分:1)
GL_COMPILE_STATUS
返回的值与信息日志的长度不同。它只是一个指示器,如果着色器是否成功编译,所以它实际上应该是GL_TRUE
或GL_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()。