Commit f1198e2c authored by hybrid's avatar hybrid

Fixed RTT zbuffer usage. Also cleaned up RTT bind and unbind operations.

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@1501 dfc29bdd-3216-0410-991c-e03cc46cb475
parent 37e15009
...@@ -1550,6 +1550,10 @@ bool COpenGLDriver::testGLError() ...@@ -1550,6 +1550,10 @@ bool COpenGLDriver::testGLError()
os::Printer::log("GL_OUT_OF_MEMORY", ELL_ERROR); break; os::Printer::log("GL_OUT_OF_MEMORY", ELL_ERROR); break;
case GL_TABLE_TOO_LARGE: case GL_TABLE_TOO_LARGE:
os::Printer::log("GL_TABLE_TOO_LARGE", ELL_ERROR); break; os::Printer::log("GL_TABLE_TOO_LARGE", ELL_ERROR); break;
#if defined(GL_EXT_framebuffer_object)
case GL_INVALID_FRAMEBUFFER_OPERATION_EXT:
os::Printer::log("GL_INVALID_FRAMEBUFFER_OPERATION", ELL_ERROR); break;
#endif
}; };
return true; return true;
#else #else
...@@ -2526,31 +2530,15 @@ bool COpenGLDriver::setRenderTarget(video::ITexture* texture, bool clearBackBuff ...@@ -2526,31 +2530,15 @@ bool COpenGLDriver::setRenderTarget(video::ITexture* texture, bool clearBackBuff
ResetRenderStates=true; ResetRenderStates=true;
if (RenderTargetTexture!=0) if (RenderTargetTexture!=0)
{ {
if (RenderTargetTexture->isFrameBufferObject()) RenderTargetTexture->unbindRTT();
{
RenderTargetTexture->unbindFrameBufferObject();
}
else
{
glBindTexture(GL_TEXTURE_2D, RenderTargetTexture->getOpenGLTextureName());
// Copy Our ViewPort To The Texture
glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0,
RenderTargetTexture->getSize().Width, RenderTargetTexture->getSize().Height);
}
} }
if (texture) if (texture)
{ {
// we want to set a new target. so do this. // we want to set a new target. so do this.
glViewport(0, 0, texture->getSize().Width, texture->getSize().Height);
RenderTargetTexture = static_cast<COpenGLTexture*>(texture); RenderTargetTexture = static_cast<COpenGLTexture*>(texture);
RenderTargetTexture->bindRTT();
CurrentRendertargetSize = texture->getSize(); CurrentRendertargetSize = texture->getSize();
if (RenderTargetTexture->isFrameBufferObject())
{
RenderTargetTexture->bindFrameBufferObject();
}
} }
else else
{ {
......
...@@ -65,41 +65,27 @@ COpenGLTexture::COpenGLTexture(const core::dimension2d<s32>& size, ...@@ -65,41 +65,27 @@ COpenGLTexture::COpenGLTexture(const core::dimension2d<s32>& size,
setDebugName("COpenGLTexture_FBO"); setDebugName("COpenGLTexture_FBO");
#endif #endif
// generate color texture
glGenTextures(1, &TextureName);
glBindTexture(GL_TEXTURE_2D, TextureName);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, InternalFormat, ImageSize.Width,
ImageSize.Height, 0, PixelFormat, PixelType, 0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
if (useStencil) if (useStencil)
{ {
glGenTextures(1, &DepthRenderBuffer);
glBindTexture(GL_TEXTURE_2D, DepthRenderBuffer);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
#ifdef GL_EXT_packed_depth_stencil #ifdef GL_EXT_packed_depth_stencil
if (Driver->queryOpenGLFeature(COpenGLExtensionHandler::IRR_EXT_packed_depth_stencil)) if (Driver->queryOpenGLFeature(COpenGLExtensionHandler::IRR_EXT_packed_depth_stencil))
{ {
// generate packed depth stencil texture // generate packed depth stencil texture
glGenTextures(1, &DepthRenderBuffer);
glBindTexture(GL_TEXTURE_2D, DepthRenderBuffer);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_STENCIL_EXT, ImageSize.Width, glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_STENCIL_EXT, ImageSize.Width,
ImageSize.Height, 0, GL_DEPTH_STENCIL_EXT, GL_UNSIGNED_INT_24_8_EXT, 0); ImageSize.Height, 0, GL_DEPTH_STENCIL_EXT, GL_UNSIGNED_INT_24_8_EXT, 0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
StencilRenderBuffer = DepthRenderBuffer; // stencil is packed with depth StencilRenderBuffer = DepthRenderBuffer; // stencil is packed with depth
} }
else // generate separate stencil and depth textures else // generate separate stencil and depth textures
#endif #endif
{ {
// generate depth texture // generate depth texture
glGenTextures(1, &DepthRenderBuffer);
glBindTexture(GL_TEXTURE_2D, DepthRenderBuffer);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT24, ImageSize.Width, glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT24, ImageSize.Width,
ImageSize.Height, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, 0); ImageSize.Height, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, 0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
// we 're in trouble! the code below does not complete // we 're in trouble! the code below does not complete
// the FBO currently... stencil buffer is only // the FBO currently... stencil buffer is only
...@@ -120,26 +106,33 @@ COpenGLTexture::COpenGLTexture(const core::dimension2d<s32>& size, ...@@ -120,26 +106,33 @@ COpenGLTexture::COpenGLTexture(const core::dimension2d<s32>& size,
else else
{ {
// generate depth buffer // generate depth buffer
Driver->extGlGenFramebuffers(1, &DepthRenderBuffer); Driver->extGlGenRenderbuffers(1, &DepthRenderBuffer);
Driver->extGlBindRenderbuffer(GL_RENDERBUFFER_EXT, DepthRenderBuffer); Driver->extGlBindRenderbuffer(GL_RENDERBUFFER_EXT, DepthRenderBuffer);
Driver->extGlRenderbufferStorage(GL_RENDERBUFFER_EXT,
GL_DEPTH_COMPONENT, ImageSize.Width,
ImageSize.Height);
} }
// generate frame buffer // generate frame buffer
Driver->extGlGenFramebuffers(1, &ColorFrameBuffer); Driver->extGlGenFramebuffers(1, &ColorFrameBuffer);
Driver->extGlBindFramebuffer(GL_FRAMEBUFFER_EXT, ColorFrameBuffer); Driver->extGlBindFramebuffer(GL_FRAMEBUFFER_EXT, ColorFrameBuffer);
// generate color texture
glGenTextures(1, &TextureName);
glBindTexture(GL_TEXTURE_2D, TextureName);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D, 0, InternalFormat, ImageSize.Width,
ImageSize.Height, 0, PixelFormat, PixelType, 0);
// attach color texture to frame buffer // attach color texture to frame buffer
Driver->extGlFramebufferTexture2D(GL_FRAMEBUFFER_EXT, Driver->extGlFramebufferTexture2D(GL_FRAMEBUFFER_EXT,
GL_COLOR_ATTACHMENT0_EXT, GL_COLOR_ATTACHMENT0_EXT,
GL_TEXTURE_2D, GL_TEXTURE_2D,
TextureName, TextureName,
0); 0);
// attach depth texture to depth buffer
Driver->extGlFramebufferTexture2D(GL_FRAMEBUFFER_EXT,
GL_DEPTH_ATTACHMENT_EXT,
useStencil?GL_TEXTURE_2D:GL_RENDERBUFFER_EXT,
DepthRenderBuffer,
0);
if (useStencil) if (useStencil)
{ {
// attach stencil texture to stencil buffer // attach stencil texture to stencil buffer
...@@ -148,11 +141,22 @@ COpenGLTexture::COpenGLTexture(const core::dimension2d<s32>& size, ...@@ -148,11 +141,22 @@ COpenGLTexture::COpenGLTexture(const core::dimension2d<s32>& size,
GL_TEXTURE_2D, GL_TEXTURE_2D,
StencilRenderBuffer, StencilRenderBuffer,
0); 0);
// attach depth texture to depth buffer
Driver->extGlFramebufferTexture2D(GL_FRAMEBUFFER_EXT,
GL_DEPTH_ATTACHMENT_EXT,
GL_TEXTURE_2D,
DepthRenderBuffer,
0);
} }
else else
Driver->extGlRenderbufferStorage(GL_RENDERBUFFER_EXT, {
GL_DEPTH_COMPONENT, ImageSize.Width, // attach depth renderbuffer to depth buffer
ImageSize.Height); Driver->extGlFramebufferRenderbuffer(GL_FRAMEBUFFER_EXT,
GL_DEPTH_ATTACHMENT_EXT,
GL_RENDERBUFFER_EXT,
DepthRenderBuffer);
}
glGetError(); glGetError();
...@@ -550,23 +554,37 @@ void COpenGLTexture::setIsRenderTarget(bool isTarget) ...@@ -550,23 +554,37 @@ void COpenGLTexture::setIsRenderTarget(bool isTarget)
} }
//! Bind ColorFrameBuffer (valid only if isFrameBufferObject() returns true). //! Bind Render Target Texture
void COpenGLTexture::bindFrameBufferObject() void COpenGLTexture::bindRTT()
{ {
glViewport(0, 0, getSize().Width, getSize().Height);
if (isFrameBufferObject())
{
#ifdef GL_EXT_framebuffer_object #ifdef GL_EXT_framebuffer_object
if (ColorFrameBuffer != 0) if (ColorFrameBuffer != 0)
Driver->extGlBindFramebuffer(GL_FRAMEBUFFER_EXT, ColorFrameBuffer); Driver->extGlBindFramebuffer(GL_FRAMEBUFFER_EXT, ColorFrameBuffer);
#endif #endif
}
} }
//! Unbind ColorFrameBuffer (valid only if isFrameBufferObject() returns true). //! Unbind Render Target Texture
void COpenGLTexture::unbindFrameBufferObject() void COpenGLTexture::unbindRTT()
{ {
if (isFrameBufferObject())
{
#ifdef GL_EXT_framebuffer_object #ifdef GL_EXT_framebuffer_object
if (ColorFrameBuffer != 0) if (ColorFrameBuffer != 0)
Driver->extGlBindFramebuffer(GL_FRAMEBUFFER_EXT, 0); Driver->extGlBindFramebuffer(GL_FRAMEBUFFER_EXT, 0);
#endif #endif
}
else
{
glBindTexture(GL_TEXTURE_2D, getOpenGLTextureName());
// Copy Our ViewPort To The Texture
glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, getSize().Width, getSize().Height);
}
} }
......
...@@ -92,11 +92,11 @@ public: ...@@ -92,11 +92,11 @@ public:
//! Is it a FrameBufferObject? //! Is it a FrameBufferObject?
bool isFrameBufferObject() const; bool isFrameBufferObject() const;
//! Bind FrameBufferObject (valid only if isFrameBufferObject() returns true). //! Bind RenderTargetTexture
void bindFrameBufferObject(); void bindRTT();
//! Unbind FrameBufferObject (valid only if isFrameBufferObject() returns true). //! Unbind RenderTargetTexture
void unbindFrameBufferObject(); void unbindRTT();
//! sets whether this texture is intended to be used as a render target. //! sets whether this texture is intended to be used as a render target.
void setIsRenderTarget(bool isTarget); void setIsRenderTarget(bool isTarget);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment