Thanks. I think I'm already doing that within my blur function (see the code paste above).
Or should I also do it within rendering the base scene initially, to a texture?
Strangely the warning only appears when I render the initial scene without textures.
This is the main draw code:
void BlurApp::DrawScene()
{
ID3D11RenderTargetView *renderTargets[1] = { mOffscreenRTV };
md3dImmediateContext->OMSetRenderTargets(1, renderTargets, mDepthStencilView);
md3dImmediateContext->ClearRenderTargetView(mOffscreenRTV, reinterpret_cast<const float*>(&Colors::Silver));
md3dImmediateContext->ClearDepthStencilView(mDepthStencilView, D3D11_CLEAR_DEPTH|D3D11_CLEAR_STENCIL, 1.0f, 0);
// draw scene to offscreen texture
DrawWrapper();
// restore backbuffer. offscreen RT will serve as input for compute shader, unbind it first
renderTargets[0] = mRenderTargetView;
md3dImmediateContext->OMSetRenderTargets(1, renderTargets, mDepthStencilView);
// mBlur.SetGaussianWeights(4.0f);
mBlur.BlurInPlace(md3dImmediateContext, mOffscreenSRV, mOffscreenUAV, 2);
// draw fullscreen quad with blurred texture on it
md3dImmediateContext->ClearRenderTargetView(mRenderTargetView, reinterpret_cast<const float*>(&Colors::Silver));
md3dImmediateContext->ClearDepthStencilView(mDepthStencilView, D3D11_CLEAR_DEPTH|D3D11_CLEAR_STENCIL, 1.0f, 0);
DrawScreenQuad();
HR(mSwapChain->Present(0, 0));
}
Here's the code of rendering the initial scene:
void BlurApp::DrawWrapper()
{
md3dImmediateContext->IASetInputLayout(InputLayouts::mBasic32);
md3dImmediateContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
UINT stride = sizeof(Vertex::Basic32);
UINT offset = 0;
float blendFactor[] = {0.0f, 0.0f, 0.0f, 0.0f};
XMMATRIX view = XMLoadFloat4x4(&mView);
XMMATRIX proj = XMLoadFloat4x4(&mProj);
XMMATRIX viewProj = view*proj;
// per frame constants
Effects::mBasicFX->SetDirLights(mDirLights);
Effects::mBasicFX->SetEyePosW(mEyePosW);
Effects::mBasicFX->SetFogColor(Colors::Silver);
Effects::mBasicFX->SetFogStart(15.0f);
Effects::mBasicFX->SetFogRange(175.0f);
// figure out correct technique
ID3DX11EffectTechnique* boxTech = NULL; //Effects::mBasicFX->mLight3Tech; //mLight1TexTech;;
ID3DX11EffectTechnique* landAndWavesTech = NULL; //Effects::mBasicFX->mLight3Tech; //mLight1TexTech;
switch(mRenderOptions)
{
case RenderOptions::Lighting:
boxTech = Effects::mBasicFX->mLight3Tech;
landAndWavesTech = Effects::mBasicFX->mLight3Tech;
break;
case RenderOptions::Textures:
boxTech = Effects::mBasicFX->mLight3TexAlphaClipTech;
landAndWavesTech = Effects::mBasicFX->mLight3TexTech;
break;
case RenderOptions::TexturesAndFog:
boxTech = Effects::mBasicFX->mLight3TexAlphaClipFogTech;
landAndWavesTech = Effects::mBasicFX->mLight3TexFogTech;
break;
}
D3DX11_TECHNIQUE_DESC techDesc;
// draw box
boxTech->GetDesc(&techDesc);
for(UINT p=0;p<techDesc.Passes;++p)
{
md3dImmediateContext->IASetVertexBuffers(0, 1, &mBoxVtxBuffer, &stride, &offset);
md3dImmediateContext->IASetIndexBuffer(mBoxIndexBuffer, DXGI_FORMAT_R32_UINT, 0);
// Set per object constants.
XMMATRIX world = XMLoadFloat4x4(&mBoxWorld);
XMMATRIX worldInvTranspose = CMathHelper::InverseTranspose(world);
XMMATRIX worldViewProj = world * view * proj;
Effects::mBasicFX->SetWorld(world);
Effects::mBasicFX->SetWorldInvTranspose(worldInvTranspose);
Effects::mBasicFX->SetWorldViewProj(worldViewProj);
Effects::mBasicFX->SetTexTransform(XMMatrixIdentity());
Effects::mBasicFX->SetMaterial(mBoxMat);
Effects::mBasicFX->SetDiffuseMap(mBoxMapSRV);
md3dImmediateContext->RSSetState(RenderStates::mNoCullRS);
boxTech->GetPassByIndex(p)->Apply(0, md3dImmediateContext);
md3dImmediateContext->DrawIndexed(36, 0, 0);
// restore render state(s)
md3dImmediateContext->RSSetState(0);
}
// draw hills and water, with texture + fog (no alpha clipping needed)
landAndWavesTech->GetDesc(&techDesc);
for(UINT p=0;p<techDesc.Passes;++p)
{
// hills first
md3dImmediateContext->IASetVertexBuffers(0, 1, &mLandVtxBuffer, &stride, &offset);
md3dImmediateContext->IASetIndexBuffer(mLandIndexBuffer, DXGI_FORMAT_R32_UINT, 0);
// per object shader constants
XMMATRIX world = XMLoadFloat4x4(&mLandWorld);
XMMATRIX worldInvTranspose = CMathHelper::InverseTranspose(world);
XMMATRIX worldViewProj = world*view*proj;
Effects::mBasicFX->SetWorld(world);
Effects::mBasicFX->SetWorldInvTranspose(worldInvTranspose);
Effects::mBasicFX->SetWorldViewProj(worldViewProj);
Effects::mBasicFX->SetTexTransform(XMLoadFloat4x4(&mGrassTexTransform));
Effects::mBasicFX->SetMaterial(mLandMat);
Effects::mBasicFX->SetDiffuseMap(mGrassMapSRV);
landAndWavesTech->GetPassByIndex(p)->Apply(0, md3dImmediateContext);
md3dImmediateContext->DrawIndexed(mLandIndexCount, 0, 0);
// waves
md3dImmediateContext->IASetVertexBuffers(0, 1, &mWavesVtxBuffer, &stride, &offset);
md3dImmediateContext->IASetIndexBuffer(mWavesIndexBuffer, DXGI_FORMAT_R32_UINT, 0);
// Set per object constants.
world = XMLoadFloat4x4(&mWavesWorld);
worldInvTranspose = CMathHelper::InverseTranspose(world);
worldViewProj = world * view * proj;
Effects::mBasicFX->SetWorld(world);
Effects::mBasicFX->SetWorldInvTranspose(worldInvTranspose);
Effects::mBasicFX->SetWorldViewProj(worldViewProj);
Effects::mBasicFX->SetTexTransform(XMLoadFloat4x4(&mWaterTexTransform));
Effects::mBasicFX->SetMaterial(mWavesMat);
Effects::mBasicFX->SetDiffuseMap(mWavesMapSRV);
md3dImmediateContext->OMSetBlendState(RenderStates::mTransparentBS, blendFactor, 0xffffffff);
landAndWavesTech->GetPassByIndex(p)->Apply(0, md3dImmediateContext);
md3dImmediateContext->DrawIndexed(3 * mWaves.TriangleCount(), 0, 0);
// restore (blend) states
md3dImmediateContext->OMSetBlendState(0, blendFactor, 0xffffffff);
}
HR(mSwapChain->Present(0, 0));
}
Maybe I can set the rendertarget in the beginning of the draw scene to NULL first.