Modeling(建模)

本文详细介绍了Direct3D中的建模场景、可视性处理,包括如何使用顶点、Primitive Type、顶点缓冲区、Shader以及Z Buffer在处理可见性问题中的应用。此外,还讲解了顶点数据的组织形式,如FVF和顶点声明,并探讨了点精灵、N-Patches和高维曲面等增强型顶点技术。
摘要由CSDN通过智能技术生成

   前一章讲解的主要是怎样向direct3D 描述场景。场景里面的物体都是由很多组primitives组成的,primitive包括point, line, triangles。 由于三角形也是一个面,所以一个三角形就可以模拟出一个平滑的表面。一个顶点除了位置信息,面法线外,还有很多额外的信息绑定到这个顶点,如顶点颜色值,纹理坐标值,顶点blend weight,任意的shader数据等等。 这些数据是通过一组数据流传递给Device,每一个流都对应一个顶点buffer。

   Direct3D 提供了两种方法来描述一个物体的形状,可以用参数把面的精细度定义成真实面的一组三角形。设备一次只描述场景中的一个primitive 。

 

建模场景

   所有的3D 渲染都在在场景里面完成的,BeginScene标志着一个场景的开始,紧接着是图形渲染,EndScene标志着场景渲染的结束。设备则是被创建以后就可以设置它的属性和状态,他们不受场景的影响。StretchRect 不是一个渲染方法,能被应用在场景之外。

 

可视性

   "Z buffer"是一个判断可视性的算法,它工作在Render Target的每个像素上,而不是每个模型上。 当一个模型被光栅化之后,每一个像素就会有一个Z 值,来表示这个像素离照相机的距离。这个算法也不是完美的,虽然对于不透明的像素还能处理的很好,但是如处理那些果透明的或者半透明的像素,它就有缺陷了。幸运的是,我们可以先画出所有不透明的物体,然后把透明的物体从后到前排序,然后用painter算法画它们。 这个方法并不完美,它确实能减少artifacts,但是仍然使用了快速Z buffer硬件。

   depth/stencil buffer 存放着像素离照相机的距离。 一个depth/stencil buffer是通过设备的D3DPRESENT_PARAMETERS来创建的,或者显示的调用CreateDepthStencilSurface。GetDepthStencilSurface可以取得设备的depth/stencil surface。为了利用Z buffer来解决可视性问题,设置RS Z enable 为 D3DZB_TRUE, RS Z Write Enable为True 和 RS Z Func 为D3DCMP_LESS。

   如果 D3DCAPS9::RasterCaps 的 D3DPRASTERCAPS_ZBUFFERLESSHSR被设置,它意味着用另外一种方法做可视性判断,可视性判断是与硬件相关,这种情况下render targe的depth/stencil surface 为空,而且设置RS Z enable为 D3DZB_TRUE.

 

Render Targets

   当光栅处理结束后,像素流就产生了。它的目的地就是设备的render target。 Swap chain上的所有的back buffer 都是合理的render targets,但是render target并不仅仅限制于back buffer的surface。当设备被创建或者reset的时候,render target就是默认swap chain的back buffer 0。当调用present的时候,render target就跳到下一个back buffer,这样当present 返回以后,render target又回到back buffer 0。

   可以把render target设置一个表面,这样就允许设备直接渲染到一张图片上。非swap chain 上的render target surface 可以通过调用函数CreateRenderTarget。

   SetRenderTarget ,GetRenderTarget, Clear 方法用于对render target surface进行操作。

 

Primitive Type

   一般包括D3DPT_POINTLIST, D3DPT_LINELIST, D3DPT_LINESTRIP,D3DPT_TRIANGLELIST,D3DPT_TRIANGLESTRIP, D3DPT_TRIANGLEFAN。

顶点数据

   场景数据由定义物体形状和外表的数据组成。我们已经看到形状可以由primitive和顶点坐标确定。用于固定流水线的数据要么是FVF格式的数据,要么是顶点shader声明格式的数据。顶点shader程序可以在每个顶点上使用任意的数据。每个与顶点相关的数据都被称作是顶点的component。利用FVF格式的数据,所有的数据必须在一个单一的流里面。但是顶点shader声明可以把这些components分成多个流。

   除了选择固定功能处理和可编程顶点处理外,应用程序还可以把数据直接传递给设备,而不进行任何的顶点处理。

 

灵活顶点格式(FVF)

   顶点FVF是一个DWORD,它包含一个或者多个描述在内存里面顶点组件,如:D3DFVF_XYZ, D3DFVF_XYZRHW, D3DFVF_XYZB1,等等。

   位置相关的FVF包括D3DFVF_XYZ, D3DFVF_XYZRHW,D3DFVF_XYZB1, D3DFVF_XYZB3,D3DFVF_XYZB4 和 D3DFVF_XYZB5。B值是它的blending weight。</

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值