GLSL ES 3.0-在顶点和片段着色器以及最大顶点/片段统一向量中都是统一的



在OpenGL ES 3.0中,顶点着色器和片段着色器中可用的统一向量数量最少:

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

如果我们有一个在顶点着色器和片段着色器中定义相同的统一,它在编译的程序中只存在一次吗?如果存在,它的存储空间会从这些限制中的哪一个否定?

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

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

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

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

顺便说一句,如果这是一个适用于所有阶段的限制,按照德国劳埃德船级社的正常命名法,该限制很可能被命名为:..._MAX_COMBINED_...,并且不包括特定阶段的名称。

简单地说,它们是不同的数字,告诉我两件事:

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

我知道这不是一个官方答案,如果你能找到的话,一定要发布一个。玩三角形最好!:)

相关内容

最新更新