【问题标题】:OpenGL crashes when linking program, LG Nexus 4链接程序时 OpenGL 崩溃,LG Nexus 4
【发布时间】:2013-10-06 18:23:25
【问题描述】:

我遇到了另一个 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 - 使用了太多的宏。

【问题讨论】:

  • 如果我们正在寻找您的着色器代码中的错误,您应该包含完整着色器代码。这缺少所有变量声明,我假设您最后遗漏了一些东西。一些应用程序代码也可能会有所帮助。
  • 可能您的着色器代码未编译,因此您的程序无法链接。顺便说一句,OpenGL ES 没有着色器,所以在这里添加 OpenGL ES 标记是无关紧要的。
  • 请提供完整的着色器代码。
  • 您的顶点着色器中有运算符for 吗?
  • 不,我没有任何东西,我所做的是调查 Adreno 功能。结果是它在将 GLSL 代码编译成 GPU 指令代码时出现了一些严重的错误。不幸的是,我们刚刚对使用 Adreno GPU 的设备禁用了一些过滤器。

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


【解决方案1】:

编译着色器后,使用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 以查看着色器编译返回的错误消息。您原始帖子中的分段错误消息没有提供任何有用的信息来解决问题。

【讨论】:

  • 我无法进行此检查,因为我在链接程序时遇到了本机崩溃。我确实将这些信息用于其他一些非原生的链接问题
  • 你应该在链接程序之前编译你的着色器,这样你应该能够得到信息。您可以在 Android 日志上打印信息。
【解决方案2】:

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

precision mediump float;

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

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

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

【讨论】:

  • 嗨,我在上面添加了精确线。这不是问题
  • 保持冷静,逐行注释,直到找到原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-04
相关资源
最近更新 更多