Opengl es 有没有办法优化此glsl?

Opengl es 有没有办法优化此glsl?,opengl-es,glsl,webgl,Opengl Es,Glsl,Webgl,有纹理数组(uSamplerArr)、纹理坐标偏移(texBiasArr)、不透明度(alfaArr)和透明颜色数组(tcolorr) 结果是低帧率 如何优化此着色器 顶点着色器 attribute vec3 aVertexPosition; attribute vec2 aTextureCoord; uniform mat4 uPMVMatrix; varying vec2 vTextureCoord; void main(void) { gl_Position = uPMVMat

有纹理数组(uSamplerArr)、纹理坐标偏移(texBiasArr)、不透明度(alfaArr)和透明颜色数组(tcolorr)

结果是低帧率

如何优化此着色器

顶点着色器

attribute vec3 aVertexPosition;
attribute vec2 aTextureCoord;

uniform mat4 uPMVMatrix;

varying vec2 vTextureCoord;

void main(void) {

  gl_Position = uPMVMatrix * vec4(aVertexPosition, 1.0);
  vTextureCoord = aTextureCoord;
}
片段着色器

precision mediump float;
precision lowp int;

const int MAX_TEX = 8;
const float COLOR_DIFF_EPS = 0.4;

varying vec2 vTextureCoord;

uniform int numTex;
uniform sampler2D uSamplerArr[MAX_TEX];
uniform float alfaArr[MAX_TEX];
uniform vec3 tcolorArr[MAX_TEX];
uniform vec3 texBiasArr[MAX_TEX];

void main(void) 
{
  vec4 res = texture2D(uSamplerArr[0], texBiasArr[0].z * (vTextureCoord + vec2(texBiasArr[0].x,     texBiasArr[0].y)));

  if(numTex > 1)
  {
    vec4 ti;
    for( int i = 1; i < MAX_TEX; i++ ) 
    {
      if( i < numTex ) 
      {
        ti = texture2D(uSamplerArr[i], texBiasArr[i].z * (vTextureCoord + texBiasArr[i].xy));

        if( length( ti.rgb - tcolorArr[i] ) > COLOR_DIFF_EPS ) 
        {
          res = mix(res, ti, alfaArr[i]);
        }
      }
      else
      {
        break;
      }
    }
  }
  gl_FragColor = res;
}
precision mediump float;
精度低;
常数int MAX_TEX=8;
常量浮点颜色_DIFF_EPS=0.4;
可变向量2 vTextureCoord;
统一整数;
均匀取样器2D USAMPLERAR[MAX_TEX];
均匀浮动alfaar[MAX_TEX];
均匀vec3色差[MAX_TEX];
均匀vec3 texbiasar[MAX_TEX];
真空总管(真空)
{
vec4 res=texture2D(uSamplerArr[0],texBiasArr[0].z*(vtexturecord+vec2(texBiasArr[0].x,texBiasArr[0].y));
如果(numTex>1)
{
vec4-ti;
对于(int i=1;iCOLOR\u DIFF\u EPS)
{
res=混合物(res,ti,alfaArr[i]);
}
}
其他的
{
打破
}
}
}
gl_FragColor=分辨率;
}

我会先对着色器的各个部分进行注释,直到您确定是什么部分导致了速度减慢…将
vec2(texBiasArr[0].x,texBiasArr[0].y)
更改为
texBiasArr[0].xy
并将for循环更改为
for(int I=1;某些硬件(尤其是移动设备)上可能存在与iDependent纹理读取相关的问题)。尝试将纹理坐标计算提升到顶点着色器中。