opengl - GLSL 片段着色器平面被视为动态统一表达式?

标签 opengl glsl

this OpenGL forum post据说:

In GLSL 4.x, arrays of samplers may only be indexed with dynamically-uniform expressions (in a vertex shader the expression may only involve uniform variables, in a fragment shader it may only involve uniform variables and flat-qualified inputs).



我试图在 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);
    // ...
}

这是定义的行为,因为它具有 预选赛?或没有?

最佳答案

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

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

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

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

An invocation group is the complete set of invocations collectively processing a particular compute workgroup or graphical operation, where the scope of a "graphical operation" is implementation dependent, but at least as large as a single triangle or patch, and at most as large as a single rendering command, as defined by the client API.



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

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

For graphics shaders, an invocation group is an implementation-dependent subset of the set of shader invocations of a given shader stage which are produced by a single drawing command.



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

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

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

相关文章:

java - 使用 LWJGL 创建隐藏 Canvas

opengl - 分析图形着色器

opengl-es-2.0 - opengl纹理映射偏离5-8像素

glsl - GLSL 制服的尺码?

opengl - glsl 片段着色器渲染对象ID

c++ - 编写支持 OpenGL 的 GUI

c++ - 是否可以在片段着色器中写入特定的 mipmap 级别?

c++ - 如何在 openGL 中获取同质屏幕空间坐标

c++ - 如何在 OpenGL 中使用 vector 和结构上传顶点数据?

c++ - 从顶点着色器中修改着色器存储缓冲区对象