2013-02-12 47 views
0

以下是一個性能較差的片段着色器。刪除條件分支似乎並沒有提高性能。只有150個多邊形,我在Kindle Fire上獲得10fps,在Galaxy S3上獲得20fps。有沒有想過要優化這個的最佳方式? iPad 2上的類似着色器運行30 + fps。關於具有8個紋理單元的opengl es多紋理着色器的想法

在下面的代碼中,texture1到texture8綁定到八個紋理。 VertexTexturesOut1和VertexTexturesOut2從頂點着色器傳遞,並具有值0.0到1.0以指示要混合的着色量。我們的想法是混合景觀的質感,讓草混合均勻,放入泥土,岩石,沙子等設計片段着色時

uniform sampler2D texture1; 
uniform sampler2D texture2; 
uniform sampler2D texture3; 
uniform sampler2D texture4; 
uniform sampler2D texture5; 
uniform sampler2D texture6; 
uniform sampler2D texture7; 
uniform sampler2D texture8; 

varying mediump vec2 TextureCoordOut; 
varying lowp vec4 VertexTexturesOut1; 
varying lowp vec4 VertexTexturesOut2; 

... 

    lowp vec4 Color = vec4(0.0, 0.0, 0.0, 0.0); 

    if (VertexTexturesOut1.x != 0.0) Color = Color + texture2D (texture1, TextureCoordOut) * VertexTexturesOut1.x; 
    if (VertexTexturesOut1.y != 0.0) Color = Color + texture2D (texture2, TextureCoordOut) * VertexTexturesOut1.y; 
    if (VertexTexturesOut1.z != 0.0) Color = Color + texture2D (texture3, TextureCoordOut) * VertexTexturesOut1.z; 
    if (VertexTexturesOut1.w != 0.0) Color = Color + texture2D (texture4, TextureCoordOut) * VertexTexturesOut1.w; 

    if (VertexTexturesOut2.x != 0.0) Color = Color + texture2D (texture5, TextureCoordOut) * VertexTexturesOut2.x; 
    if (VertexTexturesOut2.y != 0.0) Color = Color + texture2D (texture6, TextureCoordOut) * VertexTexturesOut2.y; 
    if (VertexTexturesOut2.z != 0.0) Color = Color + texture2D (texture7, TextureCoordOut) * VertexTexturesOut2.z; 
    if (VertexTexturesOut2.w != 0.0) Color = Color + texture2D (texture8, TextureCoordOut) * VertexTexturesOut2.w; 

    gl_FragColor = Color;  
+0

1.有這些if語句有什麼意義?這真的比單純乘法更快嗎? 2.刺傷黑暗:也許同一個變量的多重賦值不是最優的?有一個'Color1'和'Color2'並添加這些? – 2013-02-12 18:16:12

回答

2

你着色器有很多的DONT的。您有許多條件語句,所以所有線程都需要等待warp(或批處理)中的所有其他線程。您還訪問了8個紋理,這意味着您需要等待所有紋理查找(這也會殺死內存帶寬)。使用任何優化工具,例如Adreno SDK,Mali SDK或您選擇的任何供應商,並在其優化工具中運行着色器,以發現GPU在哪裏花費更多時間。

您是否使用完整的RGB888紋理? A

也許如果您告訴我們您想要歸檔的文件,我們可以在不使用8紋理查找的情況下考慮另一種解決方案。