⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.cpp

📁 这个代码关键是处理阴影的,还有纹理材质方面的
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	}
	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 + -