|
不知道错在哪里
这是那部分的源程序:
VOID Direct3DRender()
{
g_pd3dDevice->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER|D3DCLEAR_STENCIL,D3DCOLOR_XRGB(0,0,1),1.0f,0);
g_pd3dDevice->BeginScene();//开始绘制
/*设置取景变换矩阵*/
D3DXMATRIX matView;
D3DXVECTOR3 vEye(2.0f,0.0f,-10.0f);
D3DXVECTOR3 vAt(0.0f,0.0f,0.0f);
D3DXVECTOR3 vUp(0.0f,1.0f,0.0f);
D3DXMatrixLookAtLH(&matView,&vEye,&vAt,&vUp);
g_pd3dDevice->SetTransform(D3DTS_VIEW,&matView);
/*设置投影变换矩阵*/
D3DXMATRIX matProj;
D3DXMatrixPerspectiveFovLH(&matProj,D3DX_PI/4.0f,1.0f,1.0f,1000.0f );
g_pd3dDevice->SetTransform(D3DTS_PROJECTION,&matProj);
/*设置渲染状态*/
g_pd3dDevice->SetRenderState(D3DRS_LIGHTING,true);
g_pd3dDevice->SetRenderState(D3DRS_SPECULARENABLE,true);
/*设置世界变换矩阵*/
D3DXMATRIX matWorld,Ry;
D3DXMatrixRotationY(&Ry,::timeGetTime()/1000.0f);
/*绘制场景中物体先禁用模板缓存*/
g_pd3dDevice->SetRenderState(D3DRS_STENCILENABLE,false);
D3DXMatrixTranslation(&matWorld,0.0f,0.0f,1.0f);//镜面
g_pd3dDevice->SetTransform(D3DTS_WORLD,&matWorld);
g_pd3dDevice->SetMaterial(&g_Materials[0]);
g_pMeshWall->DrawSubset(0);
D3DXMatrixTranslation(&matWorld,1.0f,0.0f,0.0f);//圆环体
matWorld=Ry*matWorld;
g_pd3dDevice->SetTransform(D3DTS_WORLD,&matWorld);
g_pd3dDevice->SetMaterial(&g_Materials[1]);
g_pMeshTorus->DrawSubset(0);
D3DXMatrixTranslation(&matWorld,-1.0f,0.0f,0.0f);//茶壶
matWorld=Ry*matWorld;
g_pd3dDevice->SetTransform(D3DTS_WORLD,&matWorld);
g_pd3dDevice->SetMaterial(&g_Materials[2]);
g_pMeshTeapot->DrawSubset(0);
/*启用模板缓存*/
g_pd3dDevice->SetRenderState(D3DRS_STENCILENABLE,true);
g_pd3dDevice->SetRenderState(D3DRS_STENCILFUNC,D3DCMP_ALWAYS);
g_pd3dDevice->SetRenderState(D3DRS_STENCILREF,0x1);
g_pd3dDevice->SetRenderState(D3DRS_STENCILMASK,0xffffffff);
g_pd3dDevice->SetRenderState(D3DRS_STENCILWRITEMASK,0xffffffff);
g_pd3dDevice->SetRenderState(D3DRS_STENCILPASS,D3DSTENCILOP_REPLACE);
/*关闭向深度缓存和后台缓存写数据*/
g_pd3dDevice->SetRenderState(D3DRS_ZWRITEENABLE,false);
//开启Alpha融合
g_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,true);
g_pd3dDevice->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_ZERO);
g_pd3dDevice->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_ONE);
D3DXMatrixTranslation(&matWorld,0.0f,0.0f,1.0f);//镜面
g_pd3dDevice->SetTransform(D3DTS_WORLD,&matWorld);
g_pMeshWall->DrawSubset(0);
//重新允许向深度缓存中写数据,并仅使镜像位于镜面时模板测试成功
g_pd3dDevice->SetRenderState(D3DRS_ZWRITEENABLE,true);
g_pd3dDevice->SetRenderState(D3DRS_STENCILFUNC,D3DCMP_EQUAL);
g_pd3dDevice->SetRenderState(D3DRS_STENCILPASS,D3DSTENCILOP_KEEP);
g_pd3dDevice->Clear(0,0,D3DCLEAR_ZBUFFER,0,1.0f,0);
g_pd3dDevice->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_DESTCOLOR);
g_pd3dDevice->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_ZERO);
//计算镜像变换矩阵并绘制物体到镜面中
D3DXMATRIX ReflectMatrix;
D3DXPLANE plane(0.0f,0.0f,1.0f,0.0f);
D3DXMatrixReflect(&ReflectMatrix,&plane);//得到镜像变换矩阵
//由于镜面中的镜像实际上是物体的背面,所以要重新设定消隐方式
g_pd3dDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_CW);
D3DXMatrixTranslation(&matWorld,1.0f,0.0f,0.0f);//圆环体
matWorld=Ry*matWorld*ReflectMatrix;
g_pd3dDevice->SetTransform(D3DTS_WORLD,&matWorld);
g_pd3dDevice->SetMaterial(&g_Materials[1]);
g_pMeshTorus->DrawSubset(0);
D3DXMatrixTranslation(&matWorld,-1.0f,0.0f,0.0f);//茶壶
matWorld=Ry*matWorld*ReflectMatrix;
g_pd3dDevice->SetTransform(D3DTS_WORLD,&matWorld);
g_pd3dDevice->SetMaterial(&g_Materials[2]);
g_pMeshTeapot->DrawSubset(0);
g_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
g_pd3dDevice->SetRenderState(D3DRS_STENCILENABLE, FALSE);
g_pd3dDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_CCW);
g_pd3dDevice->EndScene();//结束绘制
g_pd3dDevice-> resent(NULL,NULL,NULL,NULL);//翻转
} |
|