1

我有四个 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);

问题:我需要做什么才能从 program2 访问 BufferB?我可以以某种方式将 BufferB 绑定为纹理并使用 texelfetch 读取它吗?

我正在使用 iOS 7 和 OpenGL es 3.0

4

1 回答 1

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* 工作得很快,因为 CPU 不参与纹理初始化。

该方法的缺点是不允许更改纹理。但是,如果您正在实施迭代方法,您可以使用“pin pong strategy”(对于先前状态和新状态具有不同的缓冲区;在可视化后交换它)。

于 2014-08-24T16:27:18.563 回答