我在片段着色器中有大量变量(30个制服(主要是vec4),大约20个变量(vec3,float,vec4))。它在iPhone5S上运行得很好,但我在iPhone4上遇到了严重的问题。 GPU时间为1秒/帧,98%的时间是着色器运行时间。
根据Apple API
OpenGL ES限制了您可以在a中使用的每种变量类型的数量 顶点或片段着色器。 OpenGL ES规范不需要 实现在这些限制时提供软件回退 超标;相反,着色器无法编译或链接。什么时候 开发您的应用程序时,您必须确保着色器期间不会发生错误 编译,如清单10-1所示。
但是从此我完全不明白。他们是否提供SW后备?因为我在编辑或链接着色器时没有错误,但性能很差。我已经评论了几乎所有的东西,只留下2个纹理查找和定向光计算。我改变了其他函数只返回vec4(0,0,0,0)。
答案 0 :(得分:1)
制服的限制远高于此。 GLSL ES(2.0)要求每个顶点着色器使用512个标量均匀分量(尽管ES根据向量数量描述了这个 - 128)。假设你的所有30件制服都是vec4
,你仍然有足够的存储空间可以容纳98件。
相关限制为gl_MaxVertexUniformVectors
和gl_MaxFragmentUniformVectors
。实现只需要在片段着色器中支持16,但大多数将远远超过最小值 - 自己检查值。查询GL ES的限制,而不是尝试使用一些Frankenstein着色器代码在GLSL程序中找出它们;)
OpenGL ES 2.0 Shading Language - 附录A:限制 - 第113页
const mediump int gl_MaxVertexAttribs = 8; const mediump int gl_MaxVertexUniformVectors = 128; const mediump int gl_MaxVaryingVectors = 8; const mediump int gl_MaxVertexTextureImageUnits = 0; const mediump int gl_MaxCombinedTextureImageUnits = 8; const mediump int gl_MaxTextureImageUnits = 8; const mediump int gl_MaxFragmentUniformVectors = 16; const mediump int gl_MaxDrawBuffers = 1;
事实上,查询所有GLSL程序/着色器限制是个好主意,只是为了更好地了解您需要为目标软件/硬件工作的约束。最好提前计划,而不是等到解决这些问题,直到程序爆炸为止。
至于软件后备,我对此表示怀疑。这是一个嵌入式环境,没有太多需要这样的东西。在PC / Mac上开发实际软件时,它们通常附带参考软件实现,主要用于 测试 目的。单个组件有时可能会回退到软件以克服硬件限制,但这是必要的,因为仅Apple的Mac系列中就有各种各样的硬件。但是当您编写专门针对单个硬件规范编写的应用程序时,如果您尝试执行超出限制的事情(您应该熟悉的话),则通常可以完全失败。