void FGLRenderBuffers::CreateExposureLevels(int width, int height) { ClearExposureLevels(); int i = 0; do { width = MAX(width / 2, 1); height = MAX(height / 2, 1); FString textureName, fbName; textureName.Format("Exposure.Texture%d", i); fbName.Format("Exposure.Framebuffer%d", i); i++; FGLExposureTextureLevel level; level.Width = width; level.Height = height; level.Texture = Create2DTexture(textureName, GL_R32F, level.Width, level.Height); level.Framebuffer = CreateFrameBuffer(fbName, level.Texture); ExposureLevels.Push(level); } while (width > 1 || height > 1); ExposureTexture = Create2DTexture("Exposure.CameraTexture", GL_R32F, 1, 1); ExposureFB = CreateFrameBuffer("Exposure.CameraFB", ExposureTexture); FirstExposureFrame = true; }
FGLRenderBuffers::~FGLRenderBuffers() { ClearScene(); ClearPipeline(); ClearEyeBuffers(); ClearBloom(); ClearExposureLevels(); }
bool FGLRenderBuffers::Setup(int width, int height, int sceneWidth, int sceneHeight) { if (gl_renderbuffers != BuffersActive) { if (BuffersActive) glBindFramebuffer(GL_FRAMEBUFFER, mOutputFB); BuffersActive = gl_renderbuffers; GLRenderer->mShaderManager->ResetFixedColormap(); } if (!IsEnabled()) return false; if (width <= 0 || height <= 0) I_FatalError("Requested invalid render buffer sizes: screen = %dx%d", width, height); int samples = clamp((int)gl_multisample, 0, mMaxSamples); bool needsSceneTextures = (gl_ssao != 0); GLint activeTex; GLint textureBinding; glGetIntegerv(GL_ACTIVE_TEXTURE, &activeTex); glActiveTexture(GL_TEXTURE0); glGetIntegerv(GL_TEXTURE_BINDING_2D, &textureBinding); if (width != mWidth || height != mHeight) CreatePipeline(width, height); if (width != mWidth || height != mHeight || mSamples != samples || mSceneUsesTextures != needsSceneTextures) CreateScene(width, height, samples, needsSceneTextures); mWidth = width; mHeight = height; mSamples = samples; mSceneUsesTextures = needsSceneTextures; // Bloom bluring buffers need to match the scene to avoid bloom bleeding artifacts if (mSceneWidth != sceneWidth || mSceneHeight != sceneHeight) { CreateBloom(sceneWidth, sceneHeight); CreateExposureLevels(sceneWidth, sceneHeight); CreateAmbientOcclusion(sceneWidth, sceneHeight); mSceneWidth = sceneWidth; mSceneHeight = sceneHeight; } glBindTexture(GL_TEXTURE_2D, textureBinding); glActiveTexture(activeTex); glBindRenderbuffer(GL_RENDERBUFFER, 0); glBindFramebuffer(GL_FRAMEBUFFER, 0); if (FailedCreate) { ClearScene(); ClearPipeline(); ClearEyeBuffers(); ClearBloom(); ClearExposureLevels(); mWidth = 0; mHeight = 0; mSamples = 0; mSceneWidth = 0; mSceneHeight = 0; } return !FailedCreate; }