доступ к VBO из вершинного шейдера с OpenGL ES 3.0

У меня есть четыре VBO (BufferA, BufferB, BufferC и BufferD) и две программы (program1 и program2). Основные этапы логики:

glUseProgram(progran1);
glBindBuffer(GL_ARRAY_BUFFER, BufferA);
glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, BufferB);
glBeginTransformFeedback(GL_POINTS);
glDrawArrays(GL_POINTS, 0, Vertex1Count);
glEndTransformFeedback();
swap(BufferA, BufferB);

glUseProgram(progran2);
glBindBuffer(GL_ARRAY_BUFFER, BufferC);
glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, BufferD);
glBeginTransformFeedback(GL_POINTS);
glDrawArrays(GL_POINTS, 0, Vertex2Count);
glEndTransformFeedback();
swap(BufferC, BufferD);

Вопросы: Что мне нужно сделать, чтобы получить доступ к BufferB из программы2? Могу ли я каким-то образом связать BufferB как текстуру и прочитать ее с помощью texelfetch?

Я использую iOS 7 и OpenGL es 3.0.


person user3320990    schedule 18.02.2014    source источник


Ответы (1)


Да, ты можешь. Вы можете использовать буфер как PBO, а затем создать текстуру из вашего буфера.

glBindBuffer(GL_PIXEL_UNPACK_BUFFER, BufferB);
GLuint someTex;
glActiveTexture(GL_TEXTURE0);
glGenTexutre(1, &someTex);
glBindTexture(GL_TEXTURE_2D, someTex);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, 1, sizeOfYourBuffer, 0, GL_RGBA, GL_FLOAT, nullptr); 
// nullptr is interpret as an offset in your buffer

В случае использования PBO, TexImage* работает быстро, так как процессор не участвует в инициализации текстуры.

Недостатком подхода является то, что текстуру нельзя изменить. Но если вы реализуете метод итерации, вы можете использовать «стратегию пин-понга» (иметь разные буферы для предыдущего и нового состояния; поменять местами после визуализации).

person ivaigult    schedule 24.08.2014