Opengl es 使用OpenGL ES 3.0从顶点着色器访问VBO

Opengl es 使用OpenGL ES 3.0从顶点着色器访问VBO,opengl-es,ios7,opengl-es-3.0,transform-feedback,Opengl Es,Ios7,Opengl Es 3.0,Transform Feedback,我有四个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(

我有四个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是的,你可以。您可以使用缓冲区作为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策略”(为以前的和新的状态使用不同的缓冲区;在可视化之后交换它)