【问题标题】:GLSL program fails intermittently on some iOS hardwareGLSL 程序在某些 iOS 硬件上间歇性失败
【发布时间】:2023-03-08 09:10:01
【问题描述】:

我遇到了一个问题,片段着色器的更改会暂时中断渲染。着色器编译;编译步骤、链接步骤或 glValidateProgram() 没有错误条件或日志输出。但随后对 glDrawArrays() 的调用返回 GL_INVALID_OPERATION,没有绘制任何内容,并且应用程序变得非常缓慢或无响应。

但是,当我从主要开发设备(iPad 2)切换到其他硬件(iPhone 5s 和 iPad Mini)时,相同的代码运行良好。奇怪的是,如果我随后重新连接到 iPad 2,问题就消失了,我可以继续在该设备上开发着色器。同样的循环现在已经重复了好几次:我修改并向着色器添加了一些新代码,问题又出现了。我切换到较新的设备,代码运行良好,切换回 iPad 2,问题神秘地消失了(有时),我可以继续工作。一旦它再次开始工作,它似乎会继续工作。但是,使用下面的代码,我现在似乎陷入了解决方法无济于事的地步。

我的预感(或希望)是我的代码中的某些内容正在通过编译器,但在某种程度上有些冒险,某些硬件接受它(A7 和 SGX 543)但有些不接受(SGX 535)。也许解决方法的间歇性只是一个红鲱鱼。如果没有这样的问题,我欢迎任何其他故障排除建议。

代码很长,所以我摘录了与这个问题的最新迭代相关的部分。以前的迭代只涉及添加几行看似无害的代码。

uniform highp vec3  vertexColors[3];

mediump vec3 hexagonLayer (highp float edge1, highp float edge2, int layer, mediump vec3 underColor, highp float opacity) {
    highp float opac = remap (length (faceP - vertexFacePositions[layer]), 0.0, edge1 * 3.0, 1.0, opacity);

    mediump vec3 shadowColor = pow (underColor, vec3 (2.0));
    highp float shadowOpacity = (1.0 - smoothstep (edge1, edge1 + SHADOW_WIDTH, 1.0 - trilinears[layer])) * SHADOW_OPACITY * opac;
    mediump vec3 color = mix (underColor, shadowColor, shadowOpacity);

    return mix (color, vertexColors[layer], (1.0 - smoothstep (edge1, edge2, 1.0 - trilinears[layer])) * opac);
}

【问题讨论】:

  • 您可能已经考虑过这一点,但间歇性的性质让我想知道这是否是您的目标 C 代码中的内存问题,可能是顶点缓冲区。您可以尝试在模拟器上运行应用程序并启用“Enable Guard Malloc”。

标签: ios ipad opengl-es-2.0 glsles


【解决方案1】:

至少部分回答我自己的问题。我的第一个错误是我的 glValidateProgram() 代码从未被调用过。事实证明我毕竟收到了一条错误消息,尽管没有帮助:

Validation Failed: Fragment program failed to compile with current context state.
Validation Failed: Vertex program failed to compile with current context state.

所以第一课是,即使 GL_COMPILE_STATUS 和 GL_LINK_STATUS 都很好,而且两个日志都是静默的,也可能会出现编译失败。

感谢this question 提供的线索,我开始查看不匹配的精度限定符,果然将我所有的 mediump 颜色更改为 highp 解决了这个问题。那是因为我将我的制服声明为 highp,然后在 highp 和 mediump vec3 之间进行 mix() 吗? (我缩短了问题中的代码以显示相关部分。)

这对我来说是有道理的,这可能会意外地在较新的硬件上起作用,因为我记得在某处读到支持 GLES-3 的硬件将 highp 和 mediump 视为相同的位深度。我很想确认一下这个猜测。

【讨论】:

  • 岁差提示往往是罪魁祸首。
猜你喜欢
  • 2019-04-18
  • 2011-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-19
  • 1970-01-01
  • 2023-04-02
相关资源
最近更新 更多