2015-04-17 43 views
0

我正在創建一個體素引擎。除了一些簡單的單純噪聲集成之外,我還創建了塊生成,但由於每個四邊形的所有面都被繪製,即使是您看不到的面,也非常滯後。光線投射,以避免繪製看不見的面孔

根據我的理解,這通常是使用光線投射處理的,其中我瞭解基本理論:從相機中畫出若干光線並檢查碰撞,如果未發現碰撞,則臉部不在視線內,因此應該不被渲染。即使我理解了它的理論,但由於缺乏先驗知識以及我在互聯網上發現的缺乏知識,所以我還沒有能夠實現它,即它們給出了代碼而不是知識。

我能想象我需要採取的步驟如下:

  1. 瞭解OpenCL的(雖然我以前沒有使用過它我的理解它可以讓你通過更好地利用你的顯卡使用我在心智上與OpenGL着色器關聯的'內核')。
  2. 瞭解光線投射背後的理論和數學。我也聽說過我認爲具有不同用途的光線追蹤。
  3. 瞭解如何使用此信息不呈現隱藏的面孔。假設我得到了一個工作實現,我該如何去告訴OpenGL不要渲染隱藏的面部?立方體是一個對象,據我所知,沒有辦法在OpenGL中只操作頂點的對象的面。 OpenCL如何與OpenGL進行通信? OpenCL不是圖形api,因此它不能繪製光線。

任何人都可以指向正確的方向嗎?我也相信也有純粹的OpenGL實現,但我想保留OpenCL方面,因爲這是一種學習體驗。

+0

在此期間,我想我可以開始在GUI上工作 – SemperAmbroscus

回答

0

瞭解OpenCL的(雖然我以前沒有使用過它我的理解它 允許您通過使用 「仁」,我精神上支持OpenGL「着色」關聯更好地利用你的顯卡) 。

Amd app sdk有很多從數字排序到在茶壺上進行3D流體計算的例子/樣本。你也可以在opencl中使用cpu,但多個cpus可以被看作是單個設備。此外,Nvidia和jocl以及lwjgl都有樣品正在等待受到精心設計。

瞭解光線投射背後的理論和數學。我也聽說過光線跟蹤,我相信有一個不同的使用

我只知道光線投射成爲跟蹤,如果這些射線投新線的 。大量的矢量代數,如交叉積,點積,方向向量歸一化,3x3 4x4矩陣乘法等等。更高階的遞歸性對gpu是不利的。嘗試使用迭代版本。

瞭解如何使用此信息不呈現隱藏的面孔。

您可以排序光線相交併獲得最小距離之一的表面圖元的距離。如果在這個表面上沒有折射,別人就不應該被看到。使用加速結構(有界的bolume層次結構,..)會有所幫助。

立方體是一個對象,並給我所知,沒有辦法 操縱對象的面孔在OpenGL只有頂點。

在opencl中生成,將它傳遞給opengl,比立即模式更快。

另外OpenCL將如何與OpenGL進行通信? OpenCL不是圖形 api,所以它不能繪製光線。

使用「共享」屬性創建上下文以便能夠使用gl -cl「interop」。這使opencl-opengl通信可以達到gpu-vram(高端爲300 GB/s)。 (glFinish()compute()clFinish()drawArrays())

如果不是互操作,那麼通信將會像pci- e帶寬。然後,如果計算與數據比率較低,則從cpu生成的速度會更快。

如果有多個gpus可以玩,那麼你應該打包儘可能短的數據。檢查結構的排列順序。如果在主機端有任何東西,不要忘記定義opencl(設備)側結構,它們必須是1-1兼容的。

+0

謝謝,這讓我有很多繼續! – SemperAmbroscus

1

我不會推薦使用OpenCL或OpenGL開發你的第一款遊戲,它們都會讓你放慢速度,因爲它們都需要不同的思維方式。 雖然儘可能地做到盡善盡美。

你提到你現在正在渲染所有四邊形,你想刪除隱藏的四邊形。我也寫過一個體素引擎來練習這個問題,並且花了很多時間思考如何解決這個問題。我的解決方案是不要畫面臨另一個體素。
想象兩個彼此相鄰的體素,觸摸的兩個面不能被看到,並且不需要被渲染。

但是,如果您與GPU交談的方法是瓶頸,這並沒有什麼區別。你將不得不使用緩衝方法,我使用了顯示列表,但它也有可能(但更難)使用VBOs。

我也建議將大量的體素分組爲大塊的原因很多。然後,您只需重新計算更改的塊上可見的四邊形。

關於射線鑄造,如果您採用我剛描述的塊系統,計算可見的整個卡盤將會更容易。 E.g播放器後面的塊不需要渲染,並且可以通過每個塊的一個點積計算來計算。

+0

我已經創建了一個塊系統,但我一直在計算攝像頭的當前位置並在其周圍渲染指定數量的塊。每幀的計算速度是否比你的方法慢?另外我同意,這是我主要關心的問題之一。 – SemperAmbroscus

+0

我完全忽略了這樣的事實,即我爲每個立方體使用單個vbo ... – SemperAmbroscus

+0

我不知道您計算相機位置的含義。如果您不像我描述的那樣渲染隱藏的面,並且在每個卡盤上使用VBO或顯示列表,並且只渲染距離和角度特定的卡盤,以獲得您想要的性能。 –