下面是一个表现不佳的片段着色器。删除条件分支似乎不会提高性能。只有150个多边形,我在Kindle Fire上获得10fps,在Galaxy S3上获得20fps。有关最佳优化方法的想法,如果有的话? iPad 2上的类似着色器运行30 + fps。
在下面的代码中,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 :(得分:3)
在设计片段着色器时,你的着色器有许多DONT。您有许多条件语句,因此所有线程都需要始终等待warp(或批处理)中的所有其他线程。您还访问8个纹理,这意味着您需要等待所有这些纹理查找(这也会导致内存带宽)。使用任何优化工具,例如Adreno SDK,Mali SDK或您选择的任何供应商,并在其优化工具中运行着色器,以确定GPU花费更多时间的位置。
您使用的是完整的RGB888纹理吗?甲
也许如果你告诉我们你想要存档什么,我们可以考虑另一种解决方案而不使用8种纹理查找。