【问题标题】:OpenGL ES - iPhone4 - fragment shader variables countOpenGL ES - iPhone4 - 片段着色器变量计数
【发布时间】:2014-05-07 09:34:35
【问题描述】:

我在片段着色器中有大量变量(30 个制服(主要是 vec4),大约 20 个变量(着色器中的 vec3、float、vec4))。它在 iPhone5S 上运行得很好,但在 iPhone4 上我遇到了严重的问题。 GPU时间为1s/帧,98%的时间是着色器运行时间。

根据苹果API

OpenGL ES 限制了你可以在一个 顶点或片段着色器。 OpenGL ES 规范不需要 实现以在这些限制时提供软件回退 超过;相反,着色器根本无法编译或链接。什么时候 开发您的应用程序,您必须确保在着色器期间不会发生错误 编译,如示例 10-1 所示。

但是从这里我很不明白。他们是否提供软件后备?因为我在编译或链接着色器期间没有错误,但性能很差。我已经评论了几乎所有内容,只留下 2 个纹理查找和定向光计算。我更改了其他函数以仅返回 vec4(0,0,0,0)。

【问题讨论】:

    标签: ios iphone opengl-es glsl


    【解决方案1】:

    对制服的限制远高于此。 GLSL ES (2.0) 要求每个顶点着色器有 512 个标量统一组件(尽管 ES 用向量的数量来描述这一点 - 128)。假设您的所有 30 件制服都是 vec4,那么您仍有足够的存储空间再容纳 98 件。

    相关限制为gl_MaxVertexUniformVectorsgl_MaxFragmentUniformVectors。实现只需要在片段着色器中支持 16,但大多数会远远超过最小值 - 自己检查值。从 GL ES 查询限制,而不是尝试在您的 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 上开发实际软件时,它们通常附带参考软件实现,主要用于测试目的。个别组件有时可能会回退到软件来克服硬件限制,但这是必要的,因为仅苹果 Mac 系列中的硬件种类繁多。但是,当您编写专门为单一硬件规格编写的应用程序时,如果您尝试做超出限制(您应该熟悉)的事情,通常可以接受完全失败。

    【讨论】:

    • 顺便说一下,GLSL 程序中的文字常量也可以计入统一限制。我知道这听起来有点奇怪,但如果 GL 将制服称为与 Direct3D 相同的东西(常量缓冲区),它可能会更有意义。任何常量的变量基本上都是统一的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-09
    • 2017-11-12
    • 1970-01-01
    • 2019-01-09
    • 1970-01-01
    相关资源
    最近更新 更多