void GaussianMain::ShowImage(ID3D11DeviceContext* pd3dImmediateContext) { // Output to default render target ID3D11RenderTargetView* rtv_array[1] = {g_pRTV_Default}; pd3dImmediateContext->OMSetRenderTargets(1, rtv_array, g_pDSV_Default); pd3dImmediateContext->RSSetViewports(1, g_VP_Default); ID3DX11EffectTechnique* pTech = g_pFX_Render->GetTechniqueByName("Tech_ShowImage"); ID3DX11EffectPass* pPass = g_bColorBlur ? pTech->GetPassByName("Pass_ShowColorImage") : pTech->GetPassByName("Pass_ShowMonoImage"); if (g_bColorBlur) g_pFX_Render->GetVariableByName("g_texColorInput")->AsShaderResource()->SetResource(g_pSRV_Output); else g_pFX_Render->GetVariableByName("g_texMonoInput")->AsShaderResource()->SetResource(g_pSRV_Output); UINT strides = sizeof(SCREEN_VERTEX); UINT offsets = 0; ID3D11Buffer* pBuffers[1] = {g_pScreenQuadVB}; pd3dImmediateContext->IASetInputLayout(g_pQuadLayout); pd3dImmediateContext->IASetVertexBuffers(0, 1, pBuffers, &strides, &offsets); pd3dImmediateContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP); pPass->Apply(0, pd3dImmediateContext); pd3dImmediateContext->Draw( 4, 0 ); }
void GaussianMain::ApplyGaussianFilter(ID3D11DeviceContext* pd3dImmediateContext) { D3D11_TEXTURE2D_DESC tex_desc; g_pTex_Scene->GetDesc(&tex_desc); float box_width = CalculateBoxFilterWidth(g_FilterRadius, g_NumApproxPasses); float half_box_width = box_width * 0.5f; float frac_half_box_width = (half_box_width + 0.5f) - (int)(half_box_width + 0.5f); float inv_frac_half_box_width = 1.0f - frac_half_box_width; float rcp_box_width = 1.0f / box_width; // Step 1. Vertical passes: Each thread group handles a colomn in the image ID3DX11EffectTechnique* pTech = g_pFX_GaussianCol->GetTechniqueByName("Tech_GaussianFilter"); // Input texture g_pFX_GaussianCol->GetVariableByName("g_texInput")->AsShaderResource()->SetResource(g_pSRV_Scene); // Output texture g_pFX_GaussianCol->GetVariableByName("g_rwtOutput")->AsUnorderedAccessView()->SetUnorderedAccessView(g_pUAV_Output); g_pFX_GaussianCol->GetVariableByName("g_NumApproxPasses")->AsScalar()->SetInt(g_NumApproxPasses - 1); g_pFX_GaussianCol->GetVariableByName("g_HalfBoxFilterWidth")->AsScalar()->SetFloat(half_box_width); g_pFX_GaussianCol->GetVariableByName("g_FracHalfBoxFilterWidth")->AsScalar()->SetFloat(frac_half_box_width); g_pFX_GaussianCol->GetVariableByName("g_InvFracHalfBoxFilterWidth")->AsScalar()->SetFloat(inv_frac_half_box_width); g_pFX_GaussianCol->GetVariableByName("g_RcpBoxFilterWidth")->AsScalar()->SetFloat(rcp_box_width); // Select pass ID3DX11EffectPass* pPass = g_bColorBlur ? pTech->GetPassByName("Pass_GaussianColor") : pTech->GetPassByName("Pass_GaussianMono"); pPass->Apply(0, pd3dImmediateContext); pd3dImmediateContext->Dispatch(tex_desc.Width, 1, 1); // Unbound CS resource and output ID3D11ShaderResourceView* srv_array[] = {NULL, NULL, NULL, NULL}; pd3dImmediateContext->CSSetShaderResources(0, 4, srv_array); ID3D11UnorderedAccessView* uav_array[] = {NULL, NULL, NULL, NULL}; pd3dImmediateContext->CSSetUnorderedAccessViews(0, 4, uav_array, NULL); // Step 2. Horizontal passes: Each thread group handles a row in the image pTech = g_pFX_GaussianRow->GetTechniqueByName("Tech_GaussianFilter"); // Input texture g_pFX_GaussianRow->GetVariableByName("g_texInput")->AsShaderResource()->SetResource(g_pSRV_Scene); // Output texture g_pFX_GaussianRow->GetVariableByName("g_rwtOutput")->AsUnorderedAccessView()->SetUnorderedAccessView(g_pUAV_Output); g_pFX_GaussianRow->GetVariableByName("g_NumApproxPasses")->AsScalar()->SetInt(g_NumApproxPasses - 1); g_pFX_GaussianRow->GetVariableByName("g_HalfBoxFilterWidth")->AsScalar()->SetFloat(half_box_width); g_pFX_GaussianRow->GetVariableByName("g_FracHalfBoxFilterWidth")->AsScalar()->SetFloat(frac_half_box_width); g_pFX_GaussianRow->GetVariableByName("g_InvFracHalfBoxFilterWidth")->AsScalar()->SetFloat(inv_frac_half_box_width); g_pFX_GaussianRow->GetVariableByName("g_RcpBoxFilterWidth")->AsScalar()->SetFloat(rcp_box_width); // Select pass pPass = g_bColorBlur ? pTech->GetPassByName("Pass_GaussianColor") : pTech->GetPassByName("Pass_GaussianMono"); pPass->Apply(0, pd3dImmediateContext); pd3dImmediateContext->Dispatch(tex_desc.Height, 1, 1); // Unbound CS resource and output pd3dImmediateContext->CSSetShaderResources(0, 4, srv_array); pd3dImmediateContext->CSSetUnorderedAccessViews(0, 4, uav_array, NULL); }