From 5a97bff9094f142c5d895ba5894399a4982b7319 Mon Sep 17 00:00:00 2001 From: Marius Kintel Date: Tue, 8 Nov 2011 05:12:28 +0100 Subject: Bugfix: Attach a stencil buffer to the FBO, fixes some OpenCSG rendering bugs diff --git a/tests/OffscreenContext.mm b/tests/OffscreenContext.mm index 2bbaffa..140516f 100644 --- a/tests/OffscreenContext.mm +++ b/tests/OffscreenContext.mm @@ -33,6 +33,7 @@ OffscreenContext *create_offscreen_context(int w, int h) NSOpenGLPFANoRecovery, NSOpenGLPFAAccelerated, NSOpenGLPFADepthSize, 24, + NSOpenGLPFAStencilSize, 8, (NSOpenGLPixelFormatAttribute) 0 }; NSOpenGLPixelFormat *pixFormat = [[[NSOpenGLPixelFormat alloc] initWithAttributes:attributes] autorelease]; diff --git a/tests/fbo.cc b/tests/fbo.cc index 2978e59..2a3342d 100644 --- a/tests/fbo.cc +++ b/tests/fbo.cc @@ -89,14 +89,30 @@ bool fbo_ext_init(fbo_t *fbo, size_t width, size_t height) return false; } - glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, - GL_RENDERBUFFER_EXT, fbo->depthbuf_id); - if (report_glerror("specifying depth render buffer EXT")) return false; - - if (!check_fbo_status()) { - cerr << "Problem with OpenGL EXT framebuffer after specifying depth render buffer.\n"; - return false; - } + if (glewIsSupported("GL_EXT_packed_depth_stencil")) { + glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, + GL_RENDERBUFFER_EXT, fbo->depthbuf_id); + if (report_glerror("specifying depth render buffer EXT")) return false; + glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, + GL_RENDERBUFFER_EXT, fbo->depthbuf_id); + if (report_glerror("specifying stencil render buffer EXT")) return false; + + if (!check_fbo_status()) { + cerr << "Problem with OpenGL EXT framebuffer after specifying depth render buffer.\n"; + return false; + } + } + else { + cerr << "Warning: Cannot create stencil buffer (GL_EXT_packed_depth_stencil not supported)\n"; + glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, + GL_RENDERBUFFER_EXT, fbo->depthbuf_id); + if (report_glerror("specifying depth render buffer EXT")) return false; + + if (!check_fbo_status()) { + cerr << "Problem with OpenGL EXT framebuffer after specifying depth stencil render buffer.\n"; + return false; + } + } return true; } @@ -126,9 +142,9 @@ bool fbo_arb_init(fbo_t *fbo, size_t width, size_t height) return false; } - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, fbo->depthbuf_id); - if (report_glerror("specifying depth render buffer")) return false; + if (report_glerror("specifying depth stencil render buffer")) return false; if (!check_fbo_status()) { cerr << "Problem with OpenGL framebuffer after specifying depth render buffer.\n"; @@ -165,16 +181,22 @@ bool fbo_resize(fbo_t *fbo, size_t width, size_t height) { if (use_ext()) { glBindRenderbufferEXT(GL_RENDERBUFFER, fbo->depthbuf_id); - glRenderbufferStorageEXT(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, width, height); - if (report_glerror("creating depth render buffer")) return false; + if (glewIsSupported("GL_EXT_packed_depth_stencil")) { + glRenderbufferStorageEXT(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, width, height); + if (report_glerror("creating depth stencil render buffer")) return false; + } + else { + glRenderbufferStorageEXT(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, width, height); + if (report_glerror("creating depth render buffer")) return false; + } glBindRenderbufferEXT(GL_RENDERBUFFER, fbo->renderbuf_id); glRenderbufferStorageEXT(GL_RENDERBUFFER, GL_RGBA8, width, height); if (report_glerror("creating color render buffer")) return false; } else { glBindRenderbuffer(GL_RENDERBUFFER, fbo->depthbuf_id); - glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, width, height); - if (report_glerror("creating depth render buffer")) return false; + glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, width, height); + if (report_glerror("creating depth stencil render buffer")) return false; glBindRenderbuffer(GL_RENDERBUFFER, fbo->renderbuf_id); glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, width, height); diff --git a/tests/regression/opencsgtest/render-tests-expected.png b/tests/regression/opencsgtest/render-tests-expected.png index 40a1703..487cbe8 100644 Binary files a/tests/regression/opencsgtest/render-tests-expected.png and b/tests/regression/opencsgtest/render-tests-expected.png differ -- cgit v0.10.1