2016-06-07 56 views
0

標題說這一切,但我的問題是,這有可能在瀏覽器(例如Google Chrome)中使用WebGL API來執行一些數學問題嗎?使用WebGL API做數學

我們假設我想用WebGL API乘以兩個數字,這通常是可能的,如果是的話,我該怎麼做?

對不起,我沒有分享任何代碼,因爲我沒有拿出任何答案。

回答

2

只是乘以2的數字不會是你想要在WebGL中做的事情。這將需要50-70設置電話,以乘以2號碼。

如果要將200萬個數乘以200萬個其他數,那麼這更適合WebGL。有很多使用GPU來做數學的例子。首先,這是一個GPU是數學的。它恰好是最常見的數學人士要求它做的是渲染3D或2D圖形。

您需要搜索的術語是GPGPU

在確定如何調整您的解決方案以適應how GPUs work有一定的藝術。

WebGL從紋理中讀取數據並將數據寫入紋理的基本點。什麼是紋理?他們真的只是二維數組值。因此,您將數據放入這些二維數組(紋理)中,使用WebGL從這些二維數組(紋理)中讀取數據並將數據寫入其他二維數組(紋理)。

最大正常計算的差異是

  1. 至少在WebGL的從紋理1點讀取的數據由值0.0在每個方向上尋址到1.0。爲了從二維數組(紋理)中獲得特定值,必須計算其歸一化座標值(紋理座標)。

    假設xy是表示2個整數索引成一個二維數組,我們可以計算一個ivec2歸一化的座標與獲得的值從2D陣列(紋理)的需要

    vec2 uv = (vec2(xy) + 0.5)/textureDimensions; 
    vec4 value = texture2D(2dArrayOfValuesTexture, uv); 
    

    在WebGL的2我們不」不得不這樣做。我們可以做

    vec4 value = textureFetch(2dArrayOfValuesTexture, xy, 0); 
    
  2. 你不必寫

    一般WebGL的隨機訪問,以便這可能會阻礙你可以做什麼寫入目標二維數組(紋理)。有時候有creative,workarounds

  3. 您無法立即訪問之前的結果。

    一般情況下,如果您計算10000個答案,在此期間的任何時候您都可以參考之前的答案。換句話說,當你計算答案3766時,你可以參考答案0到3765.

    在WebGL中,雖然你不能訪問任何以前的答案,直到你計算了所有的答案。當然,一旦你計算了所有這些,你可以將這些答案傳回另一個計算。基本上,在一次巨大的「批量計算」過程中,答案無法互相參考。

正如基里爾指出的那樣,還有一些限制。 WebGL 1.0具有浮點紋理,因此很容易獲取數據。獲取數據需要更多的工作來將答案編碼爲8位4通道紋理,讀取結果,然後將其解碼爲答案,但有很多人這樣做。 WebGL 2將刪除編碼/解碼步驟的需要。

+0

這個答案是我在Stackoverflow上接受的最好的答案。做得好。 –

1

嗯,我認爲最準確的答案是你的問題是和不。一方面,整個GPGPU(圖形處理器上的計算)都是使用着色器和一些黑客來解決一些模擬和數學問題。另一方面,整個「黑客」部分使這一點有些困難,只有真正值得小問題。特別是對那些受益於大規模並行計算的問題。

據我所知,最常見的模式是使用片段着色器來計算紋理的一些值。但是,有一些限制。首先,沒有最好的擴展,你可以從WebGL獲得RGBA8紋理,這大大限制了計算精度。但是有一個擴展提供紋理(如果我沒記錯的話,渲染緩衝區)和浮點顏色通道。而且,將結果複製到JS的成本可能很高。

即將推出的WebGL2具有更多的功能,可以在GPU上以變換反饋,幾何着色器和更多紋理和緩衝區格式進行計算。