Question

I have four VBO's (BufferA, BufferB, BufferC and BufferD) and two programs (program1 and program2). Main steps of logic are:

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);

Questions: What do I need to do to gain access to BufferB from program2? Can I bind BufferB as texture somehow and read it with texelfetch?

I am using iOS 7 and OpenGL es 3.0

Was it helpful?

Solution

Yes, you can. You may use buffer as PBO and then create a texture from your buffer.

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

In case of using PBO, TexImage* works fast since CPU is not involved in texture initialization.

Disadvantage of the approach is that the texture is not allowed to be changed. But if you are implementing iterating method you may use the "pin pong strategy" (Have different buffers for previous and new state; Swap it after visualization).

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top