1 /*! 2 @file 3 @author Albert Semenov 4 @date 12/2009 5 */ 6 7 #include "MyGUI_OpenGLRTTexture.h" 8 #include "MyGUI_OpenGLRenderManager.h" 9 #include "MyGUI_OpenGLDiagnostic.h" 10 11 #include "GL/glew.h" 12 13 namespace MyGUI 14 { 15 OpenGLRTTexture(unsigned int _texture)16 OpenGLRTTexture::OpenGLRTTexture(unsigned int _texture) : 17 mTextureID(_texture), 18 mWidth(0), 19 mHeight(0), 20 mFBOID(0), 21 mRBOID(0) 22 { 23 int miplevel = 0; 24 glBindTexture(GL_TEXTURE_2D, mTextureID); 25 glGetTexLevelParameteriv(GL_TEXTURE_2D, miplevel, GL_TEXTURE_WIDTH, &mWidth); 26 glGetTexLevelParameteriv(GL_TEXTURE_2D, miplevel, GL_TEXTURE_HEIGHT, &mHeight); 27 glBindTexture(GL_TEXTURE_2D, 0); 28 29 mRenderTargetInfo.maximumDepth = 1.0f; 30 mRenderTargetInfo.hOffset = 0; 31 mRenderTargetInfo.vOffset = 0; 32 mRenderTargetInfo.aspectCoef = float(mHeight) / float(mWidth); 33 mRenderTargetInfo.pixScaleX = 1.0f / float(mWidth); 34 mRenderTargetInfo.pixScaleY = 1.0f / float(mHeight); 35 36 // create a framebuffer object, you need to delete them when program exits. 37 glGenFramebuffersEXT(1, &mFBOID); 38 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, mFBOID); 39 40 // create a renderbuffer object to store depth info 41 // NOTE: A depth renderable image should be attached the FBO for depth test. 42 // If we don't attach a depth renderable image to the FBO, then 43 // the rendering output will be corrupted because of missing depth test. 44 // If you also need stencil test for your rendering, then you must 45 // attach additional image to the stencil attachement point, too. 46 glGenRenderbuffersEXT(1, &mRBOID); 47 glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, mRBOID); 48 glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, mWidth, mHeight); 49 glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0); 50 51 // attach a texture to FBO color attachement point 52 glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, mTextureID, 0); 53 54 // attach a renderbuffer to depth attachment point 55 glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, mRBOID); 56 57 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); 58 } 59 ~OpenGLRTTexture()60 OpenGLRTTexture::~OpenGLRTTexture() 61 { 62 if (mFBOID != 0) 63 { 64 glDeleteFramebuffersEXT(1, &mFBOID); 65 mFBOID = 0; 66 } 67 if (mRBOID != 0) 68 { 69 glDeleteRenderbuffersEXT(1, &mRBOID); 70 mRBOID = 0; 71 } 72 } 73 begin()74 void OpenGLRTTexture::begin() 75 { 76 glPushAttrib(GL_VIEWPORT_BIT); 77 78 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, mFBOID); 79 80 glViewport(0, 0, mWidth, mHeight); 81 82 OpenGLRenderManager::getInstance().begin(); 83 glOrtho(-1, 1, 1, -1, -1, 1); 84 glClear(GL_COLOR_BUFFER_BIT/* | GL_DEPTH_BUFFER_BIT*/); 85 } 86 end()87 void OpenGLRTTexture::end() 88 { 89 OpenGLRenderManager::getInstance().end(); 90 91 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); // unbind 92 93 glPopAttrib(); 94 } 95 doRender(IVertexBuffer * _buffer,ITexture * _texture,size_t _count)96 void OpenGLRTTexture::doRender(IVertexBuffer* _buffer, ITexture* _texture, size_t _count) 97 { 98 OpenGLRenderManager::getInstance().doRender(_buffer, _texture, _count); 99 } 100 101 } // namespace MyGUI 102