2008年的D3D学习笔记(2)
水曜日:DirectX绘制图形
2008/06/25 01:40
1,首先需要考虑顶点信息的存储,也就是顶点缓存和索引缓存的实现 HRESULT IDirect3DDevice9::CreatIndexBuffer( 2,访问缓存 3,绘制状态 4,准备绘制 5,开始绘制 HRESULT IDirect3DDevice9::DrawIndexedPrimitive( -------------------------------------------------------- PS:绘制操作之前需要执行BeginScene(),之后需要执行EndScene() PPS:所谓的索引基数,是为了保证多个图元在同一索引缓存中我们能找到正确的索引,是每个局部索引的偏移量。基数是按顶点个数计算而不是字节数。 |
日曜日:Direct3D的颜色
2008/06/29 13:54
1,颜色表示 Direct3D中的颜色是RGB表示的,所用保存的数据结构一种是D3DCOLOR,实际是一个DWORD类型,32位,分成了4个8位,分别是alpha,r,g,b。当然,指定值的时候仿佛需要位运算,但是实际提供了一个宏来帮助我们实现这样的工作:D3DCOLOR_ARGB(a,r,g,b),或者D3DCOLOR_XRGB(r,g,b)其中a默认为255。 还有一种是D3DCOLORVALUE,定义为: Typedef struct D3DCOLORVALUE{ float r; float g; float b; float a; }D3DCOLORVALUE; 取值范围是0-1,类似於opengl。 还有一个结构是D3DXCOLOR,该结构不但和D3DCOLORVALUE一样的数据,还提供了一些列的构造函数和运算符。 2,顶点颜色 现在我们有一个图元,他的颜色要怎么确定呢? 图元的颜色由构成该图的顶点的颜色决定。我们必须为顶点数据结构添加一个表示颜色的数据成员。 此处无法使用D3DCOLORVALUE结构,因为Direct3D希望用一个32位的值来表示颜色。、 struct ColorVertex{ float x,y,z; D3DCOLOR color; static const DWORD FVF; }; 3,着色 着色(shading)发生在光栅化的过程中,着色规定了如何利用顶点的颜色来计算图元像素的颜色。 现在,我们使用两种着色模式: (1) 平面着色(flat shading) 使用平面着色,每个图元的每个像素都被一致赋予该图元的第一个顶点所指定的颜色,其他顶点颜色被忽略。 (2)Gouraud着色 图元中各像素的颜色值由各顶点的颜色经线性插值得到。 我们使用D3D的状态机来控制颜色模式:SetRenderState |
木曜日:光照
2008/07/03 13:21
1,光照的组成 在D3D中,光源发出的光由3个类型或者说分量组成: 环境光(Ambient Light):这种类型的光是经由其他表面反射到达物体表面,并照亮整个场景。 满射光(Diffuse Light):这种类型的光是沿着某个特定的方向传播,当它到达某一表面的时候,将沿着各个方向均匀反射。由于这种光是沿着各个方向反射,所以不需要考虑观察者的位置。 镜面光(Specular Ligth):这种类型的光按特定方向传播,当它到达某一表面的时候,将严格按另一个方向反射,从而形成某一个方向才能观察的高亮度照射。 镜面光的和其它类型相比,计算量要大的多,一般D3D默认关闭,如果要打开需要把D3DRS_SPECULARENABLE设置为true。 2,材质 所谓的物体的颜色是他所反射的光的颜色,所以我们使用材质(materials)来模拟相同的现象,来定义物体表面对各种颜色光的反射比例。 数据结构为: typedef struct D3DMETRIAL9{ D3DCOLORVALUE Diffuse;//指定材质对漫射光的反射率 D3DCOLORVALUE Ambient;//指定材质对环境光的反射率 D3DCOLORVALUE Specular;//指定材质对镜面光的反射率 D3DCOLORVALUE Emissive;//用于增强物体亮度,使之看起来好像是自己发光 float Power;//指定锐度 } 3,顶点法线 法线是标志一个面或者点的朝向的向量。顶点法线是描述构成多边形的各个顶点的法线。 D3D需要知道顶点的法线方向,以确定光照到达表面时的入射角。而且,由于光照计算是对每个顶点进行的,所以D3D需要知道表面在每个顶点处的法线方向。 4,光源 D3D中有3种光源: 点光源(Point lights):在世界坐标系中有一个固定位置,向所有方向发射光 方向光(Directional lights):该光源没有位置信息,所发射的光线相互平行的向某一个特定方向传播 聚光灯(Spot lights):和手电筒类似,有一个位置信息,发射锥形的光 光源的数据结构是 typedef struct D3DLIGHT9{ |