#include #include using namespace poly; TestFboSwap::TestFboSwap() :dx(0) { fbo[0] = 0; fbo[1] = 0; tex[0] = 0; tex[1] = 0; } TestFboSwap::~TestFboSwap() { } int TestFboSwap::init() { if (0 != fbo[0]) { SX_ERROR("Alredy initialized."); return -1; } if (0 != createFbo(fbo[0], tex[0])) { return -2; } if (0 != createFbo(fbo[1], tex[1])) { return -3; } return 0; } int TestFboSwap::createFbo(GLuint& fboOut, GLuint& texOut) { if (0 != fboOut) { SX_ERROR("Given FBO is not 0, already created?"); return -1; } if (0 != texOut) { SX_ERROR("Given TEX is not 0, already created?"); return -2; } glGenTextures(1, &texOut); glBindTexture(GL_TEXTURE_2D, texOut); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1024, 1024, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glBindTexture(GL_TEXTURE_2D, 0); glGenFramebuffers(1, &fboOut); glBindFramebuffer(GL_FRAMEBUFFER, fboOut); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texOut, 0); if (GL_FRAMEBUFFER_COMPLETE != glCheckFramebufferStatus(GL_FRAMEBUFFER)) { SX_ERROR("Framebuffer not yet complete."); glBindFramebuffer(GL_FRAMEBUFFER, 0); return -3; } glBindFramebuffer(GL_FRAMEBUFFER, 0); return 0; } void TestFboSwap::activate() { // glWaitSync(); glBindFramebuffer(GL_FRAMEBUFFER, fbo[dx]); glDrawBuffer(GL_COLOR_ATTACHMENT0); glViewport(0, 0, 1024, 1024); } void TestFboSwap::swap() { dx = 1 - dx; } GLuint TestFboSwap::getReadTexture() { return tex[dx - 1]; }