【发布时间】:2021-04-12 09:36:39
【问题描述】:
我想知道是否可以索引一个统一的缓冲区数组,其值包含在我绘制的顶点中,例如:
layout (location = 0) in vec3 position;
layout (location = 1) in flat int idx;
layout(binding = 0, std140) uniform uniformValues
{
float values[100];
};
void main()
{
values[idx];
}
我的理解是这是不可能的,因为
'in flat int idx'
很可能不是“动态统一表达式”,并且根据文档不能用于索引统一缓冲区数组:
有些地方 GLSL 要求表达式是动态的 制服。以下所有内容都必须使用动态统一 表达式:
-The index to buffer-backed interface block arrays.
但是,我从same source 中发现了有关如何访问一组持有“无绑定纹理”纹理句柄的采样器的信息,它说(强调我的):
默认块统一变量中使用的采样器和图像类型可以是 从句柄而不是绑定点的索引填充。 这些类型现在也可以作为 Shader Stage 输入/输出传递(在需要时使用平面插值限定符)。 它们可以是 用作顶点属性,,它们被视为 64 位整数 在 OpenGL 方面。而且它们可以用在所有的接口块中 种类;缓冲区支持的接口块将它们视为 64 位整数。
我相信,不是这样做:
layout (location = 0) in flat int textureBinding;
layout (binding = 0) uniform sampler2D textures[16];
void main()
{
textures[textureBinding];
}
你这样做:
layout (location = 0) in flat int bindlessTextureHandle;
layout (binding = 0) uniform textureBuffer
{
sampler2D textures[200];
}
void main()
{
textures[bindlessTextureHandle];
}
'bindlessTextureHandle' 不是'动态统一表达式',它如何用于索引统一缓冲区?
以下所有内容都必须使用动态统一表达式:
-The index to buffer-backed interface block arrays.
那么为什么说你可以使用来自顶点输入的值索引到各种“接口块”?
你也可以索引到:
'uniform sampler2D[16] textures;'
使用“非动态统一表达式”?
【问题讨论】:
-
“你也可以用'非动态统一表达式'来索引
uniform sampler2D[16] textures;吗?”不可以。见In a fragment shader, why can't I use a flat input integer to index a uniform array of sampler2D?