链接程序LG Nexus 4时OpenGL崩溃

时间:2013-10-06 18:23:26

标签: android opengl-es opengl-es-2.0 shader fragment-shader

我有另一个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而崩溃 - 使用太多宏。

2 个答案:

答案 0 :(得分:2)

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

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

然后,如果编译返回为零,则首先获取信息长度,然后输出错误消息,如下所示:

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

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

最后检查infoLog以查看着色器编译返回的错误消息。原始帖子中的分段错误消息对解决问题没有任何帮助。

答案 1 :(得分:1)

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

precision mediump float;

请阅读此in specs,p。 4.5.3默认精度限定符。 着色器可以在某些OpenGL ES驱动程序上没有指定float精度的情况下工作,并且可能无法在其他OpenGL ES驱动程序上编译。

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

我建议你开始评论着色器代码的一部分,直到它开始正确编译。通过这种方式,您可以缩小有问题的界限(我相信甚至比等待SO的答案更快)。