glBindBufferBase()中的索引和OpenGL中几何着色器中的流号之间有什么关系



我想将数据从几何着色器转换到反馈缓冲区,所以我设置了如下变量的名称:

char *Varying[] = {"lColor","lPos","gl_NextBuffer","rColor","rPos"};

然后将两个缓冲区vbos[2]绑定到transformFeedback对象Tfbvbos[0]绑定点0,vbos[1]绑定点2:

glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, vbos[0]);
glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 2, vbos[1]);

并设置流编号如下:

layout(stream=0) out vec4 lColor;
layout(stream=0) out vec4 lPos;
layout(stream = 2) out rVert
{
vec4 rColor;
vec4 rPos;
};

所以我以为lColorlPos被转换成vbos[0]rColorrPos被转换成了vbos[1],但没有结果,除非我把vbos[1]改为绑定点1,把rvert的流号改为1。

我认为绑定几何着色器输出和反馈缓冲区的索引有三个变量,第一是glBindBufferBase(target,index,id)中的index,第二是glTransformFeedbackVaryings(program,count,names,buffermode)中的名称序列,第三是几何着色器中变量的流数,这三个参数之间的关系是什么?我发现无论我设置什么参数的glDrawTransformFeedbackStream,图片都没有改变,为什么?

几何着色器布局限定符stream与TF缓冲区绑定索引分配没有直接关系。这里有一个警告:来自两个不同流的变量不能分配给同一个缓冲区绑定索引。但除此之外,两人没有任何关系。

在几何体着色器变换反馈中,流是彼此独立编写的。当您输出一个顶点/基元时,您会说出GS调用正在写入哪个流。只写入分配给该流的输出变量,系统会跟踪每个流中写入了多少内容。

但是输出变量如何映射到反馈缓冲区是完全独立的(除了前面提到的警告(。

在您的示例中,glTransformFeedbackVaryings{"lColor","lPos","gl_NextBuffer","rColor","rPos"}执行以下操作。它从缓冲区索引0开始。它将lColorlPos分配给缓冲区索引0。CCD_ 22使得系统增加当前缓冲器索引的值。这个值是0,所以递增它就会变成1。然后,它将CCD_ 23和CCD_ 24分配给缓冲器1。

这就是为什么你的代码不起作用。

您可以跳过TF缓冲区绑定中的缓冲区索引。要做到这一点,您必须使用gl_NextBuffer两次,因为每次使用都会增加当前缓冲区索引。

或者,如果您的GL版本足够高,您可以直接在着色器中指定缓冲区绑定和偏移:

layout(stream=0, xfb_offset = 0, xfb_buffer = 0) out vec4 lColor;
layout(stream=0, xfb_offset = 16, xfb_buffer = 0) out vec4 lPos;
layout(stream = 2, xfb_offset = 0, xfb_buffer = 2) out rVert
{
vec4 rColor;
vec4 rPos;
};

最新更新