我正在台式机和平板电脑上测试一个WebGL片段着色器,我注意到在平板电脑上(Chrome和FF),着色器看起来就像我在一个for中设置迭代次数一样循环到1.(它在桌面浏览器上运行良好。)
平板电脑的性能几乎无法使用,因此我计划最终使用着色器为低端设备预渲染静态纹理。但是,如果它不执行循环,我必须手动展开它以使其执行吗?
下面的代码,对不起,这是一项正在进行中的工作。它结合了我在glsl.heroku.com上找到的几个修改过的着色器脚本。我没有在任何桌面浏览器上看到任何错误。
我不希望任何人调试或改进我的代码,我更感兴趣的是找出浏览器是否可以短路for循环,什么会触发它以及可能有什么变通方法。
precision mediump float;
#define CLOUD_ITERS 25
#define WISP_ITERS 5
uniform float uTime;
uniform vec2 uPos;
uniform vec3 uAddColor;
uniform sampler2D uSampler; // starfield
uniform sampler2D uSampler2; // very dense starfield
varying vec2 vTexcoord;
void main()
{
//
// Nebula clouds
//
vec2 p = vTexcoord * 0.85;
p += uPos * 0.6;
float t = uTime / 400.0;
for( int i = 1; i < CLOUD_ITERS; i++ )
{
float f = float(i);
vec2 p2 = p;
p2.x += 0.6 / f * sin(f * p.y + t + 0.3 * f) + 1.0;
p2.y += 0.6 / f * cos(f * p.x + t + 0.3 * (f + 10.0)) - 1.4;
p = p2;
}
vec3 col = max( vec3(
0.11 * sin(5.0 * p.x),
0.02 * sin(5.0 * p.y),
sin(p.x + p.y) * 0.18
), 0.0);
//
// Wisps
//
float c = 1.0;
float inten = 0.05;
p.x = vTexcoord.x * 3.0 - 15.0 + uPos.x;
p.y = vTexcoord.y * 3.0 - 15.0 + uPos.y;
vec2 p2 = p;
for( int i = 0; i < WISP_ITERS; i++ )
{
t = uTime * 0.0025 * (1.0 - (3.0 / float(i+1)));
p2 = p + vec2(cos(t - p2.x) + sin(t + p2.y), sin(t - p2.y) + cos(t + p2.x));
c += 1.0 / length(vec2(p.x / (2.0*sin(p2.x+t)/inten), p.y / (cos(p2.y+t)/inten)));
}
c /= 8.0;
c = 1.3 - sqrt(pow(c, 3.0 * 30.0 * 0.025));
c = pow(c, 12.0);
vec3 col2 = clamp(vec3(c*0.05, c*0.035, c*0.07), 0.0, 1.0);
vec4 star2Col = texture2D(uSampler2, vec2(vTexcoord.s * 2.5 + uPos.x * 0.75, vTexcoord.t * 2.5 + uPos.y * 0.75));
col2 += col2 * star2Col.rgb;
//
// Starfield layers (from texture)
//
//vec4 starCol1 = texture2D(uSampler, vec2(vTexcoord.s * 2.5 + uPos.x * 1.0, vTexcoord.t * 2.5 + uPos.y * 1.0));
vec4 starCol2 = texture2D(uSampler, vec2(vTexcoord.s * 2.0 + uPos.x * 1.7, vTexcoord.t * 2.0 + uPos.y * 1.7));
vec4 starCol3 = texture2D(uSampler, vec2(vTexcoord.s * 1.25 + uPos.x * 2.5, vTexcoord.t * 1.25 + uPos.y * 2.5));
gl_FragColor = vec4(
uAddColor +
col +
col2 +
//starCol1.rgb * 0.3 +
starCol2.rgb * 0.4 +
starCol3.rgb * 0.5
, 1.0
);
}