2010-06-08 66 views
3

我確定這不僅僅有一個答案,但是,遊戲引擎是否真的改變了內存中的向量,或者使用gltransformations?因爲一直推送和彈出矩陣似乎效率低下,但如果您不斷修改頂點,則無法使用顯示列表。所以我想知道它是如何完成的。謝謝遊戲如何在對象周圍移動(一般來說)

回答

3

取決於你的目標/對象。

通過設置矩陣來移動永不改變的對象(可以使用glRotatef/glTranslatef等來實現)。這肯定比通過頂點轉換對象頂點更快。對象存儲在DisplayList,VertexArray或VBO中。您可以每次使用glVertex *命令發送整個對象,但如果對象永遠不會更改,則不需要這樣做。

使用多個矩陣來轉換字符(蒙皮/綁定),通常由頂點着色器處理。如果你願意,你可以在CPU上完成,但除非你有一個非常先進的索具/蒙皮引擎,否則就沒有必要這樣做。

無法在顯示卡上完全執行的計算在CPU上執行。通常它是粒子系統,布料和程序幾何體,有時是陰影(使用模板陰影進行陰影體積計算)。像這樣的對象通常存儲在內存中,至少部分存儲在CPU中並執行轉換。這完全取決於硬件。根據顯卡和OpenGL版本的不同,可以在視頻卡上執行部分或全部這些任務(不涉及CPU),但並非總是如此。例如,通常不可能在GPU上爲程序幾何構建陰影體積(即拓撲結構會改變每個幀以及頂點位置)。但是,有一些技巧可以避免它,而且未來的版本可能會改變情況。

3

取決於遊戲引擎,有很多方法可以做到這一點。

但可能是最常用的方法是在遊戲引擎和圖形卡之間的責任劃分是類似以下內容:

  • 遊戲引擎跟蹤的位置,方向,速度等。通過在事件循環中修改適當的向量和矩陣,可以在遊戲中的所有對象。遊戲邏輯,物理學,碰撞檢測等應用於這種遊戲對象的記憶模型。

  • 當一個對象需要被渲染時,OpenGL調用被用來設置適當的渲染狀態和變換矩陣 - 儘管經常進行優化以儘量減少狀態變化的次數,但這可以基於每個對象。

  • OpenGL調用然後用glDrawElements繪製必要的網格(假設您正在使用頂點緩衝對象)。這意味着單個網格頂點所需的所有變換都由圖形硬件執行。由於可以通過單個OpenGL調用高效地繪製數百個單獨的基元,因此這對於性能非常重要。

+0

p.s.儘管存在很多差異,但可以根據整體方法替代維也納國際組織的展示名單,或者將兩者結合起來 – mikera 2010-06-08 23:35:35

1

在棧上寫一個16位數的矩陣是一項簡單的操作,當然比修改不同頂點的負載快很多。考慮典型3D模型中頂點的數量,你會明白爲什麼。

相關問題