dx游戏编程吧 关注:13贴子:143

DX11资源贴,附带个人学习心得与记录

只看楼主收藏回复


网盘:
http://pan.baidu.com/share/link?shareid=523463&uk=2218023735
在这个网盘里面你可以下载到VS2012,DX SDK (June 2010),windows编程资料,DX11资料。
这个网盘会不定时更新,虽然我手头上还有其他的资料,但是都没时间去看它们,如果有价值的话我也会传到网盘上


IP属地:四川1楼2013-04-29 09:40回复

    原本只学过C语言,为了学习DX,临时翻看 C++ Primer恶补了一番,也许遗漏了一些知识,有空我会再加深对C++的学习
    网盘里面提供的是VS2012,但VS2010已经很够用了
    同时DirectX SDK里面的说明文档有很详细的介绍
    由于没我没有学过DX11以下的版本,所以我也不清楚DX11和其他版本具体有什么区别
    以下内容是个人学习的记录而已,写成教程的形式
    基本上可以说是Introduction to 3D Game Programming with DirectX 11的概括和翻译,部分补充
    以下教程大部分手打的,如有错误还望指出


    IP属地:四川2楼2013-04-29 09:43
    收起回复
      2025-09-03 23:00:29
      广告
      不感兴趣
      开通SVIP免广告

      第一章
      -------------------------------------------
      首先介绍一下Vectors,顾名思义…………向量具有方向和大小,在不同参考系中表示方法不同,但性质不变。它建立在Coordinate Systems上的,Direct3D使用的是left-handed coordinate,左手建立起来的坐标系,“aim your fingers down the
      positive x-axis, and then curl your fingers towards the positive y-axis, your thumb points roughly in the direction of the
      positive z-axis”所以说左右手建立的坐标系Z轴是相反的。
      下面系统地介绍一下Vector,大致看一下就可以了,
      定义u = (ux , uy , uz) and v = (vx , vy , vz).
      1.首先是等价关系,当且仅当向量的所有分量相等,我们可以说u=v
      2.向量加法u + v = (ux + vx , uy + vy , uz + vz)
      3.向量的标量乘积:k u =(kux , kuy , kuz).其中k是标量
      4.向量减法:u − v = u + (−1 ∙ v) = u + (−v)= (ux − vx , uy − vy , uz − vz)
      5.向量长度:|| u ||=√(ux²+uy²+uz²)
      6.单位向量
      7.向量的点乘:u ·v = ux vx+uy vy+uz vz = || u || || v || cos θ
      8.正交向量组:一组向量里的所有向量两两正交,称这个向量组为正交向量组
      9.向量组的正交化,标准正交化方法,公式,具体学校都有教
      10.向量的叉乘:w = u × v = (uy vz - uz vy , uz vx - ux vz , ux vy - uy vx)得到的新向量垂直于原向量平面,可用于获得第三维正交向量


      IP属地:四川3楼2013-04-29 09:45
      回复

        然后再来说说POINTS,向量和点都可以用(X,Y,Z)表示,但是这是两种不同的东西(废话了),点的运算和向量有关系,其实也没什么好讲的


        IP属地:四川4楼2013-04-29 09:45
        回复

          “In Direct3D 9 and 10, the D3DX library shipped with a 3D math utility library that included support for vectors among
          other core 3D math types required for doing 3D graphics. The D3DX library for version 11 no longer ships with 3D math
          code. Instead it ships with the XNA Math library”这是在书中看到的第一个地方说明DX11和以前版本的一处不同,文中所说的XNA Math采用了SIMD (Single Instruction Multiple Data单指令多数据) ,一条指令可以操作4个32-bit 的float或 int型
          要使用XNA数学函数只需添加#include <xnamath.h>即可。


          IP属地:四川5楼2013-04-29 09:46
          回复

            下面终于涉及到了编程内容了,
            XNA Math(下面简称XM)中定义了一种128位向量类型XMVECTOR,我们可以将多出的维度赋予0值。
            对于向量的定义也可以使用以下结构:
            Typedef struct _XMFLOAT2 {
            FLOAT x;
            FLOAT y;
            } XMFLOAT2;
            Typedef struct _XMFLOAT3 {
            FLOAT x;
            FLOAT y;
            FLOAT z;
            } XMFLOAT3;
            Typedef struct _XMFLOAT4 {
            FLOAT x;
            FLOAT y;
            FLOAT z;
            FLOAT w;
            } XMFLOAT4;
            但这种类型并不适用于XM,所以需要转化成XMVECTOR型,XM提供了加载和存储函数用于类型转换。
            下面是加载函数(load data from XMFLOAT* into XMVECTOR)
            XMVECTOR XMLoadFloat2(CONST XMFLOAT2 *pSource);
            XMVECTOR XMLoadFloat3(CONST XMFLOAT3 *pSource);
            XMVECTOR XMLoadFloat4(CONST XMFLOAT4 *pSource);
            还有更多的加载函数在XNA Math documentation中有说明,在这里就不一一介绍了
            下面是存储函数(store data from XMVECTOR into XMFLOAT*)
            VOID XMStoreFloat2(XMFLOAT2 *pDestination, FXMVECTOR V);
            VOID XMStoreFloat3(XMFLOAT3 *pDestination, FXMVECTOR V);
            VOID XMStoreFloat4(XMFLOAT4 *pDestination, FXMVECTOR V);
            没错,还更多的存储函数,用到的时候再说明。
            也许你发现了,上面用的传递类型是FXMVECTOR,而我们定义的向量类型是XMVECTOR,这里差异取决于平台的不同
            // 32-bit Windows
            Typedef const XMVECTOR FXMVECTOR;
            Typedef const XMVECTOR& CXMVECTOR;
            // 64-bit Windows
            Typedef const XMVECTOR& FXMVECTOR;
            Typedef const XMVECTOR& CXMVECTOR;
            注意到FXMVECTOR在不同的Windows平台下是不同的,这里是传值和引用的区别,估计是为了平台的兼容。
            在这里有个奇怪的传参规则:函数中前三个传参类型一定要是FXMVECTOR,剩余的为CXMVECTOR,而XMVECTOR不被直接使用,至于为什么要这么做,我也不知道= =!


            IP属地:四川6楼2013-04-29 09:48
            回复

              前面提到了许多向量的运算,因此XM进行操作符重载来改变常规运算符的运算规则,可以通过defining XM_NO_OPERATOR_OVERLOADS来关闭重载


              IP属地:四川7楼2013-04-29 09:51
              回复

                XM库还提供了一些现成的宏:
                ∏:
                #define XM_PI 3.141592654f
                #define XM_2PI 6.283185307f
                #define XM_1DIVPI 0.318309886f
                #define XM_1DIV2PI 0.159154943f
                #define XM_PIDIV2 1.570796327f
                #define XM_PIDIV4 0.785398163f
                弧度与角度的转换:
                XMFINLINE FLOAT XMConvertToRadians(FLOAT fDegrees)
                { return fDegrees * (XM_PI / 180.0f); }
                XMFINLINE FLOAT XMConvertToDegrees(FLOAT fRadians)
                { return fRadians * (180.0f / XM_PI) }
                最大值最小值:
                #define XMMin(a, b) ( ((a) < (b)) ? (a) : (b) )
                #define XMMin(a, b) ( ((a) > (b)) ? (a) : (b) )


                IP属地:四川8楼2013-04-29 09:51
                回复
                  2025-09-03 22:54:29
                  广告
                  不感兴趣
                  开通SVIP免广告

                  XM提供的XMVECTOR设值函数:
                  XMVECTOR XMVectorZero(); //返回向量0
                  XMVECTOR XMVectorSplatOne(); //返回向量(1, 1, 1, 1)
                  XMVECTOR XMVectorSet(FLOAT x, FLOAT y, FLOAT z, FLOAT w); //返回向量(x, y, z, w)
                  XMVECTOR XMVectorSplatX(FXMVECTOR V); //返回向量(vx, vx, vx, vx)
                  XMVECTOR XMVectorSplatY(FXMVECTOR V); //返回向量(vy, vy, vy, vy)
                  XMVECTOR XMVectorSplatZ(FXMVECTOR V); //返回向量(vz, vz, vz, vz)
                  函数使用的例子请自行运行Chapter 1 Vector Algebra中的源码查看


                  IP属地:四川9楼2013-04-29 09:52
                  回复

                    XMVECTOR相关向量运算函数:
                    (有认真看下面函数的话,你会发现如果当函数需要返回的应该是一个标量,这个函数也是返回XMVECTOR,其实返回的结果会赋给每一个维度相同的值)
                    //返回|| v ||
                    XMVECTOR XMVector3Length(FXMVECTOR V);
                    //返回|| v ||²
                    XMVECTOR XMVector3LengthSq(FXMVECTOR V);
                    //返回v1 • v2
                    XMVECTOR XMVector3Dot(FXMVECTOR V1, FXMVECTOR V2);
                    //返回v1 × v2
                    XMVECTOR XMVector3Cross(FXMVECTOR V1, FXMVECTOR V2);
                    //返回v/|| v || 单位向量
                    XMVECTOR XMVector3Normalizelize(FXMVECTOR V);
                    //返回一个正交于V的向量
                    XMVECTOR XMVector3Normalizelize(FXMVECTOR V);
                    //返回V1和V2向量之间的夹角
                    XMVECTOR XMVector3AngleBetweenVectors(FXMVECTOR V1, FXMVECTOR V2);
                    //pParallel返回为projn(V), pPerpendicular返回为prepn(V)
                    VOID XMVector3ComponentsFromNormal(XMVECTOR* pParallel, XMVECTOR* pPerpendicular, FXMVECTOR V, FXMVECTOR Normal);
                    //判断V1和V2是否等价
                    BOOL XMVector3Equal(FXMVECTOR V1, FXMVECTOR V2);
                    //判断V1和V2是否不等价
                    BOOL XMVector3NotEqual(FXMVECTOR V1, FXMVECTOR V2);
                    函数使用的例子请自行运行Chapter 1 Vector Algebra中的源码查看


                    IP属地:四川10楼2013-04-29 09:54
                    回复

                      XM库还提供了一些牺牲精度以提高运行速度的函数,例如:
                      //返回estimated || v ||
                      XMFINLINE XMVECTOR XMVector3LengthEst(FXMVECTOR V);
                      …………等函数


                      IP属地:四川11楼2013-04-29 09:54
                      回复

                        计算机在计算数据的时候以浮点型的方式保存数据,也就是说这里涉及到了精度的问题,一般得到的数值与预想可能会有偏差,因此请特别注意这些细节


                        IP属地:四川12楼2013-04-29 09:55
                        回复

                          第三章
                          ---------------------------------------
                          第三章讲的是各种变换.....
                          先说明一下变换是什么吧
                          定义τ是一种线性变换:τ (v) = τ(x , y , z) = (x', y', z').
                          存在如下关系:
                          u = (ux ,uy ,uz) and v = (vx ,vy ,vz)
                          1. τ (u + v) = τ (u) + τ (v)
                          2. τ (k u) = kτ (u)
                          因为u可以表示为如下:
                          u = (x , y , z) = x i + y j + z k = x (1, 0, 0) + y (0, 1, 0) + z (0, 0, 1)
                          显然这里涉及到了坐标系(也可以说是向量组的基)
                          (运用到了以上线性变换关系)从而得到
                          τ (u) = τ (x i + y j + z k) = xτ (i) + y τ (j) + zτ (k)
                          到这里我们可以注意到,其实能用向量和矩阵的乘法来实现
                          即τ (u) =uA (A为矩阵)
                          其中A可以视为函数τ的变换关系,也就是说这种变换关系可以用矩阵来表示


                          IP属地:四川16楼2013-04-29 10:01
                          回复
                            我们可以把这些转换归结为缩放,旋转,平移转换
                            根据矩阵乘法的结合性,这三种转换矩阵可以自由组合成新的矩阵,效果一样


                            IP属地:四川18楼2013-04-29 10:03
                            回复
                              2025-09-03 22:48:29
                              广告
                              不感兴趣
                              开通SVIP免广告

                              将一个数值从一个frame移到另一个frame中有不同的表示形式(我可以翻译成参考系吗),但是这个数值的意义是不变的,这就是接下来要讲的,将一个point/vector从一个frame移到另一个frame的坐标转换
                              在电脑3D制图中我们通常需要使用多个坐标系,因此我们必须知道这些point/vector该怎么在不同坐标系中转换,但是点和向量的转换方式是不一样的,我们将分来介绍


                              IP属地:四川19楼2013-04-29 10:03
                              回复