DirectX 龙书 画镜子 - 1

 首先把一些概念强化一下


各种Buffer,DX里面有TargetBuffer,ZBuffer和StencilBuffer,在创建Device时有一个参数是D3DPRESENT_PARAMETERS结构对象,这个结构里面有一些字段在此提出来再记一下
D3DPRESENT_PARAMETERS d3dpp;
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;    
// 这个字段值是表示要使用什么格式的TargetBuffer,TargetBuffer存储的是颜色值,所以它的格式一般是说明ARGB各占多少位,详细请看MSDN

d3dpp.EnableAutoDepthStencil = TRUE; 
// 这个字段表示打不打算在程序中使用ZBuffer和StencilBuffer,由于这两个buffer是使用同一段内存,所以这个参数就表示,要么两个都用,要么两个都不用(后面还可以单独设置要不要使用某一个)
// 再记一下,targetBuffer就是backbuffer,后面,还有MSDN上面都说"画"backbuffer,其实就是targetbuffer.
// zbuffer & stencilbuffer 还要设置到底要不要在程序中使用,而backbuffer却不要设置,因为它一定是要使用的,在显示器上显示的东东就是backbuffer里面的内容

d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8;    
// zbuffer & stencilbuffer共用一段内容,这个字段就是设置zbuffer & stencilbuffer各占多少个字节

Device->Clear()函数的第三个参数就要明确指定要清理哪些buffer.
下面开始画东西.

     g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER | D3DCLEAR_STENCIL, D3DCOLOR_XRGB(200,200,200), 1.0f, 0);
     g_pd3dDevice->BeginScene();
          DX是在这个地方画东西的
     g_pd3dDevice->EndScene();
     g_pd3dDevice->Present(NULL, NULL, NULL, NULL);
 
OK.我把这些东西用自己的理解语言整理一下:<^_^>
 
先想像一下,有三个面
第一个面叫backbuffer,这个面的大小与你的显示器一样大(大小自己可以设置),这个面的"厚度"为32位(即ARGB占的位数)
第二个面叫zbuffer,这个面的大小与backbuffer一样大,这个面的"厚度"为24位(D3DFMT_D24S8,即D24),这个面是用来表示一个画面中的物体的层次感,比如,你觉得镜子里面的东西是在镜子"里面的",而阴影是在地的"上面的"。
第三个面叫stencilbuffer,这个面的大小也是与backbuffer一样大,这个面的"厚度"为8位(D3DFMT_D24S8,即S8),这个面是用来控制,要将哪些像素画到backbuffer中,哪些像素不必画到backbuffer中去。
 
看画图像部分
Clear()函数将指定的buffer用指定的值来"清理"(我更喜欢说,用指定的值来填充),第4、5、6个参数分别是指用什么样的值来填充backbuffer、zbuffer、stencilbuffer
backbuffer的值就是背景颜色值,zbuffer的值是[0 - 1]的区间值,0表示在"表面"(比如影子),1表示在最里面(比如说镜子里面的东西)
stencilbuffer,到目前为止,我用到的就是0,1,就是用来作标记
下面调用BeginScene()表示开始"画"图像
画完图像后调用EndScene()表示这个buffer(backbuffer & zbuffer & stencilbuffer)画完了
下面调用Present()把这个画完的buffer送到显示器显示,并将另一个buffer"转换"到当前,下一循环,准备画下一帧图像。
 
今天先写到这里,下班了。
posted @ 2011-12-14 20:59  莫压枯枯地  阅读(526)  评论(0编辑  收藏  举报