gpt4 book ai didi

opengl - 如何使用纹理缓冲区读取单个整数而不是 vec4

转载 作者:行者123 更新时间:2023-12-04 11:39:11 30 4
gpt4 key购买 nike

我有一个工作代码,我正在从纹理缓冲区读取着色器中的 vec4 值。

在客户端,我创建了一个位移向量缓冲区:

vec4 vector1 : vec4(x1, y1, z1, w1);
vec4 vector2 : vec4(x2, y2, z2, w2);
vec4 vector3 : vec4(x3, y3, z3, w3);
..

然后我创建一个顶点缓冲区,其中包含vector1、vector2、vector3 ....

接下来,我创建一个纹理并将上面的缓冲区绑定(bind)到它使用:
glTexBuffer(GL_TEXTURE_BUFFER, GL_RGBA32F, bufferID);

我选择 GL_RGBA32F 是因为 x1、y1、z1、w1 等都是浮点数。

在着色器中,我可以使用以下方法获取单个向量:
vec4 vector1 = texelFetch(samplerObj, 0);
vec4 vector2 = texelFetch(samplerObj, 1);
.
.

但是,现在假设我的位移向量不是 vec4,而是一个整数。
IE
int vector1 = x1; //(int is 32 bit unsigned)
int vector2 = x2; //(int is 32 bit unsigned)

有人可以告诉相应的 internalFormat 是什么吗?
是吗
glTexBuffer(GL_TEXTURE_BUFFER, GL_R32UI, bufferID);

我将如何在着色器中使用 texelFetch 获取值?
是吗
int vector1 = texelFetch(samplerObj, 0);

或者
int vector1 = texelFetch(samplerObj, 0).r ?

我很困惑,因为 texelFetch 应该返回一个有 4 个组件的 texel,所以我必须使用结果的红色组件吗?

最佳答案

您已经提到了无符号整数的正确大小的内部格式:R32UI . 中列举了允许的格式。表 8.15 , 发现于 第 8.9 节 OpenGL 4.4 核心配置文件规范。请注意,使用 texelFetch 时缓冲存储的内容不会被规范化。在具有上述内部格式的缓冲区纹理上!这意味着,在进行查找时,您不会得到 [0, 1] 范围内的值,而是 [0, 2^(n-1)] 范围内的值。

而不是 samplerBuffer您还需要一个 usamplerBuffer .

如果你做 texelFetchsamplerBuffer内部格式为 R32UI ,如前所述,将返回一个 uvec4,其中返回的组件将包含以下值:uvec4(R, 0, 0, 1) .

int vector1 = texelFetch(samplerObj, 0);

这将导致编译时错误,因为没有来自 uvec4 的隐式转换。至 int .
int vector1 = texelFetch(samplerObj, 0).r;

此 swizzle-mask 将返回 texelFetch 返回的 uvec4 的 R 分量并从 uint 进行隐式转换至 int .从语义上讲,将标量值命名为向量也没有意义。 ;)

你真正想要的是
uint displacement = texelFetch(samplerObj, 0).r;

在哪里 samplerObjusamplerBuffer .

编辑 : 澄清一下, texelFetch将始终返回 gvec4 - 其中 g 将简单地为空(定点和浮点格式)、i 或 u。向量的填充方式取决于缓冲区纹理的内部格式。如果你选择 R32F,你会得到一个非归一化的 vec4(R, 0, 0, 1),对于 RGBA16,你会得到一个归一化的 vec4(R, G, B, A)。

为避免进一步混淆:使用单分量格式时,不要为 4 分量向量分配内存!它们都只是在查找时扩展为 gvec4 !

关于opengl - 如何使用纹理缓冲区读取单个整数而不是 vec4,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18651744/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com