glsl - GLSL ES 中的统一与属性

标签 glsl fragment-shader opengl-es-1.1

我有一些参数从 CPU 传递到 GPU,这些参数对于所有片段都是恒定的,但在每一帧上都会发生变化(我使用的是 GLSL ES 1.1)。对于这些值,我应该使用制服还是属性?属性可能因顶点而异,所以我的直觉是,将属性用于在整个框架中保持不变的值将是低效的。但是,我读过制服适用于“相对不经常”更改的值,这表明在每一帧上更改制服可能效率低下。

在硬件方面,我最感兴趣的是针对 iPhone 4S 进行优化。

最佳答案

我投票给制服。

您的问题中已经解释了原因之一:制服是每个顶点/片段的常量。

更喜欢制服而不是属性的其他原因是:

  • 可用插槽的数量(允许有 16 个属性,但有更多制服)
  • GLSL 编译器可以优化统一值处理
  • 长顶点数组上的数据流越少,每个顶点的属性越少意味着更好的性能。
  • 统一在片段着色器中可用,无需在顶点着色器和片段着色器之间定义不同的属性
  • 制服可以是结构和数组,从而使代码更具可读性。
  • 关于glsl - GLSL ES 中的统一与属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11158223/

    相关文章:

    java - GLSL - 仅对一种纹理产生效果

    opengl - 使用顶点着色器计算球体的边界四边形

    javascript - 编写 Atom 编辑器插件,动画语法着色

    android - 某些手机​​上未加载纹理

    android - 安卓 : Q texture coordinate not having any effect 上的 OpenGL ES 1.1

    opengl - 如何在OpenGL中归一化纹理空间的图像坐标?

    glsl - 使用 Vulkan 在片段着色器中缓慢获取纹理

    image-processing - 使用查找表的 OpenGL 图像变形

    glsl - 着色器帧缓冲区回读