?? main.cpp
字號(hào):
}
GameEngine_SceneManager.SetCamera(&GameEngine_Camera);
//彈地球的新位置
if(bSphereDrop){ //小球下墜
vSpherePos.y-=2.0f;
if(vSpherePos.y-5.0f<0){ //小球半徑5.0f
bSphereDrop=false;
vSpherePos.y=0.0f;
}
}
else{ //小球彈起
vSpherePos.y+=2.0f;
if(vSpherePos.y>50.0f){
bSphereDrop=true;
}
}
//設(shè)置投影變換
GameEngine_SceneManager.SetProjection();
//清除Z緩沖區(qū)和Stencil緩沖區(qū)為0
GameEngine_SceneManager.ClearSZ();
//開始渲染
GameEngine_SceneManager.BeginRender();
//渲染墻壁地板
GroundWallRender();
//渲染彈地球
GameEngine_SceneManager.SetTexture(0,NULL);
D3DXMatrixTranslation(&matSphereTrans,vSpherePos.x,vSpherePos.y,vSpherePos.z);
GameEngine_SceneManager.GetDevice()->SetTransform(D3DTS_WORLD,&matSphereTrans);
pSphereMesh->DrawSubset(0);
D3DXMATRIX I;
D3DXMatrixIdentity(&I);
GameEngine_SceneManager.GetDevice()->SetTransform(D3DTS_WORLD,&I);
//渲染前面墻壁的陰影
FrontWallShadowRender();
//渲染地面墻壁的陰影
GroundShadowRender();
//渲染左面墻壁的陰影
LeftWallShadowRender();
//結(jié)束渲染
GameEngine_SceneManager.EndRender();
return true;
}
//渲染墻壁和地面
void GroundWallRender(){
//設(shè)置Stencil測(cè)試的相關(guān)渲染狀態(tài)值
IDirect3DDevice9* pD3DDevice=GameEngine_SceneManager.GetDevice();
pD3DDevice->SetRenderState(D3DRS_STENCILENABLE,true);
pD3DDevice->SetRenderState(D3DRS_STENCILFUNC,D3DCMP_ALWAYS);
pD3DDevice->SetRenderState(D3DRS_STENCILMASK,0xffffffff);
pD3DDevice->SetRenderState(D3DRS_STENCILWRITEMASK,0xffffffff);
pD3DDevice->SetRenderState(D3DRS_STENCILZFAIL,D3DSTENCILOP_KEEP);
pD3DDevice->SetRenderState(D3DRS_STENCILFAIL,D3DSTENCILOP_KEEP);
pD3DDevice->SetRenderState(D3DRS_STENCILPASS,D3DSTENCILOP_REPLACE);
//設(shè)置墻壁和地面的材質(zhì)
GameEngine_SceneManager.SetMaterial(pGameEngine_Material);
/**** 渲染2個(gè)墻壁和1個(gè)地面,并做好Stencil標(biāo)志值**************
前面墻壁的Stencil標(biāo)志值為---1
左面墻壁的Stencil標(biāo)志值為---3
地面的Stencil標(biāo)志值為-------5
**************************************************************/
pGameEngine_WallGroundVB->SendData();
for(int j=0;j<3;j++){
GameEngine_SceneManager.SetTexture(0,pWallGroundTex[j]);
pD3DDevice->SetRenderState(D3DRS_STENCILREF,2*j+1); //1、3或5
pGameEngine_WallGroundVB->Render(j*4,2,D3DPT_TRIANGLESTRIP);
}
//恢復(fù)渲染狀態(tài)
pD3DDevice->SetRenderState(D3DRS_STENCILENABLE,false);
}
//渲染前面墻壁陰影
void FrontWallShadowRender(){
IDirect3DDevice9* pD3DDevice=GameEngine_SceneManager.GetDevice();
pD3DDevice->SetRenderState(D3DRS_STENCILENABLE,true);
pD3DDevice->SetRenderState(D3DRS_STENCILFUNC,D3DCMP_EQUAL);
pD3DDevice->SetRenderState(D3DRS_STENCILREF,1); //Stencil參考值1
pD3DDevice->SetRenderState(D3DRS_STENCILMASK,0xffffffff);
pD3DDevice->SetRenderState(D3DRS_STENCILWRITEMASK,0xffffffff);
pD3DDevice->SetRenderState(D3DRS_STENCILZFAIL,D3DSTENCILOP_KEEP);
pD3DDevice->SetRenderState(D3DRS_STENCILFAIL,D3DSTENCILOP_KEEP);
pD3DDevice->SetRenderState(D3DRS_STENCILPASS,D3DSTENCILOP_INCR);
//計(jì)算陰影的世界變換矩陣
D3DXMATRIX matTrans;
D3DXMatrixTranslation(&matTrans,vSpherePos.x,vSpherePos.y,vSpherePos.z);
D3DXPLANE frontWallPlane(0.0f,0.0f,-1.0f,100.0f); //平面位于z軸100位置
D3DXMATRIX matShadow;
D3DXMatrixShadow(&matShadow,&PointLightPos,&frontWallPlane);
D3DXMATRIX matShadowWorld=matTrans * matShadow;
pD3DDevice->SetTransform(D3DTS_WORLD,&matShadowWorld);
//Alpha顏色混合
pD3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,true);
pD3DDevice->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_SRCALPHA);
pD3DDevice->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA);
//暫時(shí)失效Z-Buffer緩沖區(qū),避免產(chǎn)生z-fighting
pD3DDevice->SetRenderState(D3DRS_ZENABLE,false);
//設(shè)置陰影材質(zhì)
GameEngine_SceneManager.SetMaterial(pShadowMaterial);
//渲染陰影
pD3DDevice->SetTexture(0,NULL);
pSphereMesh->DrawSubset(0);
//矩陣恢復(fù)為單位矩陣
D3DXMATRIX I;
D3DXMatrixIdentity(&I);
GameEngine_SceneManager.GetDevice()->SetTransform(D3DTS_WORLD,&I);
//恢復(fù)渲染狀態(tài)
pD3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,false);
pD3DDevice->SetRenderState(D3DRS_STENCILENABLE,false);
pD3DDevice->SetRenderState(D3DRS_ZENABLE,true);
}
//渲染左面陰影
void LeftWallShadowRender(){
IDirect3DDevice9* pD3DDevice=GameEngine_SceneManager.GetDevice();
pD3DDevice->SetRenderState(D3DRS_STENCILENABLE,true);
pD3DDevice->SetRenderState(D3DRS_STENCILFUNC,D3DCMP_EQUAL);
pD3DDevice->SetRenderState(D3DRS_STENCILREF,3); //Stencil參考值3
pD3DDevice->SetRenderState(D3DRS_STENCILMASK,0xffffffff);
pD3DDevice->SetRenderState(D3DRS_STENCILWRITEMASK,0xffffffff);
pD3DDevice->SetRenderState(D3DRS_STENCILZFAIL,D3DSTENCILOP_KEEP);
pD3DDevice->SetRenderState(D3DRS_STENCILFAIL,D3DSTENCILOP_KEEP);
pD3DDevice->SetRenderState(D3DRS_STENCILPASS,D3DSTENCILOP_INCR);
//計(jì)算陰影的世界變換矩陣
D3DXMATRIX matTrans;
D3DXMatrixTranslation(&matTrans,vSpherePos.x,vSpherePos.y,vSpherePos.z);
D3DXPLANE leftWallPlane(1.0f,0.0f,0.0f,0.0f);
D3DXMATRIX matShadow;
D3DXMatrixShadow(&matShadow,&PointLightPos,&leftWallPlane);
D3DXMATRIX matShadowWorld=matTrans * matShadow;
pD3DDevice->SetTransform(D3DTS_WORLD,&matShadowWorld);
//Alpha顏色混合
pD3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,true);
pD3DDevice->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_SRCALPHA);
pD3DDevice->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA);
//暫時(shí)失效Z-Buffer緩沖區(qū),避免產(chǎn)生z-fighting
pD3DDevice->SetRenderState(D3DRS_ZENABLE,false);
//設(shè)置陰影材質(zhì)
GameEngine_SceneManager.SetMaterial(pShadowMaterial);
//渲染陰影
pD3DDevice->SetTexture(0,NULL);
pSphereMesh->DrawSubset(0);
//矩陣恢復(fù)單位矩陣
D3DXMATRIX I;
D3DXMatrixIdentity(&I);
GameEngine_SceneManager.GetDevice()->SetTransform(D3DTS_WORLD,&I);
//恢復(fù)渲染狀態(tài)
pD3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,false);
pD3DDevice->SetRenderState(D3DRS_STENCILENABLE,false);
pD3DDevice->SetRenderState(D3DRS_ZENABLE,true);
}
//渲染地面陰影
void GroundShadowRender(){
IDirect3DDevice9* pD3DDevice=GameEngine_SceneManager.GetDevice();
pD3DDevice->SetRenderState(D3DRS_STENCILENABLE,true);
pD3DDevice->SetRenderState(D3DRS_STENCILFUNC,D3DCMP_EQUAL);
pD3DDevice->SetRenderState(D3DRS_STENCILREF,5); //Stencil參考值5
pD3DDevice->SetRenderState(D3DRS_STENCILMASK,0xffffffff);
pD3DDevice->SetRenderState(D3DRS_STENCILWRITEMASK,0xffffffff);
pD3DDevice->SetRenderState(D3DRS_STENCILZFAIL,D3DSTENCILOP_KEEP);
pD3DDevice->SetRenderState(D3DRS_STENCILFAIL,D3DSTENCILOP_KEEP);
pD3DDevice->SetRenderState(D3DRS_STENCILPASS,D3DSTENCILOP_INCR);
//計(jì)算陰影的世界變換矩陣
D3DXMATRIX matTrans;
D3DXMatrixTranslation(&matTrans,vSpherePos.x,vSpherePos.y,vSpherePos.z);
D3DXPLANE groundPlane(0.0f,1.0f,0.0f,0.0f);
D3DXMATRIX matShadow;
D3DXMatrixShadow(&matShadow,&PointLightPos,&groundPlane);
D3DXMATRIX matShadowWorld=matTrans * matShadow;
pD3DDevice->SetTransform(D3DTS_WORLD,&matShadowWorld);
//Alpha顏色混合
pD3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,true);
pD3DDevice->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_SRCALPHA);
pD3DDevice->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA);
//暫時(shí)失效Z-Buffer緩沖區(qū),避免產(chǎn)生z-fighting
pD3DDevice->SetRenderState(D3DRS_ZENABLE,false);
//設(shè)置陰影材質(zhì)
GameEngine_SceneManager.SetMaterial(pShadowMaterial);
//渲染陰影
pD3DDevice->SetTexture(0,NULL);
pSphereMesh->DrawSubset(0);
//矩陣恢復(fù)單位矩陣
D3DXMATRIX I;
D3DXMatrixIdentity(&I);
GameEngine_SceneManager.GetDevice()->SetTransform(D3DTS_WORLD,&I);
//恢復(fù)渲染狀態(tài)
pD3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,false);
pD3DDevice->SetRenderState(D3DRS_STENCILENABLE,false);
pD3DDevice->SetRenderState(D3DRS_ZENABLE,true);
}
//釋放資源
void Shutdown(){
for(int i=0;i<3;i++){
delete pWallGroundTex[i];
}
delete pSphereTex;
delete pGameEngine_WallGroundVB;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -