青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

實時陰影繪制技術研究

C++博客 首頁 新隨筆 聯系 聚合 管理
  48 Posts :: 20 Stories :: 57 Comments :: 0 Trackbacks

   在看了《無極》,看了《逃出克隆島》,看了《情癲大圣》以后,又把《friends》看到了season7,在感覺到一個人的節日極其無聊之后連續打了兩天籃球,打到肌肉拉傷、疲憊,渾身像散了架子一樣,然后沒日沒夜的睡覺用來休息,就這樣,墮落的元旦假期過去了。

   在內心的極度悔恨自責之后,又投入到我的directX學習中來。昨天看完了坐標變換的部分,今天要在迎接保密檢查的同時,把例子程序跑一跑,進一步鞏固一下學習成果。
   上次寫blog的時候只是簡單記錄了一下D3D的坐標變換,以及讓做好的矩陣應用到場景中的頂點上,并探索了一下使用視口的方法。這次我就把D3D坐標變換其余的部分補充完整。首先介紹一種物體的表示法,然后介紹兩種任意變換的方法,介紹視變換和投影變換,最后介紹深度緩沖的使用。
 
   上次介紹了對物體在三個坐標軸方向上做平移、縮放、旋轉的情況,可以使用D3DX系列的API直接構造變換矩陣,那么再復雜一點的情況就是繞自身軸的旋轉。使用上述基本變換實際上可以達到這一目的,只是有些麻煩,下面我們來探討一下更為通用的表達方式。為了達到這一目的就必須利用更加復雜的矩陣變換。
   首先我們借助一個結構來描述物體的定位:
struts Object
{
   D3DMATRIX matLocal;
}
用該矩陣中的三個向量分別表示物體的朝向:Look,Up,Right,這個里的含義如同openGL里邊相機的Look,Up,Right是一樣的。然而實際上定位一個物體除了上述三個向量表示的姿態以外,還需要一個位置信息,于是我們用第四行來記錄位置。將該矩陣設置為單位陣表示物體的變換從原點開始,沿坐標軸方向。這樣表示以后,物體繞Look軸轉就是橫滾(pitch),繞Up軸轉就是偏航(yaw),繞Right軸轉就是俯仰(roll)。
------------------------------------
   下面說一下用到的API。將一個向量按照指定矩陣變換的API是:D3DXVectorTransformCoord(D3DXVector* vNew,D3DXVector* vOld,D3DXMatrix* mat),那么旋轉用的矩陣mat又來源于D3DMatrixRotationAxis(D3DXMatrix* mat,D3DXVector* vAxis,FLOAT fRad),表示繞某一向量旋轉一個角度產生一個變換矩陣。有了這兩個API我們就可以通過將三個姿態向量指定給vAxis和vOld來獲取到新的姿態向量。
   需要注意的是,由于計算精度問題,上述計算進行多次以后會存在舍入誤差,使三個姿態向量不再垂直。為了解決這個問題需要在旋轉之前對三個向量進行歸一化。這里的歸一化不是對三個向量各自歸一,而是按照下述方式進行:
D3DXVec3Normalize(&vLook,&vLook);
D3DXVec3Cross(&vRight,&vUp,&vLook);
D3DXVec3Normalize(&vRight,&vRight);
D3DXVec3Cross(&vUp,&vLook,&vRight);
D3DXVec3Normalize(&vUp,&vUp);
可以看到是通過向量單獨歸一和叉乘的方式進行,既保證向量歸一,又保證垂直。
   matLocal矩陣的保存形式如下:第一行是Right,第二行是Up,第三行是Look,第四行是Position:
m_pObjects[0].matLocal._11 = vRight.x;
m_pObjects[0].matLocal._12 = vRight.y;
m_pObjects[0].matLocal._13 = vRight.z;
m_pObjects[0].matLocal._21 = vUp.x;
m_pObjects[0].matLocal._22 = vUp.y;
m_pObjects[0].matLocal._23 = vUp.z;
m_pObjects[0].matLocal._31 = vLook.x;
m_pObjects[0].matLocal._32 = vLook.y;
m_pObjects[0].matLocal._33 = vLook.z;
m_pObjects[0].matLocal._41 = vPos.x;
m_pObjects[0].matLocal._42 = vPos.y;
m_pObjects[0].matLocal._43 = vPos.z;
   下面我們把上述變換過程總結一下:
  1. 確定旋轉角度和旋轉軸。
  2. 取出當前的vRight,vLook,vUp,vPos向量;
  3. 對三個向量進行歸一化;
  4. 利用D3DMatrixRotationAxis(D3DXMatrix* mat,D3DXVector* vAxis,FLOAT fRad)產生旋轉矩陣;
  5. 利用D3DXVectorTransformCoord(D3DXVector* vNew,D3DXVector* vOld,D3DXMatrix* mat)對當前的vRight,vLook,vUp向量進行變換,得到新的vRight,vLook,vUp向量。
  6. 移動位置,獲得新的vPos;
  7. 將新的vRight,vLook,vUp,vPos向量設置到matLocal中。

----------------------------

上邊的表示方法我們看到要7個過程,這略微有些復雜,那么下面我們來看另外一種簡潔的計算方法-四元數(Quaternion)。

  我們先對比一下實現的差別,然后再具體解釋API的含義。

  1.  確定旋轉角度和旋轉軸。
  2. 利用D3DXQuaternionRotationYawPitchRoll(D3DXMatrix* mat,Float fYaw,FLOAT fPitch,FLOAT fRoll)的到變換矩陣。
  3. 把上述得到的矩陣同matLocal相乘得到新的matLocal;
  4. 做位置的變換。

   四元數的原理有點復雜,由于速成關系我也沒有怎么看,只是知道可以簡單想象成一個向量加上一次旋轉,具體的運算推導有機會再研究吧。但這個東西用途的確很廣泛,因此被作為一種專門的方法被D3D介紹。

   上邊只用到了一個API,那就是D3DXQuaternionRotationYawPitchRoll(D3DXMatrix* mat,Float fYaw,FLOAT fPitch,FLOAT fRoll),給定繞三個軸的旋轉角度,返回一個變換矩陣。

-----------------------------

   下邊看一下觀察變換,觀察矩陣同物體定位矩陣唯一不同的就是其存儲方式,它采取列向量的存儲方式。相機的各種變換同物體的變換沒有任何不同,最后也是得到一個矩陣,只是D3D提供了一個根據視點位置,相機朝向和向上方向構造矩陣的函數:D3DXMatrixLookAtLH(D3DXMatrix* mat,D3DXVECTOR3* pEye,D3DXVECTOR3* pAt,D3DXVECTOR3* pUp),省著自己算了。最后用m_pd3Device->SetTransform(D3DTS_VIEW,&mat)設置一下就可以了。

   這里需要注意的是D3DXMatrixLookAtLH()只適合于簡單的頭罩式顯示或者視點跟隨,對于具有復雜旋轉的飛行模擬器這類相機最好還是自己來算。計算的方式同前邊介紹的物體變換的方式一樣,也有兩種方式,一種是復雜的7步變換,一種是簡單的四元數變換。最后將得到的向量按照列向量的形式賦給視矩陣,再利用SetTransform()設置一下就好了。這實際上是一種自己維護相機的方式。

------------------------------

下面看一下投影變換。提到投影就會想到視錐,就會有視域角(FOV-field of view)、寬高比(aspect)和遠近裁減面這四個參數。在D3D里邊可以利用D3DXMatrixPerspectiveFoVLH(D3DXMATRIX* pOut,FLOAT fovY,FLOAT Aspect,FLOAT zn,FLOAT zf),通過給定的四個參數獲得投影矩陣,然后用m_pd3Device->SetTranform(D3DTS_PROJECTION,&pOut)來設置投影矩陣即可。

-------------------------------
   視口的使用上次已經說過了,下面就看一下深度緩沖的使用。
   在框架里邊使用深度緩沖只要讓m_d3dEnumeration.AppUsesDepthBuffer = TRUE.然后在每一幀繪制前用m_pd3Device->Clear()方法清空緩沖區。
   HRESULT Clear(
                 DWORD Count,//矩形數量
                 const D3DRECT *pRects,//矩形指針
                 DWORD Flags,//要清除的緩沖類型
                 float Z,//Z緩沖設置的值
                 DWORD Stencil)//模板緩沖設置的值
   書中還講了一個深度緩沖精度影響渲染質量的問題,為了達到無錯誤的穩定效果可以是用W緩沖器。方法如下:
   m_pd3Device->SetRenderState(D3DTS_ZNABLE,D3DZB_USEW).
但是這需要硬件的支持,為了穩妥起見還是使用Z緩沖比較好。
-------------------------------
  總結來說,D3D要設置的矩陣分為三種:除了上次提到的世界坐標矩陣,其實我理解也就是openGL里邊對應的模型視圖矩陣中的模型矩陣,還有視矩陣和投影矩陣。它們的設置函數都是pDeviceObject->SetTransform(),只不過參數不同而已。所有的其他函數也好,表示也好最終都是為了獲得這三個矩陣,這讓我們撥開云霧見太陽,只要心中掛念這矩陣就可以了。
posted on 2006-01-05 11:48 苦行僧 閱讀(938) 評論(0)  編輯 收藏 引用 所屬分類: directX
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产精品日韩精品| 一区二区三区四区精品| 欧美日韩一区二区在线观看视频 | 韩国一区二区三区美女美女秀| 欧美特黄一级| 亚洲国产精品va在线观看黑人| 日韩一区二区精品在线观看| 久久精品中文字幕一区| 99国产精品| 欧美高清日韩| 亚洲人在线视频| 国内揄拍国内精品久久| 国产精品毛片在线看| 国产精品人人做人人爽人人添| 欧美视频一区| 欧美三级电影精品| 国产精品ⅴa在线观看h| 欧美日韩亚洲91| 国产欧美日韩综合精品二区| 亚洲国产欧美久久| 亚洲欧美日韩一区二区| 蜜臀久久99精品久久久久久9| 亚洲电影毛片| 欧美影视一区| 国产精品普通话对白| 日韩一级不卡| 欧美影院午夜播放| 欧美日韩hd| 91久久嫩草影院一区二区| 欧美亚洲在线视频| 亚洲毛片视频| 欧美日韩免费观看一区| 欧美一区二区三区男人的天堂| 欧美一区二区三区啪啪| 亚洲国产日韩精品| 91久久精品一区| 国产精品一二三| 欧美精品在欧美一区二区少妇| 久久se精品一区二区| 亚洲香蕉伊综合在人在线视看| 亚洲福利视频一区| 国模一区二区三区| 欧美激情在线| 麻豆九一精品爱看视频在线观看免费| 久久天天狠狠| 午夜在线一区| 国产精品日韩一区二区三区| 亚洲九九九在线观看| 欧美成人性网| 欧美激情aⅴ一区二区三区| 亚洲欧洲日产国产网站| 91久久精品国产91久久性色tv | 中文日韩欧美| 这里只有视频精品| 国内精品嫩模av私拍在线观看| 欧美影院成年免费版| 亚洲国产综合在线| 欧美大片在线观看一区| 欧美大片在线观看| 欧美在线播放一区| 欧美11—12娇小xxxx| 香蕉久久国产| 免费在线观看精品| 欧美在线一级视频| 欧美猛交免费看| 老司机成人网| 国产精品你懂的| 亚洲黄一区二区| 狠狠久久亚洲欧美专区| 亚洲作爱视频| 99热这里只有成人精品国产| 午夜精品999| 欧美亚洲自偷自偷| 欧美日韩在线播| 亚洲电影av在线| 亚洲国产精品传媒在线观看 | 亚洲精品视频一区二区三区| 国产在线乱码一区二区三区| 亚洲视频在线看| 亚洲一区国产精品| 欧美日韩一级片在线观看| 欧美国产日韩亚洲一区| 国产综合欧美| 久久国产精品一区二区三区| 久久国产免费| 韩国一区电影| 嫩草成人www欧美| 亚洲国产日韩美| 一区二区三区高清在线观看| 欧美精品一区二区精品网 | 久久精品五月婷婷| 久久夜色精品| 亚洲精选在线| 国产精品夜夜夜| 久久久99爱| 一本色道久久综合狠狠躁篇的优点 | 老鸭窝91久久精品色噜噜导演| 国产综合在线视频| 欧美激情一区二区三区在线视频观看| 亚洲精品欧美| 蜜臀99久久精品久久久久久软件| 精久久久久久| 国产女主播视频一区二区| 久久综合五月| 久久er精品视频| 亚洲视频第一页| 亚洲第一在线视频| 狂野欧美一区| 久久精品国产精品亚洲| 亚洲在线成人| 一区二区日韩精品| 日韩视频在线观看一区二区| 一区二区三区亚洲| 国产色产综合色产在线视频| 欧美色一级片| 国产精品美女xx| 国产精品视频午夜| 国产日韩精品一区二区三区 | 久久综合伊人77777| 午夜精品视频网站| 欧美福利网址| 午夜在线电影亚洲一区| 好男人免费精品视频| 国产视频观看一区| 裸体一区二区| 欧美丰满少妇xxxbbb| 亚洲伊人第一页| 亚洲精品一区二区三区四区高清| 欧美亚洲在线播放| 国产精品国产精品| 亚洲性夜色噜噜噜7777| 亚洲精品一区中文| 欧美日韩在线播放三区四区| 亚洲精品乱码久久久久久蜜桃91| 免费日韩av片| 欧美69视频| 中文在线一区| 99精品欧美一区二区蜜桃免费| 欧美日韩一视频区二区| 亚洲欧美日韩在线| 亚洲欧美日韩专区| 狠狠入ady亚洲精品经典电影| 久久亚洲电影| 欧美另类视频| 久久精品1区| 欧美mv日韩mv亚洲| 亚洲一区图片| 久久免费少妇高潮久久精品99| 尤物精品在线| 一区二区三区四区在线| 狠狠88综合久久久久综合网| 亚洲国产你懂的| 国产精品久久久久久久久久三级 | 国产精品主播| 欧美大片一区二区| 欧美日韩美女在线| 久久综合一区二区| 国产精品天美传媒入口| 欧美风情在线观看| 国际精品欧美精品| 亚洲视频一二| 亚洲性线免费观看视频成熟| 蜜臀久久久99精品久久久久久| 欧美一区影院| 国产精品亚洲精品| 亚洲视频一二| 欧美区亚洲区| 久久人人爽人人爽| 国产精品捆绑调教| 欧美国产日韩视频| 国产欧美在线观看一区| 亚洲人精品午夜| 黄色日韩精品| 久久本道综合色狠狠五月| 一本色道久久精品| 免费观看日韩| 牛人盗摄一区二区三区视频| 国产精品爽黄69| 99re国产精品| 亚洲一区二区三区激情| 欧美精品乱人伦久久久久久| 免费欧美电影| 亚洲国产三级| 欧美日韩国产不卡在线看| 欧美成人激情视频| 国产综合欧美在线看| 亚洲淫性视频| 欧美一区二区成人6969| 国产精品99一区| 亚洲尤物影院| 久久亚洲综合色| 日韩视频二区| 欧美激情第五页| 亚洲国产精品久久久久婷婷老年| 亚洲精品久久久久久久久| 欧美三级日韩三级国产三级| 久久国产精品一区二区| 亚洲电影专区| 午夜国产精品影院在线观看| 国产一区二区三区四区hd|