博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
DirectX基础学习系列2
阅读量:6006 次
发布时间:2019-06-20

本文共 2834 字,大约阅读时间需要 9 分钟。

补充第一章矩阵内容

向量

1 3D空间向量,包含浮点数类型坐标

D3DXVECTOR-->D3DXVECTOR3

2向量的长度

D3DXVector3Length(const D3DXVECTOR3* );

3向量规范化

D3DXVectorNormalize(D3DXVECTOR3*  , CONST D3DXVECTOR3* )

4 向量点乘

FLOAT D3DXVector3Dot( CONST D3DXVECTOR3*, CONST D3DXVECTOR3* );

5.向量叉乘

D3DXVector3Cross(D3DXVECTOR3*, CONST D3DXVECTOR3*, CONST D3DXVECTOR3* );

矩阵

D3DMATRIX-->D3DXMATRIX

typedef struct D3DXMATRIX

{

    FLOAT _11, FLOAT _12, FLOAT _13, FLOAT _14,

    FLOAT _21, FLOAT _22, FLOAT _23, FLOAT _24,

    FLOAT _31, FLOAT _32, FLOAT _33, FLOAT _34,

    FLOAT _41, FLOAT _42, FLOAT _43, FLOAT _44 );

} D3DXMATRIX;

D3DXMATRIX * D3DXMatrixIdentity(__inout  D3DXMATRIX *pOut); 单位矩阵
D3DXMATRIX * D3DXMatrixInverse();矩阵求逆
D3DXMATRIX * D3DXMatrixTranspose();矩阵转置
用于世界变换
D3DXMatrixTranslation:平移矩阵。例如:D3DXMatrixTranslation(x, y, z)将物体平移到(x, y, z)
D3DXMatrixRotationX:绕x轴旋转。类似的有绕Y和Z轴的旋转函数。例如:D3DXMatrixRotationX(&matrix,fAngle)。其中fAngle是旋转弧度
D3DXMatrixRotationAxis:绕任意轴旋转
D3DXMatrixRotationQuaternion:绕四元组旋转。
D3DXMatrixScaling:对物体进行缩放操作

2.1 模型表示

2.1.1 顶点格式

1Vertex  顶点包含空间信息,也包含其他附加属性,如位置、颜色、纹理等

2顶点的格式可以自由定制:Flexiable vertex Format (FVF) 

struct ColorVertex 

{

    float x,y,z;

    DWORD color ;

对应的FVF标志:#define FVF_COLOR (D3DFVF_XYZ | D3DFVF_DIFFUSE),需要注意的是灵活定点格式标记的顺序和

顶点结构中定义的顺序保持一致。

2.1.2 三角形单元

三维中物体都有三角面片构成,由顶点构成,顶点的顺序很重要,即饶序(winding order)

2.1.3 定点列表和索引列表的概念

2.2 虚拟摄像机

2.3 绘制流水线 rendering pipeline

局部坐标系-->世界坐标系-->观察坐标系--> 背面消隐-->光照-->剪裁-->投影-->视口坐标系-->光栅化

2.3.1局部坐标系 ,建模坐标系,

2.3.2世界坐标系,通过世界变换将局部坐标系转换到世界坐标系,包括平移,旋转以及缩放

        D3D通过IDirect3DDevice9::SetTransform()进行坐标转换

        Deveice->SetTranform(D3DTS_WORLD,D3DDXMATRIX*)

2.3.3观察者坐标系

    取景变换 :世界坐标系中的所有几何体随着摄像机一起变换,摄像机原点与世界坐标系原点重合,摄像机的坐标与世界坐标系的Z轴重合

    取景变换矩阵,观察矩阵

D3DXMATRIX * D3DXMatrixLookAtLH(  __inout  D3DXMATRIX *pOut,  __in     const D3DXVECTOR3 *pEye,    //摄像机所在位置  __in     const D3DXVECTOR3 *pAt,     //摄像机观察的点  __in     const D3DXVECTOR3 *pUp      //世界坐标系的方向,一般采用(0,1,0));
Device->SetTransform(D3DTS_VIEW, &V);   //取景变换
2.3.4 背面消隐
和绕序winding order相关,顶点排列为顺时针的为正面,逆时针的为背面
HRESULT SetRenderState(  [in]  D3DRENDERSTATETYPE State,  [in]  DWORD Value);
state 等于D3DRS_CULLMODE为背面消隐状态
value可以为:D3DCULL_NONE ,D3DCULL_CW , D3DCULL_CCW
2.3.5 光照
2.3.6 剪裁
2.3.7 投影(透视投影)
透视投影定义了视域体,并将视域体中的几何体投影到投影窗口中,获得投影矩阵的函数:
D3DXMATRIX * D3DXMatrixPerspectiveFovLH(  D3DXMATRIX * pOut,  FLOAT fovy,  FLOAT Aspect,  FLOAT zn,  FLOAT zf);
获得的投影方程如下:
xScale     0          0               00        yScale       0               00          0       zf/(zf-zn)         10          0       -zn*zf/(zf-zn)     0where:yScale = cot(fovY/2)xScale = aspect ratio / yScale
投影变换:Device->SetTransform(D3DTS_PROJECTION, &V);
2.3.8 视口变换
视口(显示窗口)的表达:
typedef struct D3DVIEWPORT9 {    DWORD X;    DWORD Y;    DWORD Width;    DWORD Height;    float MinZ;    float MaxZ;} D3DVIEWPORT9
设置显示窗口:
D3DViewPort vp  = {0,0,640,480,0,1};
SetViewport(&vp);
2.3.9 光栅化
 
上面算是绘制流水线过程吧 ,和directdraw差异还是挺大的

转载地址:http://jcsmx.baihongyu.com/

你可能感兴趣的文章
Redhat 系统相关调优参数注解
查看>>
nextus的使用
查看>>
Python自动化开发学习5-2-subprocess模块
查看>>
编程实现最小化窗口到桌面右下角图标的代码
查看>>
ELK stack实战之结合rsyslog分析系统日志(auth.log)
查看>>
网络管理工具与IT运维管理平台的差别
查看>>
五一期间安全回顾 木马威胁提升 移动设备数据泄漏受重视
查看>>
VDI序曲二十 桌面虚拟化和RemoteApp集成到SharePoint 2010里
查看>>
oracle里long类型的总结
查看>>
10种有用的CSS技巧
查看>>
服务端接口中的那些坑
查看>>
MySql like 查询 变向写法(不用like 完成like查询)
查看>>
Struts 笔记
查看>>
《C++面向对象高效编程(第2版)》——2.2 对象接口的重要性
查看>>
五个 ping 工具的使用实例
查看>>
在Linux系统下玩《炉石传说:魔兽英雄传》
查看>>
阿里数据库内核月报:2016年01月
查看>>
Samba 系列(七):在 Samba AD DC 服务器上创建共享目录并映射到 Windows/Linux 客户...
查看>>
The Joy of Clojure – Clojure philosophy(1)
查看>>
Apache Storm 官方文档 —— 多语言接口协议
查看>>