簡體   English   中英

將2D位圖轉換為3D立方體模型的有效方法?

[英]Efficient way to convert a 2D bitmap into a 3D cube model?

我想在opengl中創建32x32位圖的多維數據集模型。 例如,給定Super Mario的Bob-omb二維位圖,結果應類似於此: http : //fc02.deviantart.net/fs49/f/2009/186/f/a/Bob_omb_in_Minecraft_by_Luafox.png將位圖中的每個2D像素表示為3D立方體。

每個模型都會在游戲中代表一個敵人,因此我需要能夠快速渲染它們。 什么是這樣做的好方法?

我所做的一種嘗試是通過首先創建32x32x2的頂點網格,然后在適當的位置從這些頂點創建三角形以形成立方體面,來從位圖生成靜態3D模型。 我遇到的一個大問題是如何存儲面部的顏色和法線。 每個面的三角形需要共享一個頂點,並且該共享的頂點需要存儲該面的顏色和法線。 但是,我認為我的每個頂點沒有足夠的頂點具有適當的顏色和法線。 我想不出一種優雅的方法來解決這個問題。

如果將正面作為單個紋理映射的GL_QUAD渲染,則將是最快的,對“透明”部分使用alpha和GL_ALPHA_TEST。 然后,將邊界(即非正面正方形)作為一個或多個GL_QUAD_STRIP。

如果確定要將子圖形繪制為一系列實際的立方體,例如,如果要將子圖形分解為單獨的立方體,或者如果在小的立方體面上具有非常詳細的紋理,則為一個立方體創建顯示列表並反復調用該顯示列表。

關於存儲臉部的顏色和法線; 我認為您必須接受需要在相同位置為不同的面孔復制頂點。 如果兩個頂點共享某些屬性而其他頂點不同,則它們實質上是不同的-即使它們共享的一個屬性是位置。

因此,您應該構建一些VBO,並根據需要復制頂點。 您可能希望將其作為設計時步驟運行,並將結果保存為方便的格式,以便在運行時保存一些工作。

編輯:這並不意味着您需要為每個立方體的每個面的每個角具有單獨的頂點。 實際上,通過合理的簡單實現來呈現所需內容(將塊組合在一起)的最便宜方法可能是使用顏色紋理, GL_MAG_FILTER, GL_NEAREST采樣和仔細對齊來將前和后分別渲染為兩個三角形。紋理坐標,使用像素着色器修剪透明紋理。

然后,您需要做更多的工作(不一定在運行時),以確定哪些面從側面可見,並將每個面作為幾何圖形(所有幾何圖形都作為單個靜態VBO顯示,因此與(例如,盡管不常用,盡管仍然有用)為每個多維數據集顯示列表相比,減少了繪制調用的次數和幾何圖形成本。 同樣,您可以小心地確保其與正面和背面的不可見部分精確結合。

如果您確實想讓敵人炸毀,並使組成的多維數據集按照各自的方式運行,則可以切換到顯示每個多維數據集的更昂貴的版本。

只是暗示您如何找到一些有趣的閱讀材料:搜索“ voxel”。 http://en.wikipedia.org/wiki/Voxel

也許您想看看開源游戲引擎Cube / Sauerbraten的源代碼,它們基於地圖的多維數據集細分,並帶有一個不錯的游戲內編輯器: http : //sauerbraten.org/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM