2016-04-14 143 views
1

我想從Android的OpenGL ES 2.0中將對象類的點光源數組傳遞給頂點着色器。如何在OpenGL ES 2.0中將浮點數組傳遞給Shader?

點光源存儲爲float[]陣列,着色器理想情況下將浮點數讀取爲vec4[]陣列。

通過調用glUniform4fv(...floatArray, 0)可以將float []傳遞給頂點着色器,並在頂點着色器中聲明爲uniform vec4 u_PointLights[990],但這非常緩慢。

我試圖讓花車進入GPU內存;首先想到的是VBO,但綁定數據並將其傳遞給着色器後,我只能讀取一個vec4而不是數組(即不能聲明attribute vec4[] a_PointLights)。

將第二個vec4[]加入着色器的最佳方法是什麼?

感謝,

理查德

+1

它的什麼部分非常慢,轉移到着色器統一或只是實際渲染?如果循環和if語句很複雜(在着色器中分支是SLOW),那麼在着色器中可能會有一些放緩 如果統一緩衝區對象可能更適合傳輸大型數組,那麼我認爲它不應該是發送陣列到制服太慢。 – WearyWanderer

+0

我不認爲ES 2上可以使用統一的緩衝區對象,不幸的是,雖然它們是用ES 3到達的。但是第二個關於着色器本身的查詢:您如何處理數據?在着色器中理想地避免條件和隨機訪問;攻擊一個像傳統的命令式程序通常不會帶來好的結果。 – Tommy

+0

另外,你多久打一次'glUniform4fv'?每幀一次? – Tommy

回答

1

在OpenGL ES 2.0的,你不能做任何事情真的 - 無論是客戶端制服或屬性,這兩者都將是比較有限的。

在OpenGL ES 3.0中,您可以使用Uniform Buffer Object,但請注意,非常大的制服陣列總是會相對昂貴,尤其是在移動設備上。

+0

謝謝Isogen。如果本地緩衝區在2.0中不可用,那麼通過紋理映射傳遞值的性能如何與通過glUniform4fv使用float [] uniforms進行比較? –

+0

並非所有的OpenGL ES 2.0 GPU都支持頂點着色器紋理化 - 這在規範中並不需要 - 儘管它在ES 3.0中是強制性的。 性能明智,應該可以,如果可以的話,但你必須將數據打包成彩色格式並重新組裝(值得注意的是,ES 3.0具有原生紋理貼圖,但ES 2.0不具備)。 – solidpixel