2011-10-04 100 views
4

我搜索了一會兒,我聽到的不同的方法可以做到這一點,所以我想我會來到這裏,看到我應該做的,變形地形[蠕蟲狀]

從我所蒐集的數據中,我應該使用.. glBitmap和0和0xFF值來創建地形。對此有何意見? 我嘗試將它切換爲四邊形,但我不確定這是否有效,以及它意味着要完成的方式。

我希望地形能有隧道,如蠕蟲。 2維。

這是我到目前爲止已經試過,

我試圖做一個glBitmap,所以..

pixels = pow(2 * radius, 2); 
ras = new GLubyte[pixels]; 

,然後將它們全部設置爲0xFF,並使用glBitmap拔出來(x,y,0,0,ras); 然後可以檢查爆炸以及哪些像素可以設置爲零。這是一個合理的方法嗎?我對opengl不太滿意,我可以在glBitmap上放置紋理嗎?從我所看到的,我不認爲你可以。

+1

OpenGL只是繪圖;通過操縱內存中的數據,通過OpenGL在*繪製幀之間*變形地形是您的代碼所要做的事情。是一個高度場地形,或者你需要它來支持洞穴和懸崖之類的東西嗎? (Heightfields要簡單得多。) – Wyzard

+0

是的,我喜歡像蠕蟲一樣的地形,能夠製作隧道。 – Fouf

+0

您應該在發佈之前仔細檢查您的問題,並提供更多相關的詳細信息和/或示例。 – Kromster

回答

3

我會建議你使用模板緩存。您在模板緩衝區中標記地形的破壞部分,然後使用簡單的四邊形啓用模板測試來繪製地形,而無需手動測試每個像素。

+0

我正在尋找這個,看起來像個好主意..只需要查看模板緩衝區,從來沒有玩過它。 – Fouf

+2

@Fouf - 查看gamedev.stackexchange.com瞭解更多信息,例如http://gamedev.stackexchange.com/questions/13765/stencil-buffer-mask-calculation和http://gamedev.stackexchange.com/questions/3770/what-is-the-purpose-of-the-stencil-緩衝器 - 更精確 - 什麼是模板 - 在 – Tony

+0

嗯,我玩過,並得到了模板緩衝區的工作,我只是好奇......我如何檢索這個數據..因爲我想使這個遊戲多人遊戲,我該如何告訴客戶......該地區已被銷燬? – Fouf

3

OK,這是一個高層次的概述,我假設你已經熟悉了OpenGL的基礎知識,例如已經緩衝區對象。如果某件事情沒有意義,或者您想了解更多詳情,請告訴我。


表示在計算機圖形的地形最常見的方法是一個灰階高度:被在X規則地間隔開的點的網格和Y軸,但其Z(高度)可以不同。一個高度場每個(X,Y)網格點只能有一個Z值,所以你不能在地形上出現「懸垂」,但無論如何它通常是足夠的。

一個簡單的方法來繪製灰階高度地形是具有三角形帶(或四邊形,但他們建議使用)。爲了簡單起見,從一個角開始,沿着Zig-zag順序向下發佈頂點,然後返回頂部並執行下一列,依此類推。爲了獲得更好的性能,可以進行優化,也可以使用更復雜的方法來構建幾何圖形以獲得更好的外觀,但這會讓您開始。

(我在這裏假設一個長方形的地形,因爲這是它是如何共同完成的。如果你真的想要一個圓,可以替代和X和Y讓您擁有一個極座標網格)

爲座標像往常一樣,每個頂點將需要存儲在緩衝區對象中。當您調用glBufferData()將頂點數據加載到GPU中時,指定的使用情況參數GL_STREAM_DRAW(如果地形通常會從一幀變爲下一幀)或GL_DYNAMIC_DRAW(如果它將經常變化但不變化(接近)每幀。要更改地形,請再次調用glBufferData()將不同的頂點數據集複製到GPU。

對於頂點數據本身,你可以指定每個頂點的所有三個座標(X,Y和Z);這是最簡單的事情。或者,如果您使用的是足夠新GL版本,你想成爲複雜的,你應該能夠計算出X和Y使用gl_VertexID頂點着色器和座標網格的尺寸(傳遞給着色器的統一值)。這樣,您只需將Z值存儲在緩衝區中,這意味着更少的GPU內存和帶寬消耗。

+0

其實我想能夠像蠕蟲一樣進行隧穿。對不起,不清楚,+1。 – Fouf

+0

也是的,我打算用更簡單的2D,我相信你發佈的是3D,但我不是100%確定的。 :o – Fouf

+0

問題更新後,此答案雖然通常很好,但不再回答問題。那麼,它甚至沒有。 –