我確定這不僅僅有一個答案,但是,遊戲引擎是否真的改變了內存中的向量,或者使用gltransformations?因爲一直推送和彈出矩陣似乎效率低下,但如果您不斷修改頂點,則無法使用顯示列表。所以我想知道它是如何完成的。謝謝遊戲如何在對象周圍移動(一般來說)
回答
取決於你的目標/對象。
通過設置矩陣來移動永不改變的對象(可以使用glRotatef/glTranslatef等來實現)。這肯定比通過頂點轉換對象頂點更快。對象存儲在DisplayList,VertexArray或VBO中。您可以每次使用glVertex *命令發送整個對象,但如果對象永遠不會更改,則不需要這樣做。
使用多個矩陣來轉換字符(蒙皮/綁定),通常由頂點着色器處理。如果你願意,你可以在CPU上完成,但除非你有一個非常先進的索具/蒙皮引擎,否則就沒有必要這樣做。
無法在顯示卡上完全執行的計算在CPU上執行。通常它是粒子系統,布料和程序幾何體,有時是陰影(使用模板陰影進行陰影體積計算)。像這樣的對象通常存儲在內存中,至少部分存儲在CPU中並執行轉換。這完全取決於硬件。根據顯卡和OpenGL版本的不同,可以在視頻卡上執行部分或全部這些任務(不涉及CPU),但並非總是如此。例如,通常不可能在GPU上爲程序幾何構建陰影體積(即拓撲結構會改變每個幀以及頂點位置)。但是,有一些技巧可以避免它,而且未來的版本可能會改變情況。
取決於遊戲引擎,有很多方法可以做到這一點。
但可能是最常用的方法是在遊戲引擎和圖形卡之間的責任劃分是類似以下內容:
遊戲引擎跟蹤的位置,方向,速度等。通過在事件循環中修改適當的向量和矩陣,可以在遊戲中的所有對象。遊戲邏輯,物理學,碰撞檢測等應用於這種遊戲對象的記憶模型。
當一個對象需要被渲染時,OpenGL調用被用來設置適當的渲染狀態和變換矩陣 - 儘管經常進行優化以儘量減少狀態變化的次數,但這可以基於每個對象。
OpenGL調用然後用glDrawElements繪製必要的網格(假設您正在使用頂點緩衝對象)。這意味着單個網格頂點所需的所有變換都由圖形硬件執行。由於可以通過單個OpenGL調用高效地繪製數百個單獨的基元,因此這對於性能非常重要。
在棧上寫一個16位數的矩陣是一項簡單的操作,當然比修改不同頂點的負載快很多。考慮典型3D模型中頂點的數量,你會明白爲什麼。
- 1. 來回移動遊戲對象
- 2. 移動遊戲對象
- 3. 如何在選定的遊戲對象周圍創建一個圓圈?
- 4. 蛇(遊戲)般的移動矩形
- 5. 簡介:一些遊戲對象移動,一些不移動
- 6. 統一 - 在2D遊戲中拖動遊戲對象的移動觸摸控制
- 7. 移動實例化的遊戲對象
- 8. 將父對象移動到另一個遊戲對象
- 9. 如何使對象移動 - 如何使用VB.NET遊戲
- 10. 移動速度超過父級遊戲對象的兒童遊戲對象
- 11. 如何在移動的遊戲對象與其他遊戲對象碰撞時立即停止?
- 12. 如何移動JLabes周圍
- 13. 拖動遊戲對象
- 14. UIKit遊戲:遊戲對象移動動畫中的中間回調
- 15. 如何用跳躍運動統一抓取和移動遊戲對象
- 16. 如何在遊戲轉移時重新啓動遊戲
- 17. 如何在2D遊戲中移動NSImageView?
- 18. Unity - 如何將一個遊戲對象的動畫應用到另一個裝配好的遊戲對象?
- 19. SpriteKit遊戲:移動遊戲查看
- 20. C#與Unity 3D:當用戶移動鼠標時如何使對象在對象周圍移動
- 21. 國際象棋遊戲無效移動
- 22. 如何禁用遊戲來爲每個對象計算多個遊戲?
- 23. 在Unity中快速移動遊戲對象的碰撞檢測
- 24. 遊戲杆輸入僅對角線移動對象
- 25. 如何讓光標在塊關鍵字周圍來回移動?
- 26. 尋找一個遊戲對象與另一個遊戲對象的角度
- 27. 如何回收遊戲對象的統一滾動列表?
- 28. Java遊戲 - 在一條直線上移動對象到另一個點
- 29. 遊戲對象[]在Unity
- 30. 在JPanel周圍移動JLabel
p.s.儘管存在很多差異,但可以根據整體方法替代維也納國際組織的展示名單,或者將兩者結合起來 – mikera 2010-06-08 23:35:35