关于D3D的学习和个人理解-1

w 单字 wSpeed
dw 双字 dwHitList

=====命名规范


每个directx方法都会返回一个 HRESULT 组织代码,以使其可以检查并处理所有可能的错误。

 

正题

1.顶点
1.1内容
顶点即一个3Dworld中的点。
顶点 vector与jme中的math包下 vector3f相同。

分别为d3d9types.h中的 D3DVECTOR,d3dx9math.h中增强版本向量结构D3DXVECTOR3

1.2结构
顶点是一个结构,他所包含的不仅仅是位置信息,D3D运行时是以这种方式来接受数据的:
所有定点都储存在一个顶点缓冲器中,顶点缓冲器允许应用程序分配和访问通常只有驱动程序才可以访问到的存储器。
理论上一个顶点的结构可以理解为颜色,法线向量,纹理,纹理坐标
C++码为:
struct Vertex{
 D3DVECTOR3 vPositon;
 DWORD dwDiffuse; //贴图颜色
 D3DVECTOR3 vNormal; //顶点材质
 FLOAT u,v;  //顶点贴图(坐标?) coordinates.
}
1.3使用朝向
描述物体的朝向至少需要4个向量 ——look,up,right,position.position向量定义了物体的位置,look向量定义了物体所指的的方向;right向量定义了物体的右侧指向;up向量仅在物体会绕着look向量旋转时才是必须的,保证旋转过程中轴心不变 在jme中同样有这样的位置关系,属于3d物体的统一定义。

例子 :
改变飞机的俯仰度 需要使其绕right向量旋转;
飞机需要横滚,需要对look向量旋转;
若飞机要改变所面对的方向,需要对其绕up向量旋转;若要使物体沿Look向量方向移动,则需要改变position向量(绝对位置)。

1.4理解面

所有的模型和3D世界都可以被分解为点,线和三角形(可以称为图元);D3D只能渲染这些图元(相对来说OpenGL和其他3D引擎有其优势,可通过顶点渲染来构成面),若为了减少面得数量而是用4个或更多顶点的多边形来设计形状的话,D3D也会将每个多边形面分割称为一些三角形,由此为了获得更高的性能(即减少分割时间),应该使每个物体都易于被分割为三角形.
因此,通常应使用三角形来构建物体。
而一个由若干三角形构成的物体被称为“网格(mesh)”;

*背面剔除是以只渲染摄像机所对的面得特性,用于提高渲染速度。

1.5理解多边形

多边形是指由3个或以上的顶点来构成n边的封闭的形状,三角形是最简单的多边形,而且可以保证所有定点都在一个平面上,在D3D中构成多边形都可以通过分解为三角形来实现。


1.6理解法线

法线是垂直于面的向量,可以用于定义一个面得朝向或成为可见侧(即需要贴图的面,摄像机可以见的面)。

顶点法线:
一个形的顶点的发线通常垂直于一个面,并且位于顶点之上,具有一个单位的长度(即1)。
面法线:
另一类法线是面法线,通常垂直于面,并且位于面得中央。D3D可以自己计算面法线。
顶点法线对于光照计算很重要,在第九章将可以学到应用高级Shader语言进行Shader编程中使用到 。
面法线和顶点法线对于着色模式(shading mode)也很重要。通常面法线使用flat着色,顶点法线则用于Gouraud着色。


1.7理解法线和Gouraud着色

着色是进行光照计算并根据计算结果确定像素颜色的过程,这些像素颜色稍后将用于屏幕上表示物体(着色是光栅器对像素进行上色的方法)。Flat着色照亮每个多边形或免,Gouraud着色照亮了每个顶点。

水壶例子。
Flat着色照亮三角形,即面;
Gouraud着色照亮每个顶点,可实现光滑的曲面(即经常在PSPX模拟器中看到的D3D渲染和OpenGL渲染的区别)
两者使用模型不同。

1.8纹理映射(Texture-Mapping即我理解的纹理贴图)基础
细节内容使3D模型更真实,更动人。通过贴图来用图像来代替几何体提高模型的视觉复杂度。

但在这里要说明的纹理映射是指的一种可以映射到一个或多个面上的特殊图像。
*个人理解:即将一张jpg或者tip图片,通过某种方式对进行等比例缩放和变形将其映射到某个表面或某多个表面上。电影放映机 胶片与大屏幕的关系吧,胶片就是纹理源jpg或者其他格式图片文件,大屏幕就是我们要映射(投影)投影的面。放映机就是贴图的这个过程。

为了将图素(texel,texture element(纹理元素)的缩写)映射到图元上,D3D要求在纹理中对所有的图素都使用一个统一的地址范围。因此他使用一种具有通用性的编址方案,其中所有的图素地址都在区间[0.0f,1.0f]中。纹理坐标空间中,u表示水平方向,v表示垂直方向。(即纹理的右下角为(1.0f,1.0f)左上角坐标为(0.0f,0.0f))这里不涉及纹理的实际尺寸,即长宽比例不为1:1一样是这样编址。若赋值的纹理坐标超过该区间,则可以创造出某些特特殊的贴纹理效果。将会在后续学习中见到 。

最后我们需要将纹理的坐标分配给一个网格(即刚才学的由三角形构成的物体mesh)的各个顶点。因此,纹理坐标可作为顶点的一个分量被直接包含在定点结构中,如“理解顶点”一节中所示的顶点结构。

当我们要投影的图元网格的纵横比与纹理相同时,这种情况下 ,纹理坐标(0.0,0.0),(1.0,0.0),(1.0,1.0),(0.0,1.0)被分配到图元的各个顶点,这会使D3D缩放纹理以覆盖整个图元网格。分配纹理坐标可能如下所示:(四边形的四个顶点)
cvVertices [0] = {0.0f, 0.0f, 0.5f, 1.0f, 0.0f, 0.0f};//对应顶点的x,y,z,rhw,tu(纹理地址u),tv
cvVertices [1] = {1.0f, 0.0f, 0.5f, 1.0f, 1.0f, 0.0f};
cvVertices [2] = {1.0f, 1.0f, 0.5f, 1.0f, 1.0f, 1.0f};
cvVertices [3] = {0.0f, 1.0f, 0.5f, 1.0f, 0.0f, 1.0f};

这是一个典型的顶点结构,它由位置向量,RHW(Reciprocal of Homogeneous W,齐次W的倒数)值和纹理的tu,tv坐标组成(在后续将详细解释RHW)。

这里我们重新着重解释一下最后的两个变量,即一对纹理地址坐标。这里我们是把纹理的所有内容,即从左上到右下的图素全部映射到图元网格上了。
如果我们遇到一个纵横比和纹理不相同的情况,这种全部贴图方法会使长宽按照相应比例压缩或拉伸。到时我们可以通过PS修改纹理,或者只贴纹理的一部分到网格上。
如果我们只想映射纹理的左半部份就可以设置纹理坐标:(0.0,0.0),(0.5,0.0),(0.5,1.0),(0.0,1.0)分配给各个顶点。

以上只是简单的贴图方法,如果像我们通常在游戏中看到的场景或者模型贴图需要更高级的纹理映射。
当然这些我们可以通过3DSMAX或者MAYA在制作模型时设定好。我们在使用时直接导入模型就会有对应的纹理映射信息了。

*广告时间:3DSMAX和MAYA因为费用过高,我们这些爱好者难以承担,推荐使用MilkShape 3D这是一款能力卓越的软件,可以制作模型,生成动画,制作特效,导入各种格式的3D模型(例如半条命,雷神之锤2,3,马克思佩恩,虚拟人生sim,魔兽争霸,ps平台,max,maya等),也可以导出各个平台上都可以使用的3D模型,当然他没有3DMAX和MAYA那样强大的渲染和表现力 ,但是非常适合游戏开发者制作游戏模型使用。小巧易用:6M,价格便宜:$29;下载地址“www.swissquake.ch/chumbalum-soft”,这款软件一样非常适合JME游戏开发。

希望这章能够让我们对纹理映射,3D世界的构成有一定的认识,下章开始我们将真正接触D3D以及D3D CODE。

前序工作:安装好VS2005和DX 9.0SDK(需要安装其中例子sample的文件夹)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值