-1

使用 GL_SEPARATE_ATTRIBS 而不是像 GL_INTERLEAVED_ATTRIBS 那样只读取一个时,如何回读多个变换反馈缓冲区?在此示例中,我设置了两个缓冲区并将它们设置为转换反馈。

//gen,bind,buffer GL_ARRAY_BUFFER buffer0
//gen,bind,buffer GL_ARRAY_BUFFER buffer1
//gen,bind GL_TRANSFORM_FEEDBACK feedback
glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buffer0);
glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 1, buffer1);

const GLchar* _varyings[] = { "pos", "color" };
glTransformFeedbackVaryings(program, 2, _varyings, GL_SEPARATE_ATTRIBS);
glLinkProgram(program);

//bind VAO and draw with TF enabled
glBeginTransformFeedback(GL_TRIANGLES);
glDrawArrays(GL_TRIANGLES, 0, numberOfVertices);
glEndTransformFeedback();

使用单个缓冲区,GL_INTERLEAVED_ATTRIBS我可以通过调用来读回单个glGetBufferSubData缓冲区GL_TRANSFORM_FEEDBACK_BUFFER

std::vector<float> fb;
fb.resize(3*numberOfVertices);
glGetBufferSubData(GL_TRANSFORM_FEEDBACK_BUFFER, 0, fb.size() * sizeof(float), fb.data());

但是,我如何告诉 OpenGL 我想读回两个缓冲区buffer0并用 ofbuffer1索引?(0,1)glBindBufferBaseGL_TRANSFORM_FEEDBACK_BUFFER

我发现的所有教程总是将其简化为单个缓冲区,GL_INTERLEAVED_ATTRIBS并仅说明可以根据 VAO 输入布局使用单独的缓冲区来匹配 TF 输出,或者根本不读回缓冲区数据。

4

1 回答 1

1

对于特定问题,没有可用的示例,因为使用变换反馈回读多个缓冲区与回读多个缓冲区没有区别。您绑定缓冲区 - 您读取它。变换反馈对象和它的缓冲区只告诉 OpenGL 它应该如何存储捕获的输出。

std::vector<float> _bufferfeedback0;
_bufferfeedback0.resize(3*numberOfVertices);//e.g. x,y,z per vertex
glBindBuffer(GL_ARRAY_BUFFER, buffer0);         
glGetBufferSubData(GL_ARRAY_BUFFER, 0, 3*numberOfVertices*sizeof(float), _bufferfeedback0.data());

std::vector<float> _bufferfeedback1;
_bufferfeedback1.resize(3*numberOfVertices);//e.g. r,g,b per vertex
glBindBuffer(GL_ARRAY_BUFFER, buffer1);         
glGetBufferSubData(GL_ARRAY_BUFFER, 0, 3*numberOfVertices*sizeof(float), _bufferfeedback1.data());
于 2016-06-23T09:51:26.507 回答