void GL_RenderBuffer::createRenderBufferStorage(int buffer, int type, int attachment) { glRenderbufferStorageEXT( GL_RENDERBUFFER_EXT, type, settings.width, settings.height); CheckLastErrorGL( "Could not create renderbuffer object storage" ); glFramebufferRenderbufferEXT( GL_FRAMEBUFFER_EXT, attachment, GL_RENDERBUFFER_EXT, buffer); CheckLastErrorGL( "Could not attach renderbuffer into framebuffer object" ); }
void GL_RenderBuffer::unbind() { glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); CheckLastErrorGL( "Could not unbind framebuffer object" ); glDrawBuffer(GL_BACK); glReadBuffer(GL_BACK); bound = false; }
void GL_RenderBuffer::bind() { //if(bound) return; glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, id); CheckLastErrorGL( "Could not bind framebuffer object" ); setBufferState(); bound = true; }
GL_RenderBuffer::~GL_RenderBuffer() { glDeleteFramebuffersEXT(1, (GLuint*) &id); for( size_t i = 0; i < renderBuffers.size(); i++ ) { uint32 buffer = renderBuffers[i]; glDeleteRenderbuffersEXT(1, (GLuint*) &buffer); CheckLastErrorGL( "Could not delete renderbuffer object" ); } }
void BindGenericVertexBufferDeclarations(VertexBuffer* vb) { const GeometryBuffer* gb = vb->getGeometryBuffer(); const std::vector<VertexElement>& decls = gb->declarations.decls; for( size_t i = 0; i < decls.size(); i++ ) { const VertexElement& decl = decls[i]; int index = (int) decl.attribute; glEnableVertexAttribArray(index); CheckLastErrorGL("Error enabling vertex attribute array"); GLenum type = ConvertBufferTypeGL(decl.type); glVertexAttribPointer(index, decl.components, type, GL_FALSE, decl.stride, (void*) decl.offset ); CheckLastErrorGL("Error binding pointers to buffer"); } }
void GL_RenderBuffer::createRenderBuffer( RenderBufferType bufferComponents ) { // Render buffers are just objects which are used to support // offscreen rendering, often for sections of the framebuffer which // don’t have a texture format associated with them. if( !checkSize() ) return; GLuint renderBuffer; glGenRenderbuffersEXT(1, &renderBuffer); CheckLastErrorGL( "Could not generate renderbuffer object" ); glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, renderBuffer); CheckLastErrorGL( "Could not bind renderbuffer object" ); bind(); if( BitwiseAnd(bufferComponents, RenderBufferType::Depth) ) { createRenderBufferStorage(renderBuffer, GL_DEPTH_COMPONENT, GL_DEPTH_ATTACHMENT_EXT); } if( BitwiseAnd(bufferComponents, RenderBufferType::Color) ) { createRenderBufferStorage(renderBuffer, GL_RGBA, GL_COLOR_ATTACHMENT0_EXT); colorAttach = true; } if( BitwiseAnd(bufferComponents, RenderBufferType::Stencil) ) { createRenderBufferStorage(renderBuffer, GL_STENCIL_INDEX, GL_STENCIL_ATTACHMENT_EXT); colorAttach = true; } glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0); unbind(); }
NAMESPACE_GRAPHICS_BEGIN //-----------------------------------// GL_RenderBuffer::GL_RenderBuffer(const Settings& settings) : RenderBuffer(settings) , bound(false) , valid(false) , colorAttach(false) { glGenFramebuffersEXT(1, (GLuint*) &id); CheckLastErrorGL( "Could not create framebuffer object" ); }
void UnbindGenericVertexBufferDeclarations(VertexBuffer* vb) { const GeometryBuffer* gb = vb->getGeometryBuffer(); const std::vector<VertexElement>& decls = gb->declarations.decls; for( size_t i = 0; i < decls.size(); i++ ) { const VertexElement& decl = decls[i]; int index = (int) decl.attribute; glDisableVertexAttribArray(index); CheckLastErrorGL("Error disabling vertex attribute array"); } }
void GL_RenderBuffer::attachRenderTexture(const TexturePtr& tex) { bind(); GLint attach = GL_COLOR_ATTACHMENT0_EXT; if( tex->getPixelFormat() == PixelFormat::Depth ) attach = GL_DEPTH_ATTACHMENT_EXT; glFramebufferTexture2DEXT( GL_FRAMEBUFFER_EXT, attach, GL_TEXTURE_2D, tex->getId(), 0); CheckLastErrorGL( "Could not attach texture into framebuffer object" ); textureBuffers.push_back( tex ); unbind(); }