GLSL ES 3.0 - 顶点和片段着色器均匀,以及最大顶点/片段均匀向量

时间:2013-12-12 01:53:58

标签: android opengl-es glsl glsles

在OpenGL ES 3.0中,我们在顶点和片段着色器中都有最小数量的均匀矢量:

const mediump int gl_MaxVertexUniformVectors = 256;
const mediump int gl_MaxFragmentUniformVectors = 224;

如果我们在顶点和片段着色器中都定义了相同的制服,它在编译的程序中是否只存在一次,如果是这样,那么它的存储空间中的哪一个会被否定?

2 个答案:

答案 0 :(得分:2)

ES 3.0规范。不必要地使统一存储的讨论变得复杂(因此,我引用了2.0规范)。简而言之,此限制是指 个别阶段 保留的统一空间量。 GLSL程序可以存储超过256个统一位置,但不需要单个阶段一次使用超过256个。

OpenGL ES 2.0 Specification - 2.10 顶点着色器(统一变量) - 第35页

  

顶点着色器访问的统一变量可用的存储量由依赖于实现的常量 MAX_VERTEX_UNIFORM_VECTORS 指定。此值表示可以保存在顶点着色器的统一变量存储中的四元素浮点数,整数或布尔矢量的数量。如果尝试使用的空间超过顶点着色器统一变量的可用空间,则会生成链接错误。

虽然它是高度特定的实现,但您可以将制服集合视为整体程序存储,然后在每个阶段内,必须将这些制服分配给GPU的寄存器文件中的一组有限的寄存器,然后才能使用它们。在编译/链接时静态建立活动与非活动制服是一件好事,它可以显着降低具有非活动代码路径的链接程序的每个阶段的存储要求。

顺便说一下,如果这是适用于所有阶段的限制,则遵循正常的GL命名法,限制最有可能被命名为:..._MAX_COMBINED_...并且不包括特定阶段的名称。

答案 1 :(得分:1)

仅仅因为他们是不同的数字告诉我两件事:

1)如果它们是共享的,那么你就不能拥有256个顶点向量和224个片段向量(总共480个向量)。这显然是一个有效的配置。 2)如果它们被共享,我希望它们具有相同的最大值,或者就此而言,为顶点和片段着色器设置单独的最大值是没有意义的。

我知道这不是正式的答案,如果你能找到它,一定要张贴一个。所有最好的三角形玩! :)