[程式] 分離軸碰撞檢測的筆記與一些綜合問題

看板GameDesign (遊戲設計)作者 (DavidHsu)時間3年前 (2021/04/27 09:46), 3年前編輯推噓8(9121)
留言31則, 4人參與, 3年前最新討論串1/1
這篇是之前寫的筆記教學文章"遊戲中的碰撞檢測",最近網站掛掉重新更新部落格到hugo 文章連結: https://davidhsu666.com/archives/gamecollisiondetection 運行效果: https://i.imgur.com/xojIN67.gif
線上執行範例: https://davidhsu666.com/downloads/Collision-MTV/versions/polygon-MTV-ver1.0-full/ --------- 有了能用的碰撞處理後,嘗試從零開始做了一個簡易的2D遊戲框架 主頁面: https://davidhsu666.com/archives/2dgame-nonename/ 運行效果: https://i.imgur.com/l39cxJ3.gif
https://i.imgur.com/AtOQPUv.gif
關於裡面的物體,我是製作一個叫做Entity的本體,包含了所有需要的功能 然後讓遊戲中的物體都繼承這個Entity,不管是玩家、敵人、地圖的每塊Tile都是繼承這 個Entity 再給這些Entity加入一個"事件觸發器",功能是能指定特定的物體,並在每次更新的時候 對指定的物體執行事件內容 像是人物與地圖障礙物的碰撞(具體如網頁所寫) 當時會想做事件觸發器是為了解決上下坡不同碰撞層的問題: https://i.imgur.com/oHtvDy5.gif
在下坡處設定是碰到就讓玩家Z-index減少,上坡處則是增加,以此來處理2D地圖中多層 地圖的碰撞問題 也想說如果未來加入NPC,也許能在NPC腳下放一個觸發器,就可以做到當玩家靠近時自動 跟玩家對話之類的效果 這部份想問: 我目前的做法會有什麼問題、該怎麼做會更好之類的,或是其他遊戲引擎大概是怎麼處理 這些功能的這樣 如果想繼續擴充的話,有什麼建議,或是推薦的參考資源 --------- 之前發文詢問大學自學方向的時候受到很多幫助,也了解了很多圖學的學習方向 目前專題想嘗試從零開始做軟體渲染器,然後看能不能結合上面的遊戲框架 用C++來做一個非常簡易的創世神這樣,都從零開始是想說學到的比較完整 https://github.com/beadx6ggwp/RenderLearningPlan 目前遇到一個不曉得該不該處理的問題 運行效果: https://i.imgur.com/EhAY1GR.gif
如上圖的GIF,目前使用Win32的HBITMAP來做所有像素操作 但就算使用Release來編譯,因為只有純CPU運算,加上沒有多核多執行續的執行 渲染的幀數只有50出頭,但這只是渲染一個模型而已,感覺這樣的效能不是很好 1. 想問該往哪個方向查資料才能做到順暢運行,我目前知道的是兩種 一. 做出基本功能的Shader,然後用CPU多核心多執行續來運算每個像素 二. 想辦法讓我的軟體渲染程式可以使用顯示卡運算 但具體都有點不曉得該怎麼做,還是就直接放棄自幹軟體渲染器,改用OpenGL 2. 投影轉換,Z-buffer中1/z的非線性問題,只知道會扭曲貼圖圖案,但具體解決的方法 看了很多篇都不太理解 --- 不好意思有些問題思考的沒有清楚,想抱持僥倖的方式透過分享文章來順便問問題 謝謝大家 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.165.98.179 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/GameDesign/M.1619488009.A.D13.html

04/27 09:56, 3年前 , 1F
1. 建議直接用 OpenGL 或是 DX, GPU 比 CPU 快上很多, 除非
04/27 09:56, 1F

04/27 09:57, 3年前 , 2F
你想土炮, 這樣的話你可以考慮用 OpenCL 或是 Cuda, 總之
04/27 09:57, 2F

04/27 09:57, 3年前 , 3F
要用 GPU 做, 純用 CPU 本來就沒辦法做到很快 (平行化問題)
04/27 09:57, 3F

04/27 10:10, 3年前 , 4F
2. 看起來你目前的攝影機是用 Orthographic, 這樣你應該比
04/27 10:10, 4F

04/27 10:10, 3年前 , 5F
較遇不到投影造成的變形
04/27 10:10, 5F
原來OpenCL跟Cuda是這樣用,了解了,感謝

04/27 10:49, 3年前 , 6F
以學習了解為目的來個自幹軟體渲染器合理 但以順暢運行
04/27 10:49, 6F

04/27 10:51, 3年前 , 7F
為目的的話 捨棄為了順暢運行而發展幾十年的硬體加速方
04/27 10:51, 7F

04/27 10:51, 3年前 , 8F
案就比較怪了
04/27 10:51, 8F

04/27 11:03, 3年前 , 9F
因為你的軟體方案也是 現在已經標準化成硬體的流程呀
04/27 11:03, 9F

04/27 11:31, 3年前 , 10F
1-一 說得通,也可以這樣做, 但就很怪除非驗証所學或很
04/27 11:31, 10F

04/27 11:33, 3年前 , 11F
特殊的目的 不然不會這樣做吧 shader是為了讓你取代硬
04/27 11:33, 11F

04/27 11:35, 3年前 , 12F
體繪圖流程, 但你不是硬體呀 沒有固定繪圖流程需要被
04/27 11:35, 12F

04/27 11:35, 3年前 , 13F
可程式化啊 因為你本來就可程式化
04/27 11:35, 13F

04/27 11:40, 3年前 , 14F
1-二 用openGL或DX就是和顯示卡溝通的方法呀 但照你的
04/27 11:40, 14F

04/27 11:41, 3年前 , 15F
邏輯 你可能可以寫個不轉換的vertex shader和直出的pixel
04/27 11:41, 15F

04/27 11:42, 3年前 , 16F
shader 然後把這些都提前到你的軟體裡弄 就..只是可以
04/27 11:42, 16F

04/27 11:45, 3年前 , 17F
也許你想寫模擬NVIDIA工程師的steam遊戲 這一切就合理了
04/27 11:45, 17F

04/27 11:46, 3年前 , 18F
純按到噓 沒有什麼意思
04/27 11:46, 18F
原本單純覺得渲染效率太差,如果實作了比較進階的貼圖方式,或讀大模型時會跑不動 有點像是希望加速一點點讓比較大的模型讀進來能動這樣,不然讀大模型畫面都卡住 對的,原本想像中自製軟體渲染,就有點像你說的模擬NV工程師,但後面覺得現在實力沒辦法駕馭這麼大的項目 看完留言後感覺我的想法有點矛盾,可能我還是先專心學好圖學原理實作各種功能 先不要在意FPS,等真的需要效率的時候再直接轉OpenGL 感謝

04/27 16:48, 3年前 , 19F
1/z 非線性那個就 perspective division 吧
04/27 16:48, 19F

04/27 16:54, 3年前 , 20F
1. 其實你用 cl/cuda 畫完還是要用 CPU 貼到視窗上
04/27 16:54, 20F

04/27 16:54, 3年前 , 21F
至少 Windows 要啦。Linux 也許靠 eglimage + dmabuf
04/27 16:54, 21F

04/27 16:55, 3年前 , 22F

04/27 16:56, 3年前 , 23F
perspective texture。
04/27 16:56, 23F

04/27 16:56, 3年前 , 24F
不然就是畫完用 GL/D3D 貼輸出
04/27 16:56, 24F

04/27 16:59, 3年前 , 25F
04/27 16:59, 25F

04/27 17:00, 3年前 , 26F
不過你知道cpu渲染跟gpu渲染的速度差異嗎?萬倍以上
04/27 17:00, 26F

04/27 17:01, 3年前 , 27F
除非你要raytracer這種比較適合cpu的渲染。
04/27 17:01, 27F

04/27 17:01, 3年前 , 28F
https://www.embree.org/, 高性能raytracing kernel
04/27 17:01, 28F

04/27 17:02, 3年前 , 29F
https://ispc.github.io/ 不可不學,多cpu simd
04/27 17:02, 29F

04/27 17:04, 3年前 , 30F
NavMesh,參考看看。如果你要3d,現在考慮轉SAT到GJK。
04/27 17:04, 30F

04/27 17:05, 3年前 , 31F
gjk其實沒那麼難。
04/27 17:05, 31F
了解了,這些資料對我非常有幫助,感謝 ※ 編輯: md9830415 (114.41.131.43 臺灣), 04/29/2021 09:26:25
文章代碼(AID): #1WXsq9qJ (GameDesign)
文章代碼(AID): #1WXsq9qJ (GameDesign)