OpenGL ES - iPhone4 - 片段着色器变量计数

时间:2014-05-07 09:34:36

标签: ios iphone opengl-es glsl

我在片段着色器中有大量变量(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)。

1 个答案:

答案 0 :(得分:1)

制服的限制远高于此。 GLSL ES(2.0)要求每个顶点着色器使用512个标量均匀分量(尽管ES根据向量数量描述了这个 - 128)。假设你的所有30件制服都是vec4,你仍然有足够的存储空间可以容纳98件。

相关限制为gl_MaxVertexUniformVectorsgl_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系列中就有各种各样的硬件。但是当您编写专门针对单个硬件规范编写的应用程序时,如果您尝试执行超出限制的事情(您应该熟悉的话),则通常可以完全失败。