网络游戏客户端编程

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

学习目标1.掌握深度缓冲、Alpha混合和Alpha测试2.掌握多边形填充模式和渲染模式,图形反锯齿3.掌握多纹理混合、雾化效果4.掌握2D文字和图形、公告板技术5.掌握粒子系统知识背景1.熟练掌握Windows编程2.掌握D3D程序的基本框架3.掌握如何在D3D环境下显示模型和场景本章要点1.Alpha混合和Alpha测试2.多纹理混合,雾化效果3.2D文字和图形显示4.粒子系统引言游戏中逼真的场景、漂亮的人物和华美的服装,都是通过在程序中组合一个个基本图元,经过变换后渲染出来的。单纯的渲染并不能生成游戏中的各种特效,比如雾效、爆炸的火焰效果等。要实现这些特效,就要在基本图形渲染的基础上,采用一些特殊的技术。本章将学习如何在D3D环境下实现一些简单的游戏特效。6.1基本渲染属性6.1.1深度缓冲深度缓冲区是Direct3D用来存储绘制到屏幕上的每一个像素点的深度信息的一块内存缓冲区。Direct3D通过比较当前绘制的像素点的深度和对应深度缓冲区的点的深度值来决定是否绘制当前像素。如果深度测试为TRUE,则绘制当前像素,并用当前像素点深度值更新深度缓冲区,反之则不予绘制。通常情况下,深度缓冲区对应于屏幕大小的一块二维区域。深度缓冲(又称Z-buffer)的作用是确保多边形能够正确地显示在它们本来的深度(相对于摄像机)上。例如在场景中有两个矩形,一个是蓝色的而另一个是绿色的。蓝色的Z值为10,绿色的Z值为20(摄像机在原点)。这就意味着蓝色的在绿色的前面(如图6-1所示)。深度缓冲能确定哪个对象在另一个对象的前面,正确地渲染对象。DirectX会测试对象在屏幕上的像素点到摄像机的远近,并把得出的值保存在深度缓冲中;接着,DirectX会测试同一位置另一对象的像素点,并和刚才的像素进行比较,如果更近,就刷新刚才的记录,否则就不理睬(有东西在它前面挡着它),这会决定此位置像素点的颜色到底是蓝色的还是绿色的。图6-1深度测试下面的程序片断开启了深度测试,以便得到物体正确的前后关系:D3DPRESENT_PARAMETERSd3dpp;ZeroMemory(&d3dpp,sizeof(d3dpp));d3dpp.Windowed=TRUE;d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;d3dpp.BackBufferFormat=D3DFMT_UNKNOWN;d3dpp.EnableAutoDepthStencil=TRUE;d3dpp.AutoDepthStencilFormat=D3DFMT_D16;//g_pD3D为有效的Direct3D设备if(FAILED(g_pD3D-CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&g_pd3dDevice))){returnE_FAIL;}在显示模式中,设定了d3dpp.EnableAutoDepthStencil的值为TRUE,表示打开深度测试。接着,d3dpp.AutoDepthStencilFormat的值设为D3DFMT_D16,表示深度缓冲区的每一个像素由16位的整数值表示。接下来,调用Direct3D渲染状态设置函数IDirect3DDevice9∷SetRenderState()激活深度缓冲区,将第一个参数设为D3DRS_ZENABLE,表示设置深度缓冲的状态,将第二个参数设为TRUE,打开深度缓冲。//g_pd3dDevice为有效的Direct3D设备g_pd3dDevice-SetRenderState(D3DRS_ZENABLE,TRUE);接下来,仍然调用IDirect3DDevice9∷SetRenderState()设置深度测试函数,将第一个参数设为D3DRS_ZFUNC,将第二个参数设为想要设置的深度测试函数,它属于D3DCMPFUNC枚举类型,定义如下:typedefenum_D3DCMPFUNC{D3DCMP_NEVER=1,//深度测试函数总是返回FALSED3DCMP_LESS=2,//测试点深度值小于深度缓冲的值时返回TRUED3DCMP_EQUAL=3,//测试点深度值等于深度缓冲的值时返回TRUED3DCMP_LESSEQUAL=4,//测试点深度值小于等于深度缓冲的值时返回TRUED3DCMP_GREATER=5,//测试点深度值大于深度缓冲的值时返回TRUED3DCMP_NOTEQUAL=6,//测试点深度值不等于深度缓冲的值时返回TRUED3DCMP_GREATEREQUAL=7,//测试点深度值大于等于深度缓冲的值时返回TRUED3DCMP_ALWAYS=8,//深度测试函数总是返回TRUED3DCMP_FORCE_DWORD=0x7fffffff}D3DCMPFUNC;通常情况下,深度测试函数总是设置为D3DCMP_LESS,表示当测试点深度值小于深度缓冲中的相应值时返回TRUE,通过深度测试并绘制相应的像素点。//g_pd3dDevice为有效的Direct3D设备g_pd3dDevice-SetRenderState(D3DRS_ZFUNC,D3DCMP_LESS);最后,还要调用IDirect3DDevice9∷SetRenderState(),将第一个参数设为D3DRS_ZWRITEENABLE,将第二个参数设为TRUE,允许应用程序在绘制像素时更新深度缓冲区://g_pd3dDevice为有效的Direct3D设备g_pd3dDevice-SetRenderState(D3DRS_ZWRITEENABLE,TRUE);6.1.2Alpha混合在前面章节的介绍中,已经遇到了Alpha值,如D3DCOLORVALUE数据结构中的A,它并没有被使用,因为在程序中没有激活Alpha混合(AlphaBlending),并且Alpha总是被赋值为浮点值1.0f(在默认渲染状态下,Alpha为1.0f表示不透明)。本节将讨论Alpha值的使用和半透明物体的绘制。前面介绍的程序范例中,绘制图形的颜色总是替换当前颜色缓冲区中存在的颜色值,这样,后画的物体总是覆盖在原有物体上。但是,当想要绘制类似于玻璃、水等具有透明效果的物体时,这种方法显然不能满足要求。通过定义一个表示物体半透明度的Alpha值和一个半透明计算公式,可以把要绘制的物体的颜色与颜色缓冲区中存在的颜色相混合,从而绘制出具有半透明效果的物体。Direct3D计算Alpha混合的颜色方法如下:在上面的公式中,Color表示Alpha混合后的颜色值;RGBsrc表示源颜色值,即将要绘制的图元颜色值;Ksrc表示源混合系数,通常赋值为表示半透明度的Alpha值,也可以是属于枚举D3DBLEND的任意值,用来和RGBsrc相乘;RGBdst表示目标颜色,即当前颜色缓冲区中的颜色值;Kdst表示目标系数,可以是属于枚举D3DBLEND的任意值,用来和RGBdst相乘;OP表示源计算结果与颜色缓冲区计算结果(目标计算结果)的混合方法,默认状态下OP为D3DBLENDOP_ADD,即源计算结果与颜色缓冲区计算结果相加。图形显示中,对Alpha混合最普遍的使用方法是:把Ksrc赋值为D3DBLEND_SRCALPHA,即当前绘制像素的Alpha值;把Kdst赋值为D3DBLEND_INVSRCALPHA,即1减去当前绘制像素的Alpha值;把OP赋值为D3DBLENDOP_ADD,使源计算结果与颜色缓冲区计算结果相加。上面的公式转化为:要想绘制半透明物体,首先需要激活Direct3D的Alpha混合计算,设置IDirect3DDevice9∷SetRenderState()的第一个参数为D3DRS_ALPHABLENDENABLE,第二个参数为TRUE://g_pd3dDevice为有效的Direct3D设备g_pd3dDevice-SetRenderState(D3DRS_ALPHABLENDENABLE,TRUE);然后,设置Alpha混合的系数://g_pd3dDevice为有效的Direct3D设备g_pd3dDevice-SetRenderState(D3DRS_SRCBLEND,D3DBLEND_SRCALPHA);g_pd3dDevice-SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA);由于Alpha混合是当前绘制的像素颜色与颜色缓冲区中存在的颜色的混合运算,因此,在绘制半透明物体之前,位于半透明物体之后被它遮挡的物体必须保证先于半透明物体绘制。所以,必须打开深度缓冲。Direct3D支持多种Alpha混合方法,Alpha混合系数Ksrc和Kdst可以设为枚举常量D3DBLEND的任意值,如表6-1所示。表6-1Alpha混合方法D3DBLEND的值说明D3DBLEND_ZEROAlpha混合系数为0续表D3DBLEND的值说明D3DBLEND_ONEAlpha混合系数为1D3DBLEND_SRCCOLORAlpha混合系数为当前绘制像素的Color值(RGBA)D3DBLEND_INVSRCCOLORAlpha混合系数为1——当前绘制像素的Color值(RGBA)D3DBLEND_SRCALPHAAlpha混合系数为当前绘制像素的Alpha值D3DBLEND_INVSRCALPHAAlpha混合系数为1——当前绘制像素的Alpha值D3DBLEND_DESTALPHAAlpha混合系数为颜色缓冲区中的Alpha值D3DBLEND_INVDESTALPHAAlpha混合系数为1——颜色缓冲区中的Alpha值D3DBLEND_DESTCOLORAlpha混合系数为颜色缓冲区中像素的Color值(RGBA)D3DBLEND_INVDESTCOLORAlpha混合系数为1——颜色缓冲区中像素的Color值(RGBA)源计算结果与颜色缓冲区计算结果的混合方法OP属于枚举常量D3DBLENDOP,根据计算机硬件的不同可以取不同的值,如表6-2所示。表6-2目标与源的混合方法D3DBLENDOP的值说明D3DBLENDOP_ADD源计算结果与颜色缓冲区计算结果相加D3DBLENDOP_SUBTRACT源计算结果减去颜色缓冲区计算结果D3DBLENDOP_REVSUBTRACT颜色缓冲区计算结果减去源计算结果D3DBLENDOP_MIN取两者的最小值D3DBLENDOP_MAX取两者的最大值需要注意的是,由于功能的限制,有些计算机硬件可能不支持某些混合方法,这时Direct3D会自动使用D3DBLENDOP_ADD。使用Alpha混合后的效果如图6-2所示。图6-2Alpha混合效果6.1.3Alpha测试Alpha测试可控制Direct3D程序是否绘制当前像素(根据是否满足Alpha测试条件),图形程序应用Alpha测试可以有效地屏蔽某些像素颜色。与Alpha混合相比,Alpha测试不能将绘制像素颜色与颜色缓冲区像素混合,像素要么完全不透明,要么完全透明。由于无须进行颜色缓冲区的读操作,因此Alpha测试在速度上要优于Alpha混合。Alpha测试通过渲染状态D3DRS_ALPHATSTEABLE设置,下列代码激活Direct3D的Alpha测试状态://g_pd3dDevice为有效的Direct3D设备g_pd3dDevice-SetRenderState(D3DRS_ALPHATESTENABLE,TRUE);渲染状态D3DRS_ALPHAREF用来设置进行Alpha测试的参考值AlphaReference。Alpha测试函数比较当前绘制的像素的Alpha值和AlphaReference值,如果返回TRUE,则通过测试并绘制像素,反之不予绘制。AlphaReference的取值范围从0×00000000~0×000000ff。下

1 / 44
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功