對於一些科學數據可視化的,我使用的WebGL繪製大float數組。數據集是二維的,通常數百或數千個高度值和幾萬個寬度值。繪製的可變數量的紋理
爲了將這個數據集放入視頻內存中,我將它剪成幾個非方形紋理(取決於MAX_TEXTURE_SIZE
),並將它們相鄰顯示。我使用與單個sampler2d
相同的着色器繪製所有紋理。這意味着,我必須遍歷所有的紋理繪製:
for (var i=0; i<dataTextures.length; i++) {
gl.activeTexture(gl.TEXTURE0+i);
gl.bindTexture(gl.TEXTURE_2D, dataTextures[i]);
gl.uniform1i(samplerUniform, i);
gl.bindBuffer(gl.ARRAY_BUFFER, vertexPositionBuffers[i]);
gl.vertexAttribPointer(vertexPositionAttribute, 2, gl.FLOAT, false, 0, 0);
gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
}
然而,如果紋理的數量變大超過半打,性能變得相當糟糕。現在我知道遊戲使用了比這更多的紋理,所以這是不可預期的行爲。我也讀過你可以綁定採樣器的數組,但據我所知,紋理的總數必須提前知道。對我而言,紋理的數量取決於數據集,所以在加載數據之前我無法知道它。
而且,我懷疑我在這個渲染循環做不必要的東西。任何提示都會受到歡迎。
你如何畫通常可變數量的WebGL的紋理?
是否通過編程生成着色器代碼?這對我來說似乎相當黑。 – bastibe
是的,您可以查看three.js代碼並查看它生成着色器。典型的AAA遊戲可能會生成4000多個着色器。有時使用* uber *着色器(上面的選項#2)更容易,但執行速度比生成完全符合您需要的着色器要慢。遊戲通常會在編譯時生成它們,因爲它們知道它們在發佈時會需要哪些着色器(藝術家已完成製作所有資源)。如果你不提前知道,那麼在飛行中產生它們是正常的事情。 – gman
只要你能生成在這裏你沒有任何延遲問題,其優良的時間着色器。請記住,需要很多幀來編譯和推送GPU上的新程序/着色器。一旦它的存在,它還挺便宜的改變useProgram .. –