部分iOS硬件上GLSL程序间歇性失败



我遇到了一个问题,其中更改片段着色器暂时打破渲染。着色器编译;编译步骤、链接步骤或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);
}

至少部分地回答了我自己的问题。我的第一个错误是我的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都是好的,并且两个日志都是静默的,显然也可能出现编译失败。

多亏了这个问题的线索,我开始关注不匹配的精度限定符,并将所有中间颜色更改为高颜色解决了这个问题。这是因为我声明了我的制服是高跟的,然后在高跟和中档vec3之间混合()吗?(我缩短了问题中的代码,以显示相关部分。)

这对我来说是有意义的,这可能会意外地在较新的硬件上工作,因为我想我记得在某个地方读到过支持gles -3的硬件将high和mediump视为相同的位深度。

最新更新