I added terrain rendering to my sky+lensflare rendering pipeline. I render terrain onto a render-target and bind it to the backbuffer as a texture. I do this in pixel shader of the fullscreen quad.
return txTerrain.Sample(samLinear, Input.TextureCoords)+ txSkyDome.Sample(samLinear, Input.TextureCoords) + float4(LensFlareHalo * txDirty.Sample(samLinear, Input.TextureCoords).rgb * Intensity, 1);
The problem is, the terrain is blended with sky. How do I fix this?
pImmediateContext->OMSetDepthStencilState(pDSState_DD, 1); //disable depth buffer
// render sky dome
pImmediateContext->OMSetRenderTargets(1, &pSkyDomeRTV, pDepthStencilView);
pImmediateContext->ClearRenderTargetView(pSkyDomeRTV, Colors::Black);
pImmediateContext->ClearDepthStencilView(pDepthStencilView, D3D11_CLEAR_DEPTH, 1.0f, 0);
//creating the sky texture in the cs shader
float Theta = .2f;//XM_PI*(float)tElapsed/50;
float Phi = XM_PIDIV4;
CSCONSTANTBUF cscb;
cscb.vSun = XMFLOAT3(cos(Theta)*cos(Phi), sin(Theta), cos(Theta)*sin(Phi));
cscb.MieCoeffs = XMFLOAT3((float)MieCoefficient(m, AerosolRadius, 680), (float)MieCoefficient(m, AerosolRadius, 530), (float)MieCoefficient(m, AerosolRadius, 470));
cscb.RayleighCoeffs = XMFLOAT3((float)RayleighCoefficient(680), (float)RayleighCoefficient(530), (float)RayleighCoefficient(470));
cscb.fHeight = 10;
cscb.fWeight = 10;
cscb.fWeight2 = 10;
pImmediateContext->UpdateSubresource( pCSConstBuffer, 0, NULL, &cscb, 0, 0 );
UINT UAVCounts = 0;
pImmediateContext->CSSetUnorderedAccessViews(0, 1, &pSkyUAV, &UAVCounts);
pImmediateContext->CSSetConstantBuffers(0, 1, &pCSConstBuffer);
pImmediateContext->CSSetShader(pComputeShader, NULL, 0);
pImmediateContext->Dispatch(8, 8, 1);
pImmediateContext->CSSetUnorderedAccessViews(0, 1, &NULLUAV, 0);
pImmediateContext->CSSetShader(NULL, NULL, 0);
//setting dome relevant vs and ps stuff
pImmediateContext->IASetInputLayout(pVtxLayout);
uiStride = sizeof(VTX);
pImmediateContext->IASetVertexBuffers(0, 1, &pVtxSkyBuffer, &uiStride, &uiOffset);
pImmediateContext->IASetIndexBuffer(pIndxSkyBuffer, DXGI_FORMAT_R32_UINT, 0);
pImmediateContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
pImmediateContext->VSSetConstantBuffers(0, 1, &pVSSkyConstBuffer);
pImmediateContext->VSSetShader(pVtxSkyShader, NULL, 0);
pImmediateContext->PSSetShader(pPixlSkyShader, NULL, 0);
pImmediateContext->PSSetShaderResources(0, 1, &pSkySRV);
pImmediateContext->PSSetSamplers(0, 1, &SampState);
mgWorld = XMMatrixTranslation(MyCAM->GetEye().m128_f32[0], MyCAM->GetEye().m128_f32[1], MyCAM->GetEye().m128_f32[2]);
//drawing the sky dome
VSCONSTANTBUF cb;
cb.mWorld = XMMatrixTranspose( mgWorld );
cb.mView = XMMatrixTranspose( mgView );
cb.mProjection = XMMatrixTranspose( mgProjection );
pImmediateContext->UpdateSubresource( pVSSkyConstBuffer, 0, NULL, &cb, 0, 0 );
pImmediateContext->DrawIndexed((UINT)MyFBX->myInds.size(),0, 0);
pImmediateContext->VSSetShader(0, NULL, 0);
pImmediateContext->PSSetShader(0, NULL, 0);
pImmediateContext->OMSetDepthStencilState(pDSState_DE, 1); //enable depth buffer
// terrain rendering
pImmediateContext->OMSetRenderTargets(1, &pTerRTV, pDepthStencilView);
pImmediateContext->ClearRenderTargetView(pTerRTV, Colors::Black);
pImmediateContext->ClearDepthStencilView(pDepthStencilView, D3D11_CLEAR_DEPTH, 1.0f, 0);
mgWorld = XMMatrixIdentity();// XMMatrixRotationY( (float)tElapsed );
VSCONSTANTBUF tcb;
tcb.mWorld = XMMatrixTranspose( mgWorld );
tcb.mView = XMMatrixTranspose( mgView );
tcb.mProjection = XMMatrixTranspose( mgProjection );
pImmediateContext->UpdateSubresource( pVSTerrainConstBuffer, 0, NULL, &tcb, 0, 0 );
//setting terain relevant vs and ps stuff
pImmediateContext->IASetInputLayout(pVtxTerrainLayout);
uiStride = sizeof(TERVTX);
pImmediateContext->IASetVertexBuffers(2, 1, &pVtxTerrainBuffer, &uiStride, &uiOffset);
pImmediateContext->IASetIndexBuffer(pIndxTerrainBuffer, DXGI_FORMAT_R32_UINT, 0);
pImmediateContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
pImmediateContext->VSSetConstantBuffers(0, 1, &pVSTerrainConstBuffer);
pImmediateContext->VSSetShader(pVtxTerrainShader, NULL, 0);
pImmediateContext->PSSetShader(pPixlTerrainShader, NULL, 0);
pImmediateContext->PSSetShaderResources(0, 1, &pTerrainSRV);
pImmediateContext->PSSetSamplers(0, 1, &TerrainSampState);
pImmediateContext->DrawIndexed((UINT)MyTerrain->myInds.size(), 0, 0);
pImmediateContext->VSSetShader(0, NULL, 0);
pImmediateContext->PSSetShader(0, NULL, 0);
//downsampling stage for lens flare
pImmediateContext->OMSetRenderTargets(1, &pSkyDomeBlurRTV, pDepthStencilView);
pImmediateContext->ClearRenderTargetView(pSkyDomeBlurRTV, Colors::Black);
pImmediateContext->ClearDepthStencilView(pDepthStencilView, D3D11_CLEAR_DEPTH, 1.0f, 0);
uiStride = sizeof(VTX);
pImmediateContext->IASetInputLayout(pVtxCamLayout);
pImmediateContext->IASetVertexBuffers(1, 1, &pVtxCamBuffer, &uiStride, &uiOffset);
pImmediateContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
pImmediateContext->VSSetShader(pVtxSkyBlurShader, NULL, 0);
pImmediateContext->PSSetShader(pPixlSkyBlurShader, NULL, 0);
pImmediateContext->PSSetShaderResources(0, 1, &pSkyDomeSRV);//sky+dome texture
pImmediateContext->PSSetSamplers(0, 1, &CamSampState);
pImmediateContext->Draw(4, 0);
pImmediateContext->VSSetShader(0, NULL, 0);
pImmediateContext->PSSetShader(0, NULL, 0);
//backbuffer stage where lens flare code and terrain texture are set
pImmediateContext->OMSetRenderTargets(1, &pRenderTargetView, pDepthStencilView);
pImmediateContext->ClearRenderTargetView(pRenderTargetView, Colors::Black);
pImmediateContext->ClearDepthStencilView(pDepthStencilView, D3D11_CLEAR_DEPTH, 1.0f, 0);
// uiStride = sizeof(VTX);
// pImmediateContext->IASetInputLayout(pVtxCamLayout);
// pImmediateContext->IASetVertexBuffers(1, 1, &pVtxCamBuffer, &uiStride, &uiOffset);
// pImmediateContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
pImmediateContext->VSSetShader(pVtxCamShader, NULL, 0);
pImmediateContext->PSSetShader(pPixlCamShader, NULL, 0);
pImmediateContext->PSSetShaderResources(0, 1, &pSRV);// dirty texture
pImmediateContext->PSSetShaderResources(1, 1, &pSkyDomeBlurSRV);//sky+dome blurred texture
pImmediateContext->PSSetShaderResources(2, 1, &pSkyDomeSRV);//sky+dome texture
pImmediateContext->PSSetShaderResources(3, 1, &pTerSRV);//terrain texture
pImmediateContext->PSSetSamplers(0, 1, &CamSampState);
pImmediateContext->Draw(4, 0);
pImmediateContext->VSSetShader(0, NULL, 0);
pImmediateContext->PSSetShader(0, NULL, 0);
pSwapChain->Present(0, 0);