




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第八章:索引緩沖Introduction (序)這一章我們將學(xué)習(xí)一下關(guān)于索引緩沖的內(nèi)容。首先,我們要改進(jìn)一下CCuboid使它能支持索引緩沖。然后我們會(huì)創(chuàng)建一個(gè)類CTerrain,一個(gè)很簡單的地形發(fā)生器。當(dāng)我們的地形生成后,我們還會(huì)賦予它草的紋理,使它看起來更真實(shí)。What is an Index Buffer? (什么是索引緩沖)索引緩沖就是內(nèi)存中的一塊用于索引頂點(diǎn)的區(qū)域。不明白?接著看。當(dāng)渲染場景時(shí),DX會(huì)對每個(gè)頂點(diǎn)都進(jìn)行許多計(jì)算,例如燈光、變幻等等,這樣,運(yùn)算量會(huì)很大。但是我們總是希望讓DX做最少的運(yùn)算以增加程序的效率,因此,我們需要把頂點(diǎn)的數(shù)目減到最少。這樣,索引緩沖就派上用場了。舉個(gè)
2、例子能更好地理解:假如我們想要繪制一個(gè)正方形,那末它需要由兩個(gè)三角形來構(gòu)成,總共6個(gè)頂點(diǎn)(用三角列)。但實(shí)際上4頂點(diǎn)就應(yīng)當(dāng)能確定一個(gè)正方形了(每角一個(gè)),用6個(gè)頂點(diǎn)是因?yàn)槠渲杏?個(gè)頂點(diǎn)被重合(相同的值)了。因?yàn)槲覀冇许旤c(diǎn)重合了,所以用索引緩沖是一個(gè)好主意。它是這樣工作的:首先我們在頂點(diǎn)緩沖中只定義4個(gè)頂點(diǎn)(每角一個(gè)),然后在索引緩沖中定義6個(gè)索引,每個(gè)索引都會(huì)映射頂點(diǎn)緩沖中的一個(gè)頂點(diǎn)。然后我們用索引緩沖中的索引來渲染三角形,那末實(shí)際上我們只用了4個(gè)頂點(diǎn)。下圖(8.1)演示了所舉的這個(gè)例子:Fig 8.1在上面的例子中,我們只用了4個(gè)頂點(diǎn)就定義了一個(gè)正方形,實(shí)際節(jié)約了2個(gè)頂點(diǎn)。注意索引緩沖中的順
3、序是順時(shí)針的,這是頂點(diǎn)被渲染的順序。然后我們會(huì)像以前那樣渲染場景,只不過這次除了頂點(diǎn)緩沖之外我們還用了索引緩沖。那末如果我們把這種方法應(yīng)用到我們的立方體上面,我們就會(huì)節(jié)約12個(gè)頂點(diǎn)。不要說那并不多,想象一個(gè)有100個(gè)立方體的場景,我們在每一幀上都會(huì)節(jié)約1200個(gè)頂點(diǎn)呢!Implementing an Index Buffer in DirectX (在DX中實(shí)現(xiàn)索引緩沖)我們需要給CCuboid添加一個(gè)索引緩沖,要實(shí)現(xiàn)這個(gè),我們需要添加如下代碼:Step 1: Creating the Index Buffer (創(chuàng)建索引緩沖)首先,我們需要兩個(gè)新的成員變量:一個(gè)LPDIRECT3DINDEX
4、BUFFER8型的m_pIndexBuffer,索引緩沖指針;一個(gè)DWORD變量m_dwNumOfIndices,對象(頂點(diǎn))索引數(shù)目,在此為36(6個(gè)面X每面2個(gè)三角形X每個(gè)三角形3個(gè)頂點(diǎn)),構(gòu)造函數(shù)會(huì)這樣設(shè)置。我們還有一個(gè)新的模塊CreateIndexBuffer,在構(gòu)造函數(shù)中,我們會(huì)在設(shè)置頂點(diǎn)值之前調(diào)用它。使用索引緩沖的方法與使用頂點(diǎn)緩沖是類似的:首先我們創(chuàng)建索引緩沖并且得到它的指針(m_pIndexBuffer),然后我們臨時(shí)地把36個(gè)頂點(diǎn)索引都保存到一個(gè)數(shù)組當(dāng)中,然后鎖定索引緩沖,最后把數(shù)組復(fù)制給它并解鎖。LPDIRECT3DINDEXBUFFER8 m_pIndexBuffer;D
5、WORD m_dwNumOfIndices; bool CCuboid:CreateIndexBuffer() VOID* pBufferIndices; /Create the index buffer from our device if(FAILED(m_pD3DDevice->CreateIndexBuffer(m_dwNumOfIndices * sizeof(WORD), 0, D3DFMT_INDEX16, D3DPOOL_MANAGED, &m_pIndexBuffer) return false; /Set values for the index buffer
6、 WORD pIndices = 0, 1, 2, 3, 2, 1, /Top 4, 5, 6, 7, 6, 5, /Face 1 8, 9,10,11,10, 9, /Face 2 12,13,14,15,14,13, /Face 3 16,17,18,19,18,17, /Face 4 20,21,22,23,22,21; /Bottom /Get a pointer to the index buffer indices and lock the index buffer m_pIndexBuffer->Lock(0, m_dwNumOfIndices * sizeof(WORD)
7、, (BYTE*)&pBufferIndices, 0); /Copy our stored indices values into the index buffer memcpy(pBufferIndices, pIndices, m_dwNumOfIndices * sizeof(WORD); /Unlock the index buffer m_pIndexBuffer->Unlock(); return true; Step 2: Modify the Vertex Buffer (修改頂點(diǎn)緩沖)我們需要修改一下UpdateVertices模塊。首先也是最主要的就是這回我
8、們只需要24個(gè)頂點(diǎn),而不是36個(gè)。然后我們會(huì)像上一章那樣初始化法線向量為0。此章的另一點(diǎn)不同就是我們將計(jì)算出三角形的共享頂點(diǎn)的均分法線(上一章我們只是把三角形的法線簡單地相加,而沒有均分),實(shí)際上我們并不真的需要對這個(gè)立方體這樣做,目的只是想充當(dāng)一個(gè)例子。在UpdateVertices中我們增添了兩個(gè)新的指針pNumOfSharedPolygons和pSumVertexNormal,它們分別指向兩個(gè)數(shù)組:一個(gè)WORD型的用于描述所有頂點(diǎn)周圍的三角形數(shù)目(也就是幾個(gè)三角形共享那個(gè)頂點(diǎn));另一個(gè)D3DVECTOR型的用于保存所有頂點(diǎn)的均分法線向量。接下來我們將計(jì)算出每個(gè)頂點(diǎn)的均分法線向量。在Upd
9、ateVertices中當(dāng)我們初始化所有頂點(diǎn)之后,我們會(huì)有一個(gè)循環(huán),索引緩沖中的所有的頂點(diǎn)索引都會(huì)通過它。循環(huán)將計(jì)算出每個(gè)三角形的法線、累加被引用的頂點(diǎn)的計(jì)數(shù)(保存在pNumOfSharedPolygons中,被引用的次數(shù)也就是周圍的三角形數(shù)),還把得出的三角形法線向量加到它周圍的三個(gè)頂點(diǎn)的法線向量上(由pSumVertexNormal保存,這樣整個(gè)循環(huán)結(jié)束后就能得出所有頂點(diǎn)的法線向量了,只不過還沒有均分)。然后,我們會(huì)根據(jù)每個(gè)頂點(diǎn)的引用計(jì)數(shù)(也就是幾個(gè)三角形共享那個(gè)頂點(diǎn))來計(jì)算出所有頂點(diǎn)的均分法線向量,接著我們會(huì)將它規(guī)格化,確保向量的x、y和z都能在0和1之間。最后,我們還得把得出的每個(gè)頂點(diǎn)
10、均分法線向量應(yīng)用到對應(yīng)的頂點(diǎn)上,然后像以往一樣復(fù)制到頂點(diǎn)緩沖中。bool CCuboid:UpdateVertices() DWORD i; VOID* pVertices; WORD* pBufferIndices; D3DXVECTOR3 vNormal; DWORD dwVertex1; DWORD dwVertex2; DWORD dwVertex3; /Array holds how many times this vertex is shared WORD* pNumOfSharedPolygons = new WORDm_dwNumOfVertices; /Array holds
11、 sum of all face normals for shared vertex D3DVECTOR* pSumVertexNormal = new D3DVECTORm_dwNumOfVertices; /Clear memory for(i = 0; i < m_dwNumOfVertices; i+) pNumOfSharedPolygonsi = 0; pSumVertexNormali = D3DXVECTOR3(0,0,0); CUBOID_CUSTOMVERTEX cvVertices = /Top Face m_rX - (m_rWidth / 2), m_rY +
12、(m_rHeight / 2), m_rZ - (m_rDepth / 2), 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, /Vertex 0 m_rX - (m_rWidth / 2), m_rY + (m_rHeight / 2), m_rZ + (m_rDepth / 2), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, /Vertex 1 m_rX + (m_rWidth / 2), m_rY + (m_rHeight / 2), m_rZ - (m_rDepth / 2), 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, /Vertex 2
13、m_rX + (m_rWidth / 2), m_rY + (m_rHeight / 2), m_rZ + (m_rDepth / 2), 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, /Vertex 3 /Face 1 m_rX - (m_rWidth / 2), m_rY - (m_rHeight / 2), m_rZ - (m_rDepth / 2), 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, /Vertex 4 m_rX - (m_rWidth / 2), m_rY + (m_rHeight / 2), m_rZ - (m_rDepth / 2), 0.
14、0f, 0.0f, 0.0f, 0.0f, 0.0f, /Vertex 5 m_rX + (m_rWidth / 2), m_rY - (m_rHeight / 2), m_rZ - (m_rDepth / 2), 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, /Vertex 6 m_rX + (m_rWidth / 2), m_rY + (m_rHeight / 2), m_rZ - (m_rDepth / 2), 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, /Vertex 7 /Face 2 m_rX + (m_rWidth / 2), m_rY - (m_r
15、Height / 2), m_rZ - (m_rDepth / 2), 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, /Vertex 8 m_rX + (m_rWidth / 2), m_rY + (m_rHeight / 2), m_rZ - (m_rDepth / 2), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, /Vertex 9 m_rX + (m_rWidth / 2), m_rY - (m_rHeight / 2), m_rZ + (m_rDepth / 2), 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, /Vertex 10 m_r
16、X + (m_rWidth / 2), m_rY + (m_rHeight / 2), m_rZ + (m_rDepth / 2), 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, /Vertex 11 /Face 3 m_rX + (m_rWidth / 2), m_rY - (m_rHeight / 2), m_rZ + (m_rDepth / 2), 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, /Vertex 12 m_rX + (m_rWidth / 2), m_rY + (m_rHeight / 2), m_rZ + (m_rDepth / 2), 0.0
17、f, 0.0f, 0.0f, 0.0f, 0.0f, /Vertex 13 m_rX - (m_rWidth / 2), m_rY - (m_rHeight / 2), m_rZ + (m_rDepth / 2), 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, /Vertex 14 m_rX - (m_rWidth / 2), m_rY + (m_rHeight / 2), m_rZ + (m_rDepth / 2), 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, /Vertex 15 /Face 4 m_rX - (m_rWidth / 2), m_rY - (m
18、_rHeight / 2), m_rZ + (m_rDepth / 2), 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, /Vertex 16 m_rX - (m_rWidth / 2), m_rY + (m_rHeight / 2), m_rZ + (m_rDepth / 2), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, /Vertex 17 m_rX - (m_rWidth / 2), m_rY - (m_rHeight / 2), m_rZ - (m_rDepth / 2), 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, /Vertex 18
19、 m_rX - (m_rWidth / 2), m_rY + (m_rHeight / 2), m_rZ - (m_rDepth / 2), 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, /Vertex 19 /Bottom Face m_rX + (m_rWidth / 2), m_rY - (m_rHeight / 2), m_rZ - (m_rDepth / 2), 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, /Vertex 20 m_rX + (m_rWidth / 2), m_rY - (m_rHeight / 2), m_rZ + (m_rDepth
20、/ 2), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, /Vertex 21 m_rX - (m_rWidth / 2), m_rY - (m_rHeight / 2), m_rZ - (m_rDepth / 2), 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, /Vertex 22 m_rX - (m_rWidth / 2), m_rY - (m_rHeight / 2), m_rZ + (m_rDepth / 2), 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, /Vertex 23 ; /Get a pointer to the index b
21、uffer indices and lock the index buffer m_pIndexBuffer->Lock(0, m_dwNumOfIndices * sizeof(WORD), (BYTE*)&pBufferIndices, D3DLOCK_READONLY); /For each triangle, count the number of times each vertex is used and /add together the normals of faces that share a vertex for(i = 0; i < m_dwNumOfI
22、ndices; i += 3) dwVertex1 = pBufferIndicesi; dwVertex2 = pBufferIndicesi + 1; dwVertex3 = pBufferIndicesi + 2; vNormal = GetTriangeNormal(&D3DXVECTOR3(cvVerticesdwVertex1.x, cvVerticesdwVertex1.y, cvVerticesdwVertex1.z), &D3DXVECTOR3(cvVerticesdwVertex2.x, cvVerticesdwVertex2.y, cvVerticesdw
23、Vertex2.z), &D3DXVECTOR3(cvVerticesdwVertex3.x, cvVerticesdwVertex3.y, cvVerticesdwVertex3.z); pNumOfSharedPolygonsdwVertex1+; pNumOfSharedPolygonsdwVertex2+; pNumOfSharedPolygonsdwVertex3+; pSumVertexNormaldwVertex1.x += vNormal.x; pSumVertexNormaldwVertex1.y += vNormal.y; pSumVertexNormaldwVer
24、tex1.z += vNormal.z; pSumVertexNormaldwVertex2.x += vNormal.x; pSumVertexNormaldwVertex2.y += vNormal.y; pSumVertexNormaldwVertex2.z += vNormal.z; pSumVertexNormaldwVertex3.x += vNormal.x; pSumVertexNormaldwVertex3.y += vNormal.y; pSumVertexNormaldwVertex3.z += vNormal.z; /Unlock the index buffer m_
25、pIndexBuffer->Unlock(); /For each vertex, calculate and set the average normal for(i = 0; i < m_dwNumOfVertices; i+) vNormal.x = pSumVertexNormali.x / pNumOfSharedPolygonsi; vNormal.y = pSumVertexNormali.y / pNumOfSharedPolygonsi; vNormal.z = pSumVertexNormali.z / pNumOfSharedPolygonsi; D3DXVe
26、c3Normalize(&vNormal, &vNormal); cvVerticesi.nx = vNormal.x; cvVerticesi.ny = vNormal.y; cvVerticesi.nz = vNormal.z; /Get a pointer to the vertex buffer vertices and lock the vertex buffer if(FAILED(m_pVertexBuffer->Lock(0, sizeof(cvVertices), (BYTE*)&pVertices, 0) return false; /Copy
27、 our stored vertices values into the vertex buffer memcpy(pVertices, cvVertices, sizeof(cvVertices); /Unlock the vertex buffer m_pVertexBuffer->Unlock(); /Clean up delete pNumOfSharedPolygons; delete pSumVertexNormal; pNumOfSharedPolygons = NULL; pSumVertexNormal = NULL; return true;Step 3: Render (渲染)Render模塊也相應(yīng)地做了改動(dòng):首先,我們要通知DX我們要用索引緩沖來渲染三角形,所以我們得調(diào)用SetIndices并且把索引緩沖的指針給它;其次,我們要用DrawIndexedPrimitive代替原來的DrawPrimitive以支持用索引緩沖渲染三角形。/Select index bufferm_pD3DDevice->SetIndices(m_pIndexBuffer, 0);/Render polygon
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年醫(yī)療器械管理師資格考試試卷及答案
- 2025年外科醫(yī)生資格考試試題及答案
- Scyphostatin-生命科學(xué)試劑-MCE
- Agmatine-sulfate-Standard-生命科學(xué)試劑-MCE
- 2025年人民幣匯率波動(dòng)影響分析考試試卷及答案
- 2025年農(nóng)作物育種學(xué)期末考試試題及答案
- 2025年社會(huì)心理學(xué)專業(yè)知識考試題及答案
- 2025年基礎(chǔ)工程與施工管理考試試題及答案
- 2025年教師資格考試重點(diǎn)復(fù)習(xí)試卷及答案
- 2025年酒店管理專業(yè)實(shí)務(wù)考試題及答案
- 湖北省武漢市2025屆高三年級五月模擬訓(xùn)練試題數(shù)學(xué)試題及答案(武漢五調(diào))
- 長三角地區(qū)地圖(可以隨意更改顏色、轉(zhuǎn)動(dòng)、組合))
- SIDEL吹瓶機(jī)原理ppt課件
- 球墨鑄鐵管件項(xiàng)目可行性研究報(bào)告寫作范文
- 小數(shù)加減法脫式計(jì)算及簡便運(yùn)算100道
- 抹灰工程施工方案預(yù)拌砂漿
- MSG-3中文版課件
- 盾構(gòu)施工總結(jié)(doc106頁)
- 轉(zhuǎn)發(fā)省局《關(guān)于加強(qiáng)非煤礦山安全生產(chǎn)班組建設(shè)的指導(dǎo)意見》的通知
- 第四節(jié)SS4改型電力機(jī)車常見故障處理
- 分部驗(yàn)收橋梁主體驗(yàn)收評估報(bào)告
評論
0/150
提交評論