From 4896edda5694387edf9520eb4df1b0bc4cbfa11f Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Thu, 27 Sep 2012 08:34:56 +0000 Subject: [PATCH] From Thomas Hogarth, "Apple have decided in their eternal wisdom to do away with separate depth and stencil buffers on iOS from version 5 and above. Attached are changes to GraphicsWindowIOS.mm to support setting up the new buffer type when compiling for iOS5, also attached is a small change to FrameBufferObject.cpp to report support for packed depth stencil via the GL_OES_packed_depth_stencil extension. For anyone reading this you can attach a packed depth stencil to your FBO like so _rttCamera->attach( osg::Camera::PACKED_DEPTH_STENCIL_BUFFER, GL_DEPTH24_STENCIL8_EXT ); Luckily GL_DEPTH24_STENCIL8_EXT happens to have the same value as iOSs GL_DEPTH24_STENCIL8_OES" --- src/osg/FrameBufferObject.cpp | 3 ++- src/osgViewer/GraphicsWindowIOS.mm | 40 +++++++++++++++++++++++++----- 2 files changed, 36 insertions(+), 7 deletions(-) diff --git a/src/osg/FrameBufferObject.cpp b/src/osg/FrameBufferObject.cpp index 14bdb8dd0..68c755a8c 100644 --- a/src/osg/FrameBufferObject.cpp +++ b/src/osg/FrameBufferObject.cpp @@ -113,7 +113,8 @@ FBOExtensions::FBOExtensions(unsigned int contextID) LOAD_FBO_EXT(glRenderbufferStorageMultisampleCoverageNV); _packed_depth_stencil_supported = OSG_GL3_FEATURES || - (isGLExtensionSupported(contextID, "GL_EXT_packed_depth_stencil")); + (isGLExtensionSupported(contextID, "GL_EXT_packed_depth_stencil")) || + (isGLExtensionSupported(contextID, "GL_OES_packed_depth_stencil")); } diff --git a/src/osgViewer/GraphicsWindowIOS.mm b/src/osgViewer/GraphicsWindowIOS.mm index 429c0b2c8..880ade66e 100644 --- a/src/osgViewer/GraphicsWindowIOS.mm +++ b/src/osgViewer/GraphicsWindowIOS.mm @@ -326,6 +326,37 @@ typedef std::map TouchPointsIdMapping; osg::notify(osg::DEBUG_INFO) << "GraphicsWindowIOS::createFramebuffer INFO: Created GL RenderBuffer of size " << _backingWidth << ", " << _backingHeight << " ." << std::endl; +#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 50000 + //on ios 5 we have to use a packed depth stencil buffer if we want stencil + if(_win->getTraits()->depth > 0) { + //add stencil if requested + if(_win->getTraits()->stencil > 0) { + // Create a packed depth stencil buffer. + glGenRenderbuffersOES(1, &_depthRenderbuffer); + glBindRenderbufferOES(GL_RENDERBUFFER_OES, _depthRenderbuffer); + + glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH24_STENCIL8_OES, _backingWidth, _backingHeight); + + glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, + GL_RENDERBUFFER_OES, _depthRenderbuffer); + glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_STENCIL_ATTACHMENT_OES, + GL_RENDERBUFFER_OES, _depthRenderbuffer); + }else{ + //normal depth buffer + glGenRenderbuffersOES(1, &_depthRenderbuffer); + glBindRenderbufferOES(GL_RENDERBUFFER_OES, _depthRenderbuffer); + if(_win->getTraits()->depth == 16) + { + glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, _backingWidth, _backingHeight); + }else if(_win->getTraits()->depth == 24){ + glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT24_OES, _backingWidth, _backingHeight); + } + + glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, _depthRenderbuffer); + } + } + +#else //add depth if requested if(_win->getTraits()->depth > 0) { glGenRenderbuffersOES(1, &_depthRenderbuffer); @@ -336,11 +367,7 @@ typedef std::map TouchPointsIdMapping; }else if(_win->getTraits()->depth == 24){ glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT24_OES, _backingWidth, _backingHeight); } -#if defined(GL_DEPTH_COMPONENT32_OES) - else if(_win->getTraits()->depth == 32){ - glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT32_OES, _backingWidth, _backingHeight); - } -#endif + glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, _depthRenderbuffer); } @@ -350,7 +377,8 @@ typedef std::map TouchPointsIdMapping; glBindRenderbufferOES(GL_RENDERBUFFER_OES, _stencilBuffer); glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_STENCIL_INDEX8_OES, _backingWidth, _backingHeight); glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_STENCIL_ATTACHMENT_OES, GL_RENDERBUFFER_OES, _stencilBuffer); - } + } +#endif //MSAA only available for >= 4.0 sdk