Hi all,
I am trying to do a basic multiple render to texture with render to vertex buffer but it does not work. This is how I have setup my vertex buffer.
const int size = texture_size*texture_size*4*sizeof(float);
glGenBuffers(2, vbo);
for(int i=0;i<2;i++) {
glBindBuffer(GL_ARRAY_BUFFER, vbo[i]);
glBufferData(GL_ARRAY_BUFFER, size, &X[0].x, GL_DYNAMIC_DRAW);
}
glBindBuffer(GL_ARRAY_BUFFER, 0);
This is how my FBO is setup
glGenTextures(4, attachID);
glGenFramebuffers(2, fboID);
for(int j=0;j<2;j++) {
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fboID[j]);
for(int i=0;i<2;i++) {
glBindTexture(GL_TEXTURE_2D, attachID[i+2*j]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F_ARB, texture_size, texture_size, 0, GL_RGBA, GL_FLOAT, data[i]); // NULL = Empty texture
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, mrt[i], GL_TEXTURE_2D, attachID[i+2*j], 0);
}
}
GLenum status = glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER);
if (status == GL_FRAMEBUFFER_COMPLETE ) {
printf("FBO setup succeeded.");
} else {
printf("Problem with FBO setup.");
}
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
CHECK_GL_ERRORS
This is how my MRT i setup
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fboID[writeID]);
glDrawBuffers(2, mrt);
glClear(GL_COLOR_BUFFER_BIT);
SetOrthographicProjection();
glViewport(0,0,texture_size, texture_size);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, attachID[2*readID]);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, attachID[2*readID+1]);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
shader.Use();
DrawFullScreenQuad();
shader.UnUse();
glFlush();
CHECK_GL_ERRORS
//read back the results into the VBO
glBindFramebuffer(GL_READ_FRAMEBUFFER, fboID[readID]);
glReadBuffer(GL_COLOR_ATTACHMENT0); glBindBuffer(GL_PIXEL_PACK_BUFFER, vbo[0]); glReadPixels(0, 0, texture_size, texture_size, GL_RGBA, GL_FLOAT, 0);
glReadBuffer(GL_COLOR_ATTACHMENT1);
glBindBuffer(GL_PIXEL_PACK_BUFFER, vbo[1]);
glReadPixels(0, 0, texture_size, texture_size, GL_RGBA, GL_FLOAT, 0);
glReadBuffer(GL_NONE);
glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
glViewport(0,0,width, height);
ResetPerspectiveProjection();
glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
And finally this is how I am rendering the buffer.
glBindBuffer(GL_ARRAY_BUFFER, vbo[0]);
glVertexPointer(4, GL_FLOAT, 0,0);
glEnableClientState(GL_VERTEX_ARRAY);
glDrawArrays(GL_POINTS,0, total_points);
glDisableClientState(GL_VERTEX_ARRAY);
But it does not work. I tried removing the MRT completely to see whether the buffer object is setup fine and indeed it is; I get my mesh. However, with MRT it does not work. Maybe I am missing something obvious for reading my data from the FBO but I cannot find it.