void FGLRenderBuffers::CreateScene(int width, int height, int samples) { ClearScene(); if (samples > 1) mSceneMultisample = CreateRenderBuffer("SceneMultisample", GL_RGBA16F, samples, width, height); mSceneDepthStencil = CreateRenderBuffer("SceneDepthStencil", GL_DEPTH24_STENCIL8, samples, width, height); mSceneFB = CreateFrameBuffer("SceneFB", samples > 1 ? mSceneMultisample : mPipelineTexture[0], mSceneDepthStencil, samples > 1); }
void FGLRenderBuffers::CreateScene(int width, int height, int samples, bool needsSceneTextures) { ClearScene(); if (samples > 1) { if (needsSceneTextures) { mSceneMultisample = Create2DMultisampleTexture("SceneMultisample", GL_RGBA16F, width, height, samples, false); mSceneDepthStencil = Create2DMultisampleTexture("SceneDepthStencil", GL_DEPTH24_STENCIL8, width, height, samples, false); mSceneFog = Create2DMultisampleTexture("SceneFog", GL_RGBA8, width, height, samples, false); mSceneNormal = Create2DMultisampleTexture("SceneNormal", GL_RGB10_A2, width, height, samples, false); mSceneFB = CreateFrameBuffer("SceneFB", mSceneMultisample, 0, 0, mSceneDepthStencil, true); mSceneDataFB = CreateFrameBuffer("SceneGBufferFB", mSceneMultisample, mSceneFog, mSceneNormal, mSceneDepthStencil, true); } else { mSceneMultisample = CreateRenderBuffer("SceneMultisample", GL_RGBA16F, width, height, samples); mSceneDepthStencil = CreateRenderBuffer("SceneDepthStencil", GL_DEPTH24_STENCIL8, width, height, samples); mSceneFB = CreateFrameBuffer("SceneFB", mSceneMultisample, mSceneDepthStencil, true); mSceneDataFB = CreateFrameBuffer("SceneGBufferFB", mSceneMultisample, mSceneDepthStencil, true); } } else { if (needsSceneTextures) { mSceneDepthStencil = Create2DTexture("SceneDepthStencil", GL_DEPTH24_STENCIL8, width, height); mSceneFog = Create2DTexture("SceneFog", GL_RGBA8, width, height); mSceneNormal = Create2DTexture("SceneNormal", GL_RGB10_A2, width, height); mSceneFB = CreateFrameBuffer("SceneFB", mPipelineTexture[0], 0, 0, mSceneDepthStencil, false); mSceneDataFB = CreateFrameBuffer("SceneGBufferFB", mPipelineTexture[0], mSceneFog, mSceneNormal, mSceneDepthStencil, false); } else { mSceneDepthStencil = CreateRenderBuffer("SceneDepthStencil", GL_DEPTH24_STENCIL8, width, height); mSceneFB = CreateFrameBuffer("SceneFB", mPipelineTexture[0], mSceneDepthStencil, false); mSceneDataFB = CreateFrameBuffer("SceneGBufferFB", mPipelineTexture[0], mSceneDepthStencil, false); } } }
GLuint FGLRenderBuffers::CreateRenderBuffer(const FString &name, GLuint format, int width, int height, int samples) { if (samples <= 1) return CreateRenderBuffer(name, format, width, height); GLuint handle = 0; glGenRenderbuffers(1, &handle); glBindRenderbuffer(GL_RENDERBUFFER, handle); FGLDebug::LabelObject(GL_RENDERBUFFER, handle, name); glRenderbufferStorageMultisample(GL_RENDERBUFFER, samples, format, width, height); return handle; }
PPGLRenderBuffer FGLRenderBuffers::CreateRenderBuffer(const char *name, GLuint format, int width, int height, int samples) { if (samples <= 1) return CreateRenderBuffer(name, format, width, height); PPGLRenderBuffer buf; glGenRenderbuffers(1, &buf.handle); glBindRenderbuffer(GL_RENDERBUFFER, buf.handle); FGLDebug::LabelObject(GL_RENDERBUFFER, buf.handle, name); glRenderbufferStorageMultisample(GL_RENDERBUFFER, samples, format, width, height); return buf; }
void CWinRenderer::ManageTextures() { if( m_NumYV12Buffers < m_neededBuffers ) { for(int i = m_NumYV12Buffers; i<m_neededBuffers;i++) CreateRenderBuffer(i); m_NumYV12Buffers = m_neededBuffers; } else if( m_NumYV12Buffers > m_neededBuffers ) { for (int i = m_NumYV12Buffers - 1; i >= m_neededBuffers; i--) DeleteRenderBuffer(i); m_NumYV12Buffers = m_neededBuffers; m_iYV12RenderBuffer = m_iYV12RenderBuffer % m_NumYV12Buffers; } }