2013-05-07 49 views
3

我正在寫一個2D,基於精靈的遊戲,我很難做出碰撞檢測。首先,我非常瞭解其他方法,實際上我使用Box2D的四叉樹查詢來濾除不重疊的精靈。因此像素完美檢測只能用於發現重疊的精靈,並且每幀只能使用幾次。精靈旋轉但不縮放。2D像素完美的碰撞檢測與opengl

問題是我需要用像素來完成它,因爲精靈會隨着時間的推移而變化,並且正在使用例如Box2D的近似位圖的幾何形狀會變得非常複雜。

我做了一些研究,發現這些方法在OpenGL是可能的,以便檢查是否具有非零的α信道重疊的任何像素:

1)渲染精靈到紋理/與例如緩衝50%阿爾法和適當的混合功能,將結果複製到RAM並檢查是否有任何像素具有更大的α, 80%。

這種方法很簡單,但我檢查複製回來是非常緩慢的。

2)使用OpenGL的遮擋查詢。

從我發現的網絡遮擋查詢可能會很棘手(有時你需要等到下一幀才能得到結果)和一些圖形卡上的錯誤。由於遊戲的設計如何運作,這樣的查詢不會立即產生結果是一個交易斷路器。

3)着色器和原子計數器。

我不確定它是否可以工作,但似乎在渲染第二個精靈時會使用片段着色器,每次覆蓋某個東西時會增加一個原子計數器,然後檢查CPU端的計數器值可能是一個辦法。唯一的問題是原子計數器非常新,而2,3年前的機器可能不支持它們。

有什麼我錯過了嗎?或者我應該忘記使用GPU併爲CPU上的碰撞檢測編寫自己的渲染器?

+0

您可以使用原子計數器,並使用更簡單的近似方法作爲舊硬件的後備。例如。用一個或多個光盤近似精靈的形狀,如果可能的話預先計算。我不知道這對你的精靈是否有意義。儘管如此,多個實現將很難保持。 – 2013-05-08 21:23:45

回答

0

原子計數器是在GPU上執行此操作的適當方式。既然你要檢查許多像素,那麼你也可以同時做這個。這裏的重大性能問題是異步讀回來的,但這取決於你如何製作引擎。

使用OpenGL 4.2,您可以使用原子計數器。檢查你的顯卡是否支持這個功能,這很有可能,你應該檢查一下。