2013-09-24 72 views
0

我有一些想法,但我不確定,因爲我在webgl中沒有大師。用頂點着色器在webgl中製作相機嗎?

在WebGL中,沒有攝像頭。如果想要模擬它,那麼他必須用很多對象進行操作...準確地說,他必須將位置改變爲數十萬個頂點。我沒有深入學習Three.js或Babylon js,所以我不知道他們如何使用相機。

由於頂點着色器可以轉換頂點位置,並且因爲我們可以將頂點着色器camera matrix傳遞給頂點着色器,所以它會讓它進行計算,所以GPU會做硬件而不是CPU嗎?

+0

http://games.greggman.com/game/webgl-3d-cameras/ – gman

回答

0

你的意思是:創建使用類似的位置和方向,而不是從應用程序創建,並在着色器發送所產生的基質中的一些數據頂點着色器視圖矩陣?

實際上最後一種情況是THREE.js和其他很多解決方案的情況: 表示攝像頭的對象可以通過JavaScript進行操作。然後在繪製時,視圖矩陣由一些位置和方向參數構建,併發送到活動着色器程序。

創建一個視圖矩陣中的一些步驟來完成:

  • 創建單位矩陣(無轉換);
  • 將矩陣與每個轉換相結合應用於相機:平移和旋轉;
  • 反轉矩陣(這個計算可能很重)。

決定矩陣應該在哪裏(或什麼時候)被計算取決於視圖矩陣在只繪製一個圖像的過程中沒有改變的想法。事實上,視圖矩陣和投影矩陣意味着在兩個圖像之間進行修改。

不要忘記,頂點着色器會爲發送到管道的每個頂點執行一次。 如果您在頂點着色器中計算視圖矩陣,則每個圖像將重新計算一千次。

因此,視圖矩陣的計算應該更好地保留在應用程序中併發送給着色器程序。

如果你想從浮點運算中的着色器的性能中受益,你可以考慮使用計算着色器(遺憾的是不存在於WebGL中),或者考慮一些從着色器程序讀回數據的機制來計算矩陣一次,並在下一次平局呼叫時發送。

+0

「從應用程序創建它並在着色器中發送結果矩陣」這就是我的意思。 –

+0

這意味着許多3D圖形庫就是這種情況。 –