5

我遇到了另一个 OpenGL ES 驱动程序错误。这次我试图编译以下几行:

precision mediump float; 
varying highp vec2 textureCoordinate; 


void main() { 
 highp vec4 color = texture2D(input0, textureCoordinate); 


vec3 color3 = color.rgb;

vec2 tc = (2.0 * textureCoordinate) - 1.0;
float d = dot(tc, tc);
vec2 lookup = vec2(d, color3.r);

..   
..
}

但我正在追赶这条线:

GLES20.glLinkProgram(program);

本机崩溃:“致命信号 11(SIGDEV)在 0x00000060(代码 = 1),线程 1231”我猜这是因为 LG nexus 4 使用 GPU Adreno,并且它也为我崩溃,错误代码为 14 在不同的崩溃- 使用太多宏。

4

2 回答 2

2

编译着色器后,使用glGetShaderiv获取着色器编译的状态。喜欢:

GLint compiled;
glGetShaderiv(index, GL_COMPILE_STATUS, &compiled);  //index is the shader value

然后,如果compiled返回为零,则先获取info长度,再获取错误信息如下:

GLint infoLen = 0;
glGetShaderiv(index, GL_INFO_LOG_LENGTH, &infoLen);

if(infoLen > 1)
{
    char* infoLog = new char(infoLen);
    glGetShaderInfoLog(index, infoLen, NULL, infoLog);
}

最后检查infoLog以查看着色器编译返回的错误消息。您原始帖子中的分段错误消息没有提供任何有用的解决问题的方法。

于 2013-10-07T11:20:40.140 回答
1

据我从片段着色器中的简短代码摘录中可以看出,您没有指定float精度。在 ES 2.0 中,您必须明确指定float精度。

precision mediump float;

请阅读规范,第 1 页中的相关内容。4.5.3 默认精度限定符。在某些 OpenGL ES 驱动程序上,着色器可能会在没有指定float精度的情况下工作,并且可能无法在其他驱动程序上编译。

但是,需要完整的源代码才能找出问题的确切原因。

我建议您开始注释掉部分着色器代码,直到它开始正确编译。这样,您将缩小有问题的范围(我相信比在 SO 上等待答案还要快)。

于 2013-10-07T06:32:40.387 回答