游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3839|回复: 5

求解:一个模板技术实现镜面效果的程序

[复制链接]

1

主题

4

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2011-12-15 18:16:00 | 显示全部楼层 |阅读模式
不知道错在哪里
这是那部分的源程序:
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-&gtresent(NULL,NULL,NULL,NULL);//翻转
}

1

主题

4

帖子

0

积分

新手上路

Rank: 1

积分
0
 楼主| 发表于 2011-12-15 18:17:00 | 显示全部楼层

Re:求解:一个模板技术实现镜面效果的程序

不知道错在哪里,求达人找出错误啊

0

主题

275

帖子

676

积分

高级会员

Rank: 4

积分
676
发表于 2011-12-20 10:57:00 | 显示全部楼层

Re:求解:一个模板技术实现镜面效果的程序

?]?D ?]源? 神仙也??

22

主题

49

帖子

49

积分

注册会员

Rank: 2

积分
49
发表于 2011-12-26 00:55:00 | 显示全部楼层

Re:求解:一个模板技术实现镜面效果的程序

看<<irectX 9 3D游戏程序设计入门>>这本书的源代,对比一下就OK,帮你找这些错误确实很费时间,你也在学DirectX吗,可以加QQ一起研究QQ282891168

1

主题

4

帖子

0

积分

新手上路

Rank: 1

积分
0
 楼主| 发表于 2011-12-29 21:47:00 | 显示全部楼层

Re: 求解:一个模板技术实现镜面效果的程序

错误源代码已上传,求解啊 [em6]

1

主题

4

帖子

0

积分

新手上路

Rank: 1

积分
0
 楼主| 发表于 2011-12-29 22:01:00 | 显示全部楼层

Re:求解:一个模板技术实现镜面效果的程序

表示上传不了附件,给个网址,源代码在那,复制一下就行
http://wzlstllg.blog.163.com/blog/static/1275073292011112995639605/
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-9 10:25

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表