Sure!
Code That renders to shadow map:
void Demo4::RenderShadowScene(){ static D3DXMATRIX World; D3DXMatrixIdentity(&World); HR(mFX[mSHFX]->SetFloatArray("LightPos", mSunPos, 3)); HR(mFX[mSHFX]->SetMatrix("World", &(World))); HR(mFX[mSHFX]->SetMatrix("LWorldViewProj", &(World*mLViewProjMat))); HR(mFX[mSHFX]->CommitChanges()); HR(mFX[mSHFX]->BeginPass(0)); HR(mScene->DrawSubset(0)); HR(mScene->DrawSubset(1)); HR(mScene->DrawSubset(2)); HR(mFX[mSHFX]->EndPass());}void Demo4::CreateShadowMap(){ static D3DXMATRIX ViewMat; static D3DXMATRIX ProjMat; static UINT totalPasses; float farZ = 5000.0f; static D3DXVECTOR3 PositiveLookX = D3DXVECTOR3(1.0f, 0.0f, 0.0f); static D3DXVECTOR3 PositiveLookY = D3DXVECTOR3(0.0f, 1.0f, 0.0f); static D3DXVECTOR3 PositiveLookZ = D3DXVECTOR3(0.0f, 0.0f, 1.0f); static D3DXVECTOR3 NegativeLookX = D3DXVECTOR3(-1.0f, 0.0f, 0.0f); static D3DXVECTOR3 NegativeLookY = D3DXVECTOR3(0.0f, -1.0f, 0.0f); static D3DXVECTOR3 NegativeLookZ = D3DXVECTOR3(0.0f, 0.0f, -1.0f); mLightCam.SetPosition(mSunPos); D3DXMatrixPerspectiveFovLH( &ProjMat, D3DX_PI / 2.0f, 1.0f, 1.0f, farZ ); //enable red channel for color write HR(mD3dDevice->SetRenderState(D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_RED )); HR(mFX[mSHFX]->SetTechnique("TechDepthOut")); HR(mFX[mSHFX]->Begin(&totalPasses, 0)); //Render To Positive X Face mLightCam.SetLook(PositiveLookX); mLightCam.SetUp(PositiveLookY); mLightCam.SetRight(NegativeLookZ); ViewMat = mLightCam.GetMatrix(); mCubeDepthMap.SetActiveFace(CubeRenderTarget::CUBEMAP_FACE_P_X); HR(mD3dDevice->Clear(0,0,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, 0x00000000, 1.0f, 0)); mLViewProjMat = ViewMat*ProjMat; RenderShadowScene(); //Render To Negative X Face mLightCam.SetLook(NegativeLookX); mLightCam.SetUp(PositiveLookY); mLightCam.SetRight(PositiveLookZ); ViewMat = mLightCam.GetMatrix(); mCubeDepthMap.SetActiveFace(CubeRenderTarget::CUBEMAP_FACE_N_X); HR(mD3dDevice->Clear(0,0,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, 0x00000000, 1.0f, 0)); mLViewProjMat = ViewMat*ProjMat; RenderShadowScene(); //Render To Positive Y Face mLightCam.SetLook(PositiveLookY); mLightCam.SetUp(NegativeLookZ); mLightCam.SetRight(PositiveLookX); ViewMat = mLightCam.GetMatrix(); mCubeDepthMap.SetActiveFace(CubeRenderTarget::CUBEMAP_FACE_P_Y); HR(mD3dDevice->Clear(0,0,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, 0x00000000, 1.0f, 0)); mLViewProjMat = ViewMat*ProjMat; RenderShadowScene(); //Render To Negative Y Face mLightCam.SetLook(NegativeLookY); mLightCam.SetUp(NegativeLookZ); mLightCam.SetRight(NegativeLookX); ViewMat = mLightCam.GetMatrix(); mCubeDepthMap.SetActiveFace(CubeRenderTarget::CUBEMAP_FACE_N_Y); HR(mD3dDevice->Clear(0,0,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, 0x00000000, 1.0f, 0)); mLViewProjMat = ViewMat*ProjMat; RenderShadowScene(); //Render To Positive Z Face mLightCam.SetLook(PositiveLookZ); mLightCam.SetUp(PositiveLookY); mLightCam.SetRight(PositiveLookX); ViewMat = mLightCam.GetMatrix(); mCubeDepthMap.SetActiveFace(CubeRenderTarget::CUBEMAP_FACE_P_Z); HR(mD3dDevice->Clear(0,0,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, 0x00000000, 1.0f, 0)); mLViewProjMat = ViewMat*ProjMat; RenderShadowScene(); //Render To Negative Z Face mLightCam.SetLook(NegativeLookZ); mLightCam.SetUp(PositiveLookY); mLightCam.SetRight(NegativeLookX); ViewMat = mLightCam.GetMatrix(); mCubeDepthMap.SetActiveFace(CubeRenderTarget::CUBEMAP_FACE_N_Z); HR(mD3dDevice->Clear(0,0,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, 0x00000000,1.0f, 0)); mLViewProjMat = ViewMat*ProjMat; RenderShadowScene(); mFX[mSHFX]->End(); //enable color writes HR(mD3dDevice->SetRenderState(D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_ALPHA| D3DCOLORWRITEENABLE_RED| D3DCOLORWRITEENABLE_GREEN| D3DCOLORWRITEENABLE_BLUE));}
The camera class GetMatrix() Function (i use same class for my viewer camera):
D3DXMATRIX Camera::GetMatrix(){ if(mChanged)//Little optimization { //Get right vector D3DXVec3Cross(&mRight, &mUp, &mLook); D3DXVec3Normalize(&mRight, &mRight); //Get look vector D3DXVec3Cross(&mLook, &mRight, &mUp); D3DXVec3Normalize(&mLook, &mLook); //Get up vector D3DXVec3Cross(&mUp, &mLook, &mRight); D3DXVec3Normalize(&mUp, &mUp); mMat(0, 0) = mRight.x; mMat(1, 0) = mRight.y; mMat(2, 0) = mRight.z; mMat(3, 0) = -D3DXVec3Dot(&mPos, &mRight);; mMat(0, 1) = mUp.x; mMat(1, 1) = mUp.y; mMat(2, 1) = mUp.z; mMat(3, 1) = -D3DXVec3Dot(&mPos, &mUp);; mMat(0, 2) = mLook.x; mMat(1, 2) = mLook.y; mMat(2, 2) = mLook.z; mMat(3, 2) = -D3DXVec3Dot(&mPos, &mLook);; mMat(0,3) = 0.0f; mMat(1,3) = 0.0f; mMat(2,3) = 0.0f; mMat(3,3) = 1.0f; mChanged = false; } return mMat;}
Thanks! :)
PS: sorry for the long code though.