Ssao::~Ssao() { ReleaseCOM(mScreenQuadVB); ReleaseCOM(mScreenQuadIB); ReleaseCOM(mRandomVectorSRV); ReleaseTextureViews(); }
void Ssao::BuildTextureViews() { ReleaseTextureViews(); D3D11_TEXTURE2D_DESC texDesc; texDesc.Width = mRenderTargetWidth; texDesc.Height = mRenderTargetHeight; texDesc.MipLevels = 1; texDesc.ArraySize = 1; texDesc.Format = DXGI_FORMAT_R16G16B16A16_FLOAT; texDesc.SampleDesc.Count = 1; texDesc.SampleDesc.Quality = 0; texDesc.Usage = D3D11_USAGE_DEFAULT; texDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET; texDesc.CPUAccessFlags = 0; texDesc.MiscFlags = 0; ID3D11Texture2D* normalDepthTex = 0; HR(md3dDevice->CreateTexture2D(&texDesc, 0, &normalDepthTex)); HR(md3dDevice->CreateShaderResourceView(normalDepthTex, 0, &mNormalDepthSRV)); HR(md3dDevice->CreateRenderTargetView(normalDepthTex, 0, &mNormalDepthRTV)); // view saves a reference. ReleaseCOM(normalDepthTex); // Render ambient map at half resolution. texDesc.Width = mRenderTargetWidth / 2; texDesc.Height = mRenderTargetHeight / 2; texDesc.Format = DXGI_FORMAT_R16_FLOAT; ID3D11Texture2D* ambientTex0 = 0; HR(md3dDevice->CreateTexture2D(&texDesc, 0, &ambientTex0)); HR(md3dDevice->CreateShaderResourceView(ambientTex0, 0, &mAmbientSRV0)); HR(md3dDevice->CreateRenderTargetView(ambientTex0, 0, &mAmbientRTV0)); ID3D11Texture2D* ambientTex1 = 0; HR(md3dDevice->CreateTexture2D(&texDesc, 0, &ambientTex1)); HR(md3dDevice->CreateShaderResourceView(ambientTex1, 0, &mAmbientSRV1)); HR(md3dDevice->CreateRenderTargetView(ambientTex1, 0, &mAmbientRTV1)); // view saves a reference. ReleaseCOM(ambientTex0); ReleaseCOM(ambientTex1); }