Hi,
I played around with the order af drawing stuff and setting states in my engine.
There are 3 main to be rendered things:
1 - opaque objects
2 - blended objects
3 - skybox
Preferably I want to render things in that order, but when I do this, the blended objects disappear/ are not visible.
If I switch 3 and 2, skybox first, then blended objects, it looks all fine.
Does someone have an idea why this happens/ which state I'm overlooking?
Or maybe the order 1, 3 is 2 is better anyway? (and why?)
Here's the code, working:
/** OPAQUE: RENDER SCENE USING BASE UBERSHADER **/
mStateMachine.SetRenderState(D3DRS_ZWRITEENABLE, TRUE);
mStateMachine.SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
mStateMachine.SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_WRAP);
mStateMachine.SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP);
if(!RenderScene(*pD3dscene, "SingleTexTech", mRenderQueue.GetRefRenderablesOpaque(), mRenderQueue.GetRefBucketOpaque())) return false;
/** RENDER SKYBOX **/
if(pD3dscene->HasSkybox())
{
if(!pD3dscene->mSkyBox.Render(pCam->GetPosition(), *pCam)) return false;
mStateMachine.SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
mStateMachine.SetRenderState(D3DRS_ZWRITEENABLE, FALSE);
mStateMachine.SetRenderState(D3DRS_CULLMODE, D3DCULL_CW);
mStateMachine.SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_MIRROR);
mStateMachine.SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_MIRROR);
}
/** BLENDED: RENDER SCENE USING UBERSHADER **/
mStateMachine.SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);
mStateMachine.SetRenderState(D3DRS_ZWRITEENABLE, FALSE);
mStateMachine.SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
if(!RenderScene(*pD3dscene, "SingleTexTech", mRenderQueue.GetRefRenderablesBlended(), mRenderQueue.GetRefBucketBlendedSorted())) return false;
And not working (blended objects first):
/** OPAQUE: RENDER SCENE USING BASE UBERSHADER **/
mStateMachine.SetRenderState(D3DRS_ZWRITEENABLE, TRUE);
mStateMachine.SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
mStateMachine.SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_WRAP);
mStateMachine.SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP);
if(!RenderScene(*pD3dscene, "SingleTexTech", mRenderQueue.GetRefRenderablesOpaque(), mRenderQueue.GetRefBucketOpaque())) return false;
/** BLENDED: RENDER SCENE USING UBERSHADER **/
mStateMachine.SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);
mStateMachine.SetRenderState(D3DRS_ZWRITEENABLE, FALSE);
mStateMachine.SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
if(!RenderScene(*pD3dscene, "SingleTexTech", mRenderQueue.GetRefRenderablesBlended(), mRenderQueue.GetRefBucketBlendedSorted())) return false;
/** RENDER SKYBOX **/
if(pD3dscene->HasSkybox())
{
if(!pD3dscene->mSkyBox.Render(pCam->GetPosition(), *pCam)) return false;
mStateMachine.SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
mStateMachine.SetRenderState(D3DRS_ZWRITEENABLE, FALSE);
mStateMachine.SetRenderState(D3DRS_CULLMODE, D3DCULL_CW);
mStateMachine.SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_MIRROR);
mStateMachine.SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_MIRROR);
}