void FrameBufferObject::createGBuffer(void) { //! World Space Positions //AddColorAttachment(0); //! View space positions addColorAttachment(0); //! View space normals addColorAttachment(1); //! World space normals //AddColorAttachment(2); //! Color addColorAttachment(2); //! Reflectance addColorAttachment(3); //! Billboards addColorAttachment(4); //! Free color attachment //AddColorAttachment(5); //! Depth addDepthAttachment_Texture(5); //AddDepthAttachment_MultisampleTexture(9); std::cout << "FrameBuffer: Attachment count: " << m_attachmentCounter << std::endl; m_isGBuffer = true; }
void LLMultisampleBuffer::allocate(U32 resx, U32 resy, U32 color_fmt, bool depth, bool stencil, LLTexUnit::eTextureType usage, bool use_fbo, U32 samples ) { stop_glerror(); mResX = resx; mResY = resy; mUsage = usage; mUseDepth = depth; mStencil = stencil; release(); if (!gGLManager.mHasFramebufferMultisample) { llerrs << "Attempting to allocate unsupported render target type!" << llendl; } mSamples = samples; if (mSamples <= 1) { llerrs << "Cannot create a multisample buffer with less than 2 samples." << llendl; } stop_glerror(); if ((sUseFBO || use_fbo) && gGLManager.mHasFramebufferObject) { if (depth) { stop_glerror(); allocateDepth(); stop_glerror(); } glGenFramebuffersEXT(1, (GLuint *) &mFBO); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, mFBO); if (mDepth) { glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, mDepth); if (mStencil) { glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, mDepth); } } stop_glerror(); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); stop_glerror(); } addColorAttachment(color_fmt); }
bool LLRenderTarget::allocate(U32 resx, U32 resy, U32 color_fmt, bool depth, bool stencil, LLTexUnit::eTextureType usage, bool use_fbo, S32 samples) { stop_glerror(); release(); stop_glerror(); mResX = resx; mResY = resy; mStencil = stencil; mUsage = usage; mUseDepth = depth; if ((sUseFBO || use_fbo) && gGLManager.mHasFramebufferObject) { if (depth) { if (!allocateDepth()) { llwarns << "Failed to allocate depth buffer for render target." << llendl; return false; } } glGenFramebuffers(1, (GLuint *) &mFBO); if (mDepth) { glBindFramebuffer(GL_FRAMEBUFFER, mFBO); if (mStencil) { glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, mDepth); stop_glerror(); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, mDepth); stop_glerror(); } else { glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, LLTexUnit::getInternalType(mUsage), mDepth, 0); stop_glerror(); } glBindFramebuffer(GL_FRAMEBUFFER, 0); } stop_glerror(); } return addColorAttachment(color_fmt); }
void LLRenderTarget::allocate(U32 resx, U32 resy, U32 color_fmt, bool depth, bool stencil, LLTexUnit::eTextureType usage, bool use_fbo) { stop_glerror(); mResX = resx; mResY = resy; mStencil = stencil; mUsage = usage; mUseDepth = depth; release(); if ((sUseFBO || use_fbo) && gGLManager.mHasFramebufferObject) { if (depth) { stop_glerror(); allocateDepth(); stop_glerror(); } glGenFramebuffersEXT(1, (GLuint *) &mFBO); if (mDepth) { glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, mFBO); if (mStencil) { glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, mDepth); stop_glerror(); glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, mDepth); stop_glerror(); } else { glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, LLTexUnit::getInternalType(mUsage), mDepth, 0); stop_glerror(); } glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); } stop_glerror(); } addColorAttachment(color_fmt); }
bool LLMultisampleBuffer::allocate(U32 resx, U32 resy, U32 color_fmt, bool depth, bool stencil, LLTexUnit::eTextureType usage, bool use_fbo, U32 samples ) { release(); stop_glerror(); if (!gGLManager.mHasFramebufferMultisample || !gGLManager.mHasFramebufferObject || !(sUseFBO || use_fbo)) return false; if(color_fmt != GL_RGBA) { llwarns << "Unsupported color format: " << color_fmt << llendl; return false; } //Restrict to valid sample count { mSamples = samples; //mSamples = llmin(mSamples, (U32)4); //Cap to prevent memory bloat. mSamples = llmin(mSamples, (U32) gGLManager.mMaxSamples); } if (mSamples <= 1) return false; mResX = resx; mResY = resy; mUsage = usage; mUseDepth = depth; mStencil = stencil; mColorFormat = color_fmt; { if (depth) { stop_glerror(); if(!allocateDepth()) { release(); return false; } stop_glerror(); } glGenFramebuffers(1, (GLuint *) &mFBO); glBindFramebuffer(GL_FRAMEBUFFER, mFBO); stop_glerror(); clear_glerror(); if (mDepth) { glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, mDepth); if (mStencil) { glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, mDepth); } } stop_glerror(); glBindFramebuffer(GL_FRAMEBUFFER, 0); stop_glerror(); } return addColorAttachment(color_fmt); }
void FrameBufferObject::createBuffers(int count) { //! Color attachment 0 addColorAttachment(0); }
void LLRenderTarget::allocate(U32 resx, U32 resy, U32 color_fmt, bool depth, bool stencil, LLTexUnit::eTextureType usage, bool use_fbo, S32 samples) { stop_glerror(); release(); mResX = resx; mResY = resy; mStencil = stencil; mUsage = usage; mUseDepth = depth; mSamples = samples; mSamples = gGLManager.getNumFBOFSAASamples(mSamples); if (mSamples > 1 && gGLManager.mHasTextureMultisample) { mUsage = LLTexUnit::TT_MULTISAMPLE_TEXTURE; //no support for multisampled stencil targets yet mStencil = false; } else { mSamples = 0; } if ((sUseFBO || use_fbo) && gGLManager.mHasFramebufferObject) { if (depth) { stop_glerror(); allocateDepth(); stop_glerror(); } glGenFramebuffers(1, (GLuint *) &mFBO); if (mDepth) { glBindFramebuffer(GL_FRAMEBUFFER, mFBO); if (mStencil) { glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, mDepth); stop_glerror(); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, mDepth); stop_glerror(); } else { glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, LLTexUnit::getInternalType(mUsage), mDepth, 0); stop_glerror(); } glBindFramebuffer(GL_FRAMEBUFFER, 0); } stop_glerror(); } addColorAttachment(color_fmt); }