作者md9830415 (DavidHsu)
看板GameDesign
標題[程式] 分離軸碰撞檢測的筆記與一些綜合問題
時間Tue Apr 27 09:46:45 2021
這篇是之前寫的筆記教學文章"遊戲中的碰撞檢測",最近網站掛掉重新更新部落格到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://webptt.com/m.aspx?n=bbs/GameDesign/M.1619488009.A.D13.html
1F:推 Unity: 1. 建議直接用 OpenGL 或是 DX, GPU 比 CPU 快上很多, 除非 04/27 09:56
2F:→ Unity: 你想土炮, 這樣的話你可以考慮用 OpenCL 或是 Cuda, 總之 04/27 09:57
3F:→ Unity: 要用 GPU 做, 純用 CPU 本來就沒辦法做到很快 (平行化問題) 04/27 09:57
4F:推 Unity: 2. 看起來你目前的攝影機是用 Orthographic, 這樣你應該比 04/27 10:10
5F:→ Unity: 較遇不到投影造成的變形 04/27 10:10
原來OpenCL跟Cuda是這樣用,了解了,感謝
6F:推 hodsala: 以學習了解為目的來個自幹軟體渲染器合理 但以順暢運行 04/27 10:49
7F:→ hodsala: 為目的的話 捨棄為了順暢運行而發展幾十年的硬體加速方 04/27 10:51
8F:→ hodsala: 案就比較怪了 04/27 10:51
9F:推 hodsala: 因為你的軟體方案也是 現在已經標準化成硬體的流程呀 04/27 11:03
10F:推 hodsala: 1-一 說得通,也可以這樣做, 但就很怪除非驗証所學或很 04/27 11:31
11F:→ hodsala: 特殊的目的 不然不會這樣做吧 shader是為了讓你取代硬 04/27 11:33
12F:→ hodsala: 體繪圖流程, 但你不是硬體呀 沒有固定繪圖流程需要被 04/27 11:35
13F:→ hodsala: 可程式化啊 因為你本來就可程式化 04/27 11:35
14F:噓 hodsala: 1-二 用openGL或DX就是和顯示卡溝通的方法呀 但照你的 04/27 11:40
15F:→ hodsala: 邏輯 你可能可以寫個不轉換的vertex shader和直出的pixel 04/27 11:41
16F:→ hodsala: shader 然後把這些都提前到你的軟體裡弄 就..只是可以 04/27 11:42
17F:推 hodsala: 也許你想寫模擬NVIDIA工程師的steam遊戲 這一切就合理了 04/27 11:45
18F:→ hodsala: 純按到噓 沒有什麼意思 04/27 11:46
原本單純覺得渲染效率太差,如果實作了比較進階的貼圖方式,或讀大模型時會跑不動
有點像是希望加速一點點讓比較大的模型讀進來能動這樣,不然讀大模型畫面都卡住
對的,原本想像中自製軟體渲染,就有點像你說的模擬NV工程師,但後面覺得現在實力沒辦法駕馭這麼大的項目
看完留言後感覺我的想法有點矛盾,可能我還是先專心學好圖學原理實作各種功能
先不要在意FPS,等真的需要效率的時候再直接轉OpenGL
感謝
19F:推 Bencrie: 1/z 非線性那個就 perspective division 吧 04/27 16:48
20F:推 Bencrie: 1. 其實你用 cl/cuda 畫完還是要用 CPU 貼到視窗上 04/27 16:54
21F:→ Bencrie: 至少 Windows 要啦。Linux 也許靠 eglimage + dmabuf 04/27 16:54
23F:→ oopFoo: perspective texture。 04/27 16:56
24F:→ Bencrie: 不然就是畫完用 GL/D3D 貼輸出 04/27 16:56
26F:→ oopFoo: 不過你知道cpu渲染跟gpu渲染的速度差異嗎?萬倍以上 04/27 17:00
27F:→ oopFoo: 除非你要raytracer這種比較適合cpu的渲染。 04/27 17:01
30F:→ oopFoo: NavMesh,參考看看。如果你要3d,現在考慮轉SAT到GJK。 04/27 17:04
31F:→ oopFoo: gjk其實沒那麼難。 04/27 17:05
了解了,這些資料對我非常有幫助,感謝
※ 編輯: md9830415 (114.41.131.43 臺灣), 04/29/2021 09:26:25
32F:推 newhandfun: 推,高手雲集 05/03 20:34