Как мне прочитать несколько буферов обратной связи преобразования при использовании 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 или просто вообще не считывать данные буфера.
Не было доступно ни одного примера для конкретного вопроса, так как чтение нескольких буферов с обратной связью преобразования не отличается от чтения нескольких буферов в целом. Вы связываете буфер — вы читаете это. Объект обратной связи преобразования и его буферные базы только сообщают 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());
Других решений пока нет …