/** Draws this effect to the given buffer */ XRESULT D3D11PFX_HDR::Render(RenderToTextureBuffer* fxbuffer) { D3D11GraphicsEngine* engine = (D3D11GraphicsEngine *)Engine::GraphicsEngine; Engine::GAPI->GetRendererState()->BlendState.BlendEnabled = false; Engine::GAPI->GetRendererState()->BlendState.SetDirty(); // Save old rendertargets ID3D11RenderTargetView* oldRTV = NULL; ID3D11DepthStencilView* oldDSV = NULL; engine->GetContext()->OMGetRenderTargets(1, &oldRTV, &oldDSV); RenderToTextureBuffer* lum = CalcLuminance(); CreateBloom(lum); // Copy the original image to our temp-buffer FxRenderer->CopyTextureToRTV(engine->GetHDRBackBuffer()->GetShaderResView(), FxRenderer->GetTempBuffer()->GetRenderTargetView(), engine->GetResolution()); // Bind scene and luminance FxRenderer->GetTempBuffer()->BindToPixelShader(engine->GetContext(), 0); lum->BindToPixelShader(engine->GetContext(), 1); // Bind bloom FxRenderer->GetTempBufferDS4_1()->BindToPixelShader(engine->GetContext(), 2); // Draw the HDR-Shader D3D11PShader* hps = engine->GetShaderManager()->GetPShader("PS_PFX_HDR"); hps->Apply(); HDRSettingsConstantBuffer hcb; hcb.HDR_LumWhite = Engine::GAPI->GetRendererState()->RendererSettings.HDRLumWhite; hcb.HDR_MiddleGray = Engine::GAPI->GetRendererState()->RendererSettings.HDRMiddleGray; hcb.HDR_Threshold = Engine::GAPI->GetRendererState()->RendererSettings.BloomThreshold; hcb.HDR_BloomStrength = Engine::GAPI->GetRendererState()->RendererSettings.BloomStrength; hps->GetConstantBuffer()[0]->UpdateBuffer(&hcb); hps->GetConstantBuffer()[0]->BindToPixelShader(0); FxRenderer->CopyTextureToRTV(FxRenderer->GetTempBuffer()->GetShaderResView(), oldRTV, engine->GetResolution(), true); // Show lumBuffer //FxRenderer->CopyTextureToRTV(currentLum->GetShaderResView(), oldRTV, INT2(LUM_SIZE,LUM_SIZE), false); // Restore rendertargets ID3D11ShaderResourceView* srv = NULL; engine->GetContext()->PSSetShaderResources(1,1,&srv); engine->GetContext()->OMSetRenderTargets(1, &oldRTV, oldDSV); if(oldRTV)oldRTV->Release(); if(oldDSV)oldDSV->Release(); return XR_SUCCESS; }
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; }