GLDepthStencilView::GLDepthStencilView(uint32 width, uint32 height, ElementFormat ef, uint32 sampleCount, uint32 sampleQuality): mLevel(-1), mRBO(0), mSampleCount(sampleCount), mSampleQuaility(sampleQuality) { mWidth = width; mHeight = height; mElementFormat = ef; CHECK_GL_CALL(glGenRenderbuffers(1, &mRBO)); if(mRBO) { glBindRenderbuffer(GL_RENDERBUFFER, mRBO); if(mSampleCount <= 1 || !glRenderbufferStorageMultisampleEXT) glRenderbufferStorage(GL_RENDERBUFFER, element_format_to_gl_format(ef), width, height); else glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, mSampleCount, element_format_to_gl_format(ef), width, height); } }
GLDepthStencilView::GLDepthStencilView(const TexturePtr& texture, int32 level): mTexture(texture), mLevel(level), mRBO(0), mSampleCount(1), mSampleQuaility(1) { GLTexture2D* glTexture = (GLTexture2D*)mTexture.get(); mTex = (GLuint)glTexture->getTextureId(); mWidth = glTexture->width(0); mHeight = glTexture->height(0); mElementFormat = glTexture->format(); CHECK_GL_CALL(glGenRenderbuffers(1, &mRBO)); if(mRBO) { CHECK_GL_CALL(glBindRenderbuffer(GL_RENDERBUFFER, mRBO)); if(mSampleCount <= 1 || !glRenderbufferStorageMultisampleEXT) { CHECK_GL_CALL(glRenderbufferStorage(GL_RENDERBUFFER, element_format_to_gl_format(mElementFormat), mWidth, mHeight)); } else { CHECK_GL_CALL(glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, mSampleCount, element_format_to_gl_format(mElementFormat), mWidth, mHeight)); } } }
SharedPtr<uint8> GLFrameBuffer::readFrameBufferData(int32 x, int32 y, uint32 width, uint32 height, ElementFormat format) { GLint prevBuffer; glGetIntegerv(GL_FRAMEBUFFER_BINDING, &prevBuffer); #if defined(UKN_OSX_REQUEST_OPENGL_32_CORE_PROFILE) glBindBuffer(GL_FRAMEBUFFER, mFBO); #else CHECK_GL_CALL(glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, mFBO)); #endif if(width == 0) width = this->getViewport().width; if(height == 0) height = this->getViewport().height; uint8* texData = new uint8[width * height * GetElementSize(format)]; CHECK_GL_CALL(glReadPixels(x, y, width, height, element_format_to_gl_format(format), element_format_to_gl_element_type(format), texData)); if(glGetError() != GL_NO_ERROR) { log_error("GLGraphicDevice: error when read pixels"); } #if defined(UKN_OSX_REQUEST_OPENGL_32_CORE_PROFILE) CHECK_GL_CALL(glBindBuffer(GL_FRAMEBUFFER, prevBuffer)); #else CHECK_GL_CALL(glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, prevBuffer)); #endif return SharedPtr<uint8>(texData); }