我想将数据从几何着色器转换到反馈缓冲区,所以我设置了如下变量的名称:
char *Varying[] = {"lColor","lPos","gl_NextBuffer","rColor","rPos"};
然后将两个缓冲区vbos[2]
绑定到transformFeedback对象Tfb
,vbos[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;
};
所以我以为lColor
和lPos
被转换成vbos[0]
,rColor
和rPos
被转换成了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开始。它将lColor
和lPos
分配给缓冲区索引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;
};