📄 main.cpp
字号:
}
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;
}
}
//设置投影变换
GameEngine_SceneManager.SetProjection();
//清除Z缓冲区和Stencil缓冲区为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();
//结束渲染
GameEngine_SceneManager.EndRender();
return true;
}
//渲染墙壁和地面
void GroundWallRender(){
//设置Stencil测试的相关渲染状态值
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);
//设置墙壁和地面的材质
GameEngine_SceneManager.SetMaterial(pGameEngine_Material);
/**** 渲染2个墙壁和1个地面,并做好Stencil标志值**************
前面墙壁的Stencil标志值为---1
左面墙壁的Stencil标志值为---3
地面的Stencil标志值为-------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);
}
//恢复渲染状态
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);
//计算阴影的世界变换矩阵
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);
//暂时失效Z-Buffer缓冲区,避免产生z-fighting
pD3DDevice->SetRenderState(D3DRS_ZENABLE,false);
//设置阴影材质
GameEngine_SceneManager.SetMaterial(pShadowMaterial);
//渲染阴影
pD3DDevice->SetTexture(0,NULL);
pSphereMesh->DrawSubset(0);
//矩阵恢复为单位矩阵
D3DXMATRIX I;
D3DXMatrixIdentity(&I);
GameEngine_SceneManager.GetDevice()->SetTransform(D3DTS_WORLD,&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);
//计算阴影的世界变换矩阵
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);
//暂时失效Z-Buffer缓冲区,避免产生z-fighting
pD3DDevice->SetRenderState(D3DRS_ZENABLE,false);
//设置阴影材质
GameEngine_SceneManager.SetMaterial(pShadowMaterial);
//渲染阴影
pD3DDevice->SetTexture(0,NULL);
pSphereMesh->DrawSubset(0);
//矩阵恢复单位矩阵
D3DXMATRIX I;
D3DXMatrixIdentity(&I);
GameEngine_SceneManager.GetDevice()->SetTransform(D3DTS_WORLD,&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);
//计算阴影的世界变换矩阵
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);
//暂时失效Z-Buffer缓冲区,避免产生z-fighting
pD3DDevice->SetRenderState(D3DRS_ZENABLE,false);
//设置阴影材质
GameEngine_SceneManager.SetMaterial(pShadowMaterial);
//渲染阴影
pD3DDevice->SetTexture(0,NULL);
pSphereMesh->DrawSubset(0);
//矩阵恢复单位矩阵
D3DXMATRIX I;
D3DXMatrixIdentity(&I);
GameEngine_SceneManager.GetDevice()->SetTransform(D3DTS_WORLD,&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;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -