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

vik*_*eid 7 opengl texture2d

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

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

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

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

接下来,我创建一个纹理并使用以下方法将上面的缓冲区绑定到它:

glTexBuffer(GL_TEXTURE_BUFFER, GL_RGBA32F, bufferID);
Run Code Online (Sandbox Code Playgroud)

我之所以选择GL_RGBA32F,是因为x1,y1,z1,w1等都是浮点数.

在着色器中我可以使用以下方法获取单个向量:

vec4 vector1 = texelFetch(samplerObj, 0);
vec4 vector2 = texelFetch(samplerObj, 1);
.
.
Run Code Online (Sandbox Code Playgroud)

但是,现在假设我的位移矢量不是vec4,而是一个整数.即

int vector1 = x1; //(int is 32 bit unsigned)
int vector2 = x2; //(int is 32 bit unsigned)
Run Code Online (Sandbox Code Playgroud)

有人可以告诉相应的internalFormat会是什么?是吗

glTexBuffer(GL_TEXTURE_BUFFER, GL_R32UI, bufferID);
Run Code Online (Sandbox Code Playgroud)

我还将如何在着色器中使用texelFetch获取值?是吗

int vector1 = texelFetch(samplerObj, 0);
Run Code Online (Sandbox Code Playgroud)

要么

int vector1 = texelFetch(samplerObj, 0).r ?
Run Code Online (Sandbox Code Playgroud)

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

tho*_*kra 8

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

而不是samplerBuffer你也需要一个usamplerBuffer.

如果你做了texelFetch一个samplerBuffer与内部格式R32UI,如在上述表中指定,将返回在组件返回将包含以下值的uvec4: uvec4(R, 0, 0, 1).

int vector1 = texelFetch(samplerObj, 0);
Run Code Online (Sandbox Code Playgroud)

这将导致一个编译时错误,因为从没有隐式转换uvec4int.

int vector1 = texelFetch(samplerObj, 0).r;
Run Code Online (Sandbox Code Playgroud)

这种拌和掩模将返回所返回的uvec4的R分量texelFetch和从做的隐式转换uintint.从语义上讲,将标量值命名为向量也没有意义.;)

你真正想要的是什么

uint displacement = texelFetch(samplerObj, 0).r;
Run Code Online (Sandbox Code Playgroud)

这里samplerObj是一个usamplerBuffer.

编辑:只是为了澄清,texelFetch将永远返回一个gvec4 - 其中g将只是空(固定和浮点格式),.填充向量的方式取决于缓冲区纹理的内部格式.如果您选择R32F,您将得到一个非标准化的vec4(R,0,0,1),对于RGBA16,您将获得一个标准化的vec4(R,G,B,A).

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