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

實(shí)時(shí)陰影繪制技術(shù)研究

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

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

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

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

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

  我們先對(duì)比一下實(shí)現(xiàn)的差別,然后再具體解釋API的含義。

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

   四元數(shù)的原理有點(diǎn)復(fù)雜,由于速成關(guān)系我也沒有怎么看,只是知道可以簡單想象成一個(gè)向量加上一次旋轉(zhuǎn),具體的運(yùn)算推導(dǎo)有機(jī)會(huì)再研究吧。但這個(gè)東西用途的確很廣泛,因此被作為一種專門的方法被D3D介紹。

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

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

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

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

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

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

-------------------------------
   視口的使用上次已經(jīng)說過了,下面就看一下深度緩沖的使用。
   在框架里邊使用深度緩沖只要讓m_d3dEnumeration.AppUsesDepthBuffer = TRUE.然后在每一幀繪制前用m_pd3Device->Clear()方法清空緩沖區(qū)。
   HRESULT Clear(
                 DWORD Count,//矩形數(shù)量
                 const D3DRECT *pRects,//矩形指針
                 DWORD Flags,//要清除的緩沖類型
                 float Z,//Z緩沖設(shè)置的值
                 DWORD Stencil)//模板緩沖設(shè)置的值
   書中還講了一個(gè)深度緩沖精度影響渲染質(zhì)量的問題,為了達(dá)到無錯(cuò)誤的穩(wěn)定效果可以是用W緩沖器。方法如下:
   m_pd3Device->SetRenderState(D3DTS_ZNABLE,D3DZB_USEW).
但是這需要硬件的支持,為了穩(wěn)妥起見還是使用Z緩沖比較好。
-------------------------------
  總結(jié)來說,D3D要設(shè)置的矩陣分為三種:除了上次提到的世界坐標(biāo)矩陣,其實(shí)我理解也就是openGL里邊對(duì)應(yīng)的模型視圖矩陣中的模型矩陣,還有視矩陣和投影矩陣。它們的設(shè)置函數(shù)都是pDeviceObject->SetTransform(),只不過參數(shù)不同而已。所有的其他函數(shù)也好,表示也好最終都是為了獲得這三個(gè)矩陣,這讓我們撥開云霧見太陽,只要心中掛念這矩陣就可以了。
posted on 2006-01-05 11:48 苦行僧 閱讀(938) 評(píng)論(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>
            亚洲国产美女| 欧美屁股在线| 亚洲三级电影在线观看 | 亚洲一区二区少妇| 亚洲精品在线看| 一区二区三区视频在线| 中日韩男男gay无套| 亚洲欧美变态国产另类| 欧美在线观看一区| 免费欧美在线视频| 亚洲欧洲一区二区三区久久| 夜夜嗨av一区二区三区四区| 午夜精品剧场| 欧美成人午夜免费视在线看片 | 一区二区三区偷拍| 欧美一级大片在线观看| 理论片一区二区在线| 欧美日韩国产欧| 国产日韩在线播放| 亚洲精品国久久99热| 亚洲永久精品国产| 免费成人美女女| 亚洲视频成人| 久久亚洲精品视频| 国产精品激情电影| 亚洲福利视频三区| 羞羞色国产精品| 亚洲国产一区二区三区高清 | 欧美国产精品一区| 国产精品一区二区三区成人| 在线免费观看日本欧美| 亚洲影视在线播放| 欧美成人精品一区二区三区| 亚洲天堂av在线免费观看| 久久九九全国免费精品观看| 欧美视频一二三区| 亚洲毛片一区二区| 麻豆久久精品| 欧美亚洲自偷自偷| 欧美性大战久久久久久久蜜臀| 亚洲大胆人体视频| 久久久综合激的五月天| 亚洲网址在线| 欧美日韩一级黄| 亚洲精品在线电影| 欧美激情一区二区久久久| 欧美一区二区三区在线免费观看 | 久久综合图片| 亚洲免费在线电影| 欧美日韩激情小视频| 亚洲国产精品久久精品怡红院| 午夜欧美电影在线观看| 亚洲精品影视| 欧美黑人在线观看| 亚洲日本电影| 亚洲黄色成人网| 快she精品国产999| 伊人春色精品| 免费成人av| 欧美暴力喷水在线| 亚洲精选在线| 亚洲乱码久久| 欧美午夜视频在线观看| 亚洲一区二区精品在线| 亚洲最新视频在线| 国产精品青草久久| 欧美中文字幕在线| 欧美专区福利在线| 玉米视频成人免费看| 欧美激情第3页| 欧美激情免费在线| 亚洲一区www| 欧美一级一区| 亚洲国产一成人久久精品| 亚洲国产日韩在线一区模特| 欧美日韩和欧美的一区二区| 亚洲欧美国产三级| 欧美在线国产| 亚洲人成网站色ww在线| 亚洲精品在线二区| 国产精品视频免费观看www| 久久久久欧美精品| 免费观看30秒视频久久| 9人人澡人人爽人人精品| 在线午夜精品自拍| 国产一区视频在线观看免费| 欧美韩日一区二区| 国产精品毛片| 欧美aa国产视频| 欧美日韩xxxxx| 久久精品一区中文字幕| 免费不卡欧美自拍视频| 中文无字幕一区二区三区| 亚洲欧美日韩精品一区二区| 亚洲国产精品www| 亚洲无限乱码一二三四麻| 在线观看亚洲| 一区二区三区四区国产| 在线观看三级视频欧美| 在线亚洲精品福利网址导航| 激情成人在线视频| 这里只有精品丝袜| 亚洲国产精品成人一区二区| 亚洲天堂av图片| 亚洲美女一区| 久久久午夜电影| 亚洲免费视频中文字幕| 久久综合九色综合网站| 午夜久久久久久| 欧美精品www| 久久久久久久久久久久久久一区 | 欧美国产欧美亚洲国产日韩mv天天看完整| 一本色道久久加勒比精品| 久久成人免费日本黄色| 亚洲素人在线| 欧美高清在线一区二区| 久久久水蜜桃av免费网站| 欧美特黄视频| 亚洲黄页一区| 在线观看视频一区二区欧美日韩| 亚洲一卡久久| 亚洲一区日本| 欧美日韩在线三级| 亚洲人成在线影院| 91久久极品少妇xxxxⅹ软件| 久久精品国产96久久久香蕉| 欧美一区二区三区在| 国产精品v欧美精品v日本精品动漫| 欧美激情第10页| 亚洲国产日韩欧美一区二区三区| 性欧美8khd高清极品| 性久久久久久| 国产精品国产精品| 亚洲视频在线视频| 亚洲午夜性刺激影院| 欧美剧在线免费观看网站| 亚洲福利久久| 亚洲精品久久久久久久久久久久久| 久久久久国色av免费看影院| 久久久99久久精品女同性| 国产色视频一区| 欧美在线首页| 久久一二三国产| 亚洲电影在线免费观看| 久久综合图片| 91久久精品国产91久久性色tv | 久久精品国产96久久久香蕉| 国产精品中文字幕在线观看| 亚洲综合视频1区| 久久久久九九视频| 狠狠爱综合网| 巨乳诱惑日韩免费av| 亚洲成人在线视频播放 | 亚洲欧美中日韩| 欧美一级免费视频| 黄色成人在线观看| 欧美成人精品在线观看| 亚洲精品一区二区在线观看| 亚洲一区二区在线播放| 国产手机视频一区二区| 久久午夜激情| 亚洲美女在线国产| 欧美在线免费观看亚洲| 亚洲第一久久影院| 欧美日韩一区二区三区四区五区| 亚洲自拍16p| 欧美成人一区二区三区| 亚洲视频福利| 韩国美女久久| 欧美日韩视频免费播放| 久久成人这里只有精品| 亚洲欧洲三级电影| 久久精品国产99国产精品| 亚洲激情在线| 久久黄色网页| 亚洲精品资源| 久久深夜福利免费观看| 一区二区三欧美| 狠狠色噜噜狠狠狠狠色吗综合| 欧美激情女人20p| 欧美在线啊v| 一区二区三区视频在线观看| 老司机精品视频网站| 午夜精品久久久久久久久久久久久| 亚洲高清视频的网址| 国产欧美在线| 欧美午夜精品久久久久久孕妇| 久久九九免费视频| 亚洲一区中文| 亚洲国产成人在线| 老司机精品视频网站| 亚洲自啪免费| 日韩亚洲欧美一区二区三区| 狠狠爱综合网| 国产精品一国产精品k频道56| 欧美激情一级片一区二区| 久久久美女艺术照精彩视频福利播放 | 欧美日韩亚洲高清| 欧美高清在线视频| 毛片av中文字幕一区二区|