iPhone 上的 WebGL 着色器渲染绿色框
WebGL Shader rendering green box on iPhone
我写了一个片段着色器,它使用一些与这个问题不是特别相关的数学来生成分形图。
在我的 MacBook Pro 上,绘图工作正常(Chrome 和 Safari)。在我的 iPhone 上,它只显示一个亮绿色 (#00FF00) 的矩形。在 iPhone 模拟器中(在我的 MacBook Pro 上),它可以 100% 正常工作。
我怀疑我的片段着色器中有些东西与 phone 上的图形硬件不兼容。我不知道是什么。我已启用 debugging,但没有看到任何表明问题的信息。
f-shader.glsl
precision mediump float;
varying vec2 v_coord;
void color_wheel(in float hue, out vec3 rgb) {
float x;
if (0.0 <= hue && hue < 60.0) {
x = 1.0 - hue/60.0;
rgb = vec3(1.0, x, 0.0);
} else if (hue < 120.0) {
x = (hue - 60.0)/60.0;
rgb = vec3(x, 1.0, 0.0);
} else if (hue < 180.0) {
x = 1.0 - (hue - 120.0)/60.0;
rgb = vec3(0.0, 1.0, x);
} else if (hue < 240.0) {
x = (hue - 180.0)/60.0;
rgb = vec3(0.0, x, 1.0);
} else if (hue < 300.0) {
x = 1.0 - (hue - 240.0)/60.0;
rgb = vec3(x, 0.0, 1.0);
} else if (hue < 360.0) {
x = (hue - 300.0)/60.0;
rgb = vec3(1.0, 0.0, x);
} else {
rgb = vec3(0.0, 0.0, 0.0);
}
}
void color_step_ratio(in int steps, in int max_steps, out vec3 rgb) {
if (steps == max_steps) {
rgb = vec3(0.0, 0.0, 0.0);
} else {
float ratio = float(steps)/float(max_steps);
color_wheel(60.0*(1.0 - ratio), rgb);
}
}
void main() {
float w = v_coord.x;
float a = v_coord.y;
float b = 0.05;
float h = 0.001;
float h2 = h/2.0;
float t = 0.0;
const int max_steps = 60000;
vec2 k0 = vec2(0.0, 0.0);
vec2 k1, k1P, k2, k2P, k3, k3P, k4;
int steps = 0;
for (int i = 0; i < max_steps; i++) {
k1 = vec2( k0.y, -b*k0.y - k0.x + k0.x*k0.x + a*sin(w*t));
k1P = k0 + h2*k1;
k2 = vec2(k1P.y, -b*k1P.y - k1P.x + k1P.x*k1P.x + a*sin(w*(t + h2)));
k2P = k0 + h2*k2;
k3 = vec2(k2P.y, -b*k2P.y - k2P.x + k2P.x*k2P.x + a*sin(w*(t + h2)));
k3P = k0 + h*k3;
k4 = vec2(k3P.y, -b*k3P.y - k3P.x + k3P.x*k3P.x + a*sin(w*(t + h)));
t += h;
k0 += (h/6.0)*(k1 + 2.0*(k2 + k3) + k4);
steps++;
if (k0.x >= 1.0) break;
}
vec3 rgb;
color_step_ratio(steps, max_steps, rgb);
gl_FragColor = vec4(rgb, 1);
}
我不知道从这里到哪里去。有什么建议吗?
您可以查看现场演示 here and the full source code here。
我的期望:在我的笔记本电脑上绘制(MacBook Pro - Retina,13 英寸,2013 年末 - OS X 10.10.5):
实际发生了什么:在我的iPhone(iPhone 6 - iOS 9.2 - Mobile Safari)上:
这是问题所在:
const int max_steps = 60000;
...
for (int i = 0; i < max_steps; i++) { ... }
我怀疑 for
循环正被图形驱动程序 "unrolled"。当我将 max_steps
减少到 60、600 和 6000 时它工作正常。60000 太多了。
我写了一个片段着色器,它使用一些与这个问题不是特别相关的数学来生成分形图。
在我的 MacBook Pro 上,绘图工作正常(Chrome 和 Safari)。在我的 iPhone 上,它只显示一个亮绿色 (#00FF00) 的矩形。在 iPhone 模拟器中(在我的 MacBook Pro 上),它可以 100% 正常工作。
我怀疑我的片段着色器中有些东西与 phone 上的图形硬件不兼容。我不知道是什么。我已启用 debugging,但没有看到任何表明问题的信息。
f-shader.glsl
precision mediump float;
varying vec2 v_coord;
void color_wheel(in float hue, out vec3 rgb) {
float x;
if (0.0 <= hue && hue < 60.0) {
x = 1.0 - hue/60.0;
rgb = vec3(1.0, x, 0.0);
} else if (hue < 120.0) {
x = (hue - 60.0)/60.0;
rgb = vec3(x, 1.0, 0.0);
} else if (hue < 180.0) {
x = 1.0 - (hue - 120.0)/60.0;
rgb = vec3(0.0, 1.0, x);
} else if (hue < 240.0) {
x = (hue - 180.0)/60.0;
rgb = vec3(0.0, x, 1.0);
} else if (hue < 300.0) {
x = 1.0 - (hue - 240.0)/60.0;
rgb = vec3(x, 0.0, 1.0);
} else if (hue < 360.0) {
x = (hue - 300.0)/60.0;
rgb = vec3(1.0, 0.0, x);
} else {
rgb = vec3(0.0, 0.0, 0.0);
}
}
void color_step_ratio(in int steps, in int max_steps, out vec3 rgb) {
if (steps == max_steps) {
rgb = vec3(0.0, 0.0, 0.0);
} else {
float ratio = float(steps)/float(max_steps);
color_wheel(60.0*(1.0 - ratio), rgb);
}
}
void main() {
float w = v_coord.x;
float a = v_coord.y;
float b = 0.05;
float h = 0.001;
float h2 = h/2.0;
float t = 0.0;
const int max_steps = 60000;
vec2 k0 = vec2(0.0, 0.0);
vec2 k1, k1P, k2, k2P, k3, k3P, k4;
int steps = 0;
for (int i = 0; i < max_steps; i++) {
k1 = vec2( k0.y, -b*k0.y - k0.x + k0.x*k0.x + a*sin(w*t));
k1P = k0 + h2*k1;
k2 = vec2(k1P.y, -b*k1P.y - k1P.x + k1P.x*k1P.x + a*sin(w*(t + h2)));
k2P = k0 + h2*k2;
k3 = vec2(k2P.y, -b*k2P.y - k2P.x + k2P.x*k2P.x + a*sin(w*(t + h2)));
k3P = k0 + h*k3;
k4 = vec2(k3P.y, -b*k3P.y - k3P.x + k3P.x*k3P.x + a*sin(w*(t + h)));
t += h;
k0 += (h/6.0)*(k1 + 2.0*(k2 + k3) + k4);
steps++;
if (k0.x >= 1.0) break;
}
vec3 rgb;
color_step_ratio(steps, max_steps, rgb);
gl_FragColor = vec4(rgb, 1);
}
我不知道从这里到哪里去。有什么建议吗?
您可以查看现场演示 here and the full source code here。
我的期望:在我的笔记本电脑上绘制(MacBook Pro - Retina,13 英寸,2013 年末 - OS X 10.10.5):
实际发生了什么:在我的iPhone(iPhone 6 - iOS 9.2 - Mobile Safari)上:
这是问题所在:
const int max_steps = 60000;
...
for (int i = 0; i < max_steps; i++) { ... }
我怀疑 for
循环正被图形驱动程序 "unrolled"。当我将 max_steps
减少到 60、600 和 6000 时它工作正常。60000 太多了。