Как мне прочитать несколько буферов при использовании GL_SEPARATE_ATTRIBS с обратной связью преобразования в OpenGL?

Как мне прочитать несколько буферов обратной связи преобразования при использовании 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 а также buffer1 индексированный (0,1) с glBindBufferBase из GL_TRANSFORM_FEEDBACK_BUFFER?

Все учебники, которые я нашел, всегда упрощают это до одного буфера с GL_INTERLEAVED_ATTRIBS и просто объясните, что можно использовать отдельные буферы для согласования с выходом TF в соответствии с форматом ввода VAO или просто вообще не считывать данные буфера.

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());
Другие вопросы по тегам