2013-02-12 115 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纹理查找的情况下考虑另一种解决方案。