diff --git a/c++/contourgl/contourgl.cpp b/c++/contourgl/contourgl.cpp index 247b15e..6fb0122 100644 --- a/c++/contourgl/contourgl.cpp +++ b/c++/contourgl/contourgl.cpp @@ -90,30 +90,45 @@ int main() { glXMakeContextCurrent(display, pbuffer, pbuffer, context); // frame buffer - int framebuffer_width = 2048; - int framebuffer_height = 2048; + int framebuffer_width = 512; + int framebuffer_height = 512; + + GLuint multisample_texture_id = 0; + glGenTextures(1, &multisample_texture_id); + glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, multisample_texture_id); + glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA16F, framebuffer_width, framebuffer_height, GL_TRUE); + + GLuint multisample_renderbuffer_id = 0; + glGenRenderbuffers(1, &multisample_renderbuffer_id); + glBindRenderbuffer(GL_RENDERBUFFER, multisample_renderbuffer_id); + glRenderbufferStorageMultisample(GL_RENDERBUFFER, 4, GL_STENCIL_INDEX8, framebuffer_width, framebuffer_height); + + GLuint multisample_framebuffer_id = 0; + glGenFramebuffers(1, &multisample_framebuffer_id); + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, multisample_framebuffer_id); + glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, multisample_framebuffer_id); + glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, multisample_texture_id, 0); GLuint texture_id = 0; glGenTextures(1, &texture_id); glBindTexture(GL_TEXTURE_2D, texture_id); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, framebuffer_width, framebuffer_height, 0, GL_RGBA, GL_FLOAT, NULL); - GLuint renderbuffer_id = 0; - glGenRenderbuffers(1, &renderbuffer_id); - glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer_id); - glRenderbufferStorage(GL_RENDERBUFFER, GL_STENCIL_INDEX8, framebuffer_width, framebuffer_height); - GLuint framebuffer_id = 0; glGenFramebuffers(1, &framebuffer_id); - glBindFramebuffer(GL_DRAW_FRAMEBUFFER, framebuffer_id); glBindFramebuffer(GL_READ_FRAMEBUFFER, framebuffer_id); - glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, framebuffer_id); - glFramebufferTexture(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, texture_id, 0); - glFramebufferTexture(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, texture_id, 0); + glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture_id, 0); + + cout << "Framebuffer status:" << setbase(16) + << " 0x" << glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER) + << " 0x" << glCheckFramebufferStatus(GL_READ_FRAMEBUFFER) + << setbase(10) << endl; // set view port glViewport(0, 0, framebuffer_width, framebuffer_height); + glEnable(GL_MULTISAMPLE); + Shaders::initialize(); // do something @@ -124,16 +139,21 @@ int main() { Shaders::deinitialize(); // deinitialization - glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); glBindFramebuffer(GL_READ_FRAMEBUFFER, 0); glDeleteFramebuffers(1, &framebuffer_id); - glBindRenderbuffer(GL_RENDERBUFFER, 0); - glDeleteRenderbuffers(1, &renderbuffer_id); - glBindTexture(GL_TEXTURE_2D, 0); glDeleteTextures(1, &texture_id); + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); + glDeleteFramebuffers(1, &multisample_framebuffer_id); + + glBindRenderbuffer(GL_RENDERBUFFER, 0); + glDeleteRenderbuffers(1, &multisample_renderbuffer_id); + + glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, 0); + glDeleteTextures(1, &multisample_texture_id); + glXMakeContextCurrent(display, None, None, NULL); glXDestroyContext(display, context); glXDestroyPbuffer(display, pbuffer); diff --git a/c++/contourgl/test.cpp b/c++/contourgl/test.cpp index bf7d262..44ef96f 100644 --- a/c++/contourgl/test.cpp +++ b/c++/contourgl/test.cpp @@ -81,10 +81,24 @@ public: static void save_viewport(const string &filename) { glFinish(); - int vp[4] = {}; + + GLint vp[4] = {}; glGetIntegerv(GL_VIEWPORT, vp); + + GLint draw_buffer = 0, read_buffer = 0; + glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &draw_buffer); + glGetIntegerv(GL_READ_FRAMEBUFFER_BINDING, &read_buffer); + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, (GLuint)read_buffer); + glBindFramebuffer(GL_READ_FRAMEBUFFER, (GLuint)draw_buffer); + glBlitFramebuffer(vp[0], vp[1], vp[2], vp[3], vp[0], vp[1], vp[2], vp[3], GL_COLOR_BUFFER_BIT, GL_NEAREST); + glFinish(); + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, (GLuint)draw_buffer); + glBindFramebuffer(GL_READ_FRAMEBUFFER, (GLuint)read_buffer); + char *buffer = new char[vp[2]*vp[3]*4]; glReadPixels(vp[0], vp[1], vp[2], vp[3], GL_BGRA, GL_UNSIGNED_BYTE, buffer); + + save_rgba(buffer, vp[2], vp[3], false, filename); delete buffer; } @@ -201,7 +215,7 @@ Test::Wrapper::~Wrapper() { if (!surface && tga) glFinish(); Real ms = 1000.0*(Real)(get_clock() - t)/(Real)(CLOCKS_PER_SEC); cout << setw(8) << fixed << setprecision(3) - << ms << " ms - " << filename << endl; + << ms << " ms - " << filename << flush << endl; if (tga) { if (surface) @@ -318,6 +332,7 @@ void Test::test2() { glEnableVertexAttribArray(0); glVertexAttribPointer(0, 2, GL_FLOAT, GL_TRUE, 0, NULL); + Shaders::color(Color(0.f, 0.f, 1.f, 1.f)); glDrawArrays(GL_TRIANGLE_STRIP, 0, vertices.size()); glFinish(); @@ -357,7 +372,6 @@ void Test::test2() { &vertices.front() ); } - { Wrapper t("test_2_simple_fill.tga"); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);