在 OpenGL ES 3.0 中,我们在顶点着色器和片段着色器中都有最少数量的统一向量可用:
const mediump int gl_MaxVertexUniformVectors = 256;
const mediump int gl_MaxFragmentUniformVectors = 224;
如果我们有一个在顶点着色器和片段着色器中定义相同的统一体,它在编译程序中是否只存在一次,如果存在,它的存储空间从哪些限制中取反?
ES 3.0 规范。不必要地使统一存储的讨论复杂化(因此,我引用了 2.0 规范)。简而言之,此限制是指单个阶段保留的均匀空间量。一个 GLSL 程序总共可以存储超过 256 个统一位置,但不需要单个阶段能够一次使用超过 256 个。
顶点着色器访问的统一变量的可用存储量由依赖于实现的常量MAX_VERTEX_UNIFORM_VECTORS 指定。该值表示可以保存在统一变量存储中的顶点着色器的四元素浮点、整数或布尔向量的数量。如果尝试使用超过顶点着色器统一变量的可用空间,将生成链接错误。
尽管它是高度特定于实现的,但您可以将制服集视为整体程序存储,然后在每个阶段内,必须将这些制服分配给 GPU 寄存器文件中的一组有限寄存器,然后才能使用它们。这是在编译/链接时静态建立活动与非活动统一体的一件好事,它可以显着降低具有非活动代码路径的链接程序的每个阶段的存储需求。
顺便说一句,如果这是适用于所有阶段的限制,按照正常的 GL 命名法,该限制很可能被命名为:..._MAX_COMBINED_...
并且不包括特定阶段的名称。
仅仅通过它们是不同的数字这一事实告诉我两件事:
1)如果它们是共享的,那么你就不能有 256 个顶点向量和 224 个片段向量(总共 480 个向量)。这显然是一个有效的配置。2)如果它们是共享的,我希望它们具有相同的最大值,或者就此而言,为顶点和片段着色器设置单独的最大值是没有意义的。
我知道这不是官方答案,如果你能找到它,一定要发布一个。玩三角形玩得最好!:)