[英]How to modify specific attribute of a vertex in compute shader
我有一个包含6
值的缓冲区,前三个是位置,其他三个是顶点的颜色。 我想在计算着色器中修改这些值,但只修改位置,而不修改颜色。 我通过使用“图像加载/存储”实现了这一点,但是我使用了所有顶点数据,而不仅是其中一部分(一个属性)。 因此,基本上我不知道如何在计算着色器中仅获取一个属性,然后对其进行修改,然后将其写回到缓冲区中。
这是适用于一个(且仅)属性的代码。
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, NULL);
glEnableVertexAttribArray(0);
glGenTextures(1, &position_tbo);
glBindTexture(GL_TEXTURE_BUFFER, position_tbo);
glTexBuffer(GL_TEXTURE_BUFFER, GL_RGBA32F, position_buffer);
glsl:
layout (local_size_x = 128) in;
layout (rgba32f, binding = 0) uniform imageBuffer position_buffer;
void main(void)
{
vec4 pos = imageLoad(position_buffer, int(gl_GlobalInvocationID.x));
pos.xyz = (translation * vec4(pos.xyz, 1.0)).xyz;
imageStore(position_buffer, int(gl_GlobalInvocationID.x), pos);
}
那么,如何仅将部分顶点数据存储到pos
,而不是将所有属性存储到pos
? 如何在pos
指定什么属性? 并且,如果我imageStore
某些特定的属性imageStore
返回到缓冲区,我确定只有缓冲区的那一部分会被更改(我要修改的属性),而其他属性将保持不变吗?
由glVertexAttribPointer()
类的函数定义的“顶点阵列状态”仅在使用图形管线进行绘制时才有意义。 它定义了从缓冲区元素到输入顶点属性的映射。 它在计算模式下不起作用。
定义顶点缓冲区的布局并据此设置顶点阵列的是您自己。 因此,您必须知道在缓冲区中的哪个位置才能找到哪个属性的哪个组件。 如果不这样做,那么您也将永远无法使用缓冲区绘制任何内容。
我不确定为什么您选择使用图像加载/存储来访问计算着色器中的顶点数据。 我建议将其绑定为着色器存储缓冲区 。 假设您的缓冲区仅包含一堆浮点数,则可能最简单的方法是将其解释为您的计算着色器中的浮点数数组:
layout(std430, binding = 0) buffer VertexBuffer
{
float vertex_data[];
};
然后,您可以像其他任何数组一样,通过普通索引在您的计算着色器中以vertex_data[i]
访问缓冲区中的第i个浮点。
除此之外,我还应该指出,上述代码中的glVertexAttribPointer()
调用仅为包含4个浮点数的一个顶点属性设置了缓冲区,而不是为每个3个浮点数的两个属性设置了缓冲区。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.