this OpenGL forum post 中说:



我试图在 GLSL 规范中寻找它,但找不到它。如果它不起作用,我会有点紧张尝试花时间更改代码。我最大的担心是,如果我这样做了,它似乎可以在我的计算机上运行,​​但我在不知道的情况下调用了未定义的行为(这可能会在某个时候在某个地方糟糕地结束)。

我想做的一个例子(我没有运行这个,它是一个例子,应该被视为伪代码):

// Fragment shader

in vec3 uv;
flat in uint index;  // Assume in the range of 0 to 3 inclusive

uniform sampler3D textureSampler[4];

void main() {
    someColor = texture(textureSampler[index], uv);
    // ...
}

这是定义的行为,因为它具有 flat 限定符?或没有?

最佳答案

这是一个非常复杂的问题,实际上它的规范语言发生了变化(感谢 Vulkan 实际上澄清了很多这些问题,语言措辞被复制回 OpenGL)。事实上,在 OpenGL 错误数据库中,有几个关于这个主题的突出问题。

但简而言之,不: flat 限定的变量不是动态统一的。或者更具体地说,它们通常不是动态统一的。

关于动态统一表达式要记住的一点是,表达式的值对于“调用组”内的不同调用是否不同(解释如下)。如果所有调用的值都相同,则它是动态统一的。

“调用组”在 GLSL 4.60 中定义为:



不幸的是,这种“客户端 API”语言是从 SPIR-V 规范中逐字复制而来的。本例中的客户端 API 是 OpenGL,但 OpenGL 规范实际上并未定义调用组的大小。

current OpenGL issue tracking this omission 告诉我们 ARB 的意图是 OpenGL 定义或多或少匹配 Vulkan 定义。 Vulkan 的定义是:



所以一个调用组比单个原语大。因此,只有当您碰巧将相同的值传递给绘图命令中的每个图元时, flat 限定的变量才会是动态统一的。

所以你不能假设一个 flat 限定的变量是动态统一的,因为它是 flat 限定的。您可以假设 uniformconst 限定全局变量,或来自类似数据。但是除非您已经做了一些事情来确保渲染命令中的每个调用都获得相同的 flat 值,否则您不能在需要动态统一表达式的地方使用它。

关于opengl - GLSL 片段着色器平面被视为动态统一表达式?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48757056/

10-10 08:07