这是我在 iPhone 3g 上的 iOS 5.1.1 上运行的片段着色器程序。
#ifdef GL_ES
precision lowp float;
#endif
varying vec2 v_texCoord;
void main()
{
float offset = sin(v_texCoord.x * 10.0);
// offset = offset * 1.0; // (!!!)
gl_FragColor = vec4(offset, 0.0, 0.0, 1.0);
}
这会产生美好的罪恶:
注意标有 (!!!) 的行。我想,将浮点值乘以 1.0 不会有任何改变。(在 Windows 操作系统下运行的同一着色器完全按预期工作。)因此,我取消注释该行并收到以下信息:
怎么回事?!
如何重现:
- 从 xcode 中的标准模板创建 iOS 游戏项目。如果您运行该项目,那么您将看到两个浮动立方体。一红一蓝。
将 Shader.vsh 的内容更改为以下内容。(我刚刚添加了一个可变参数 v_pos)。
attribute vec4 position; attribute vec3 normal; varying lowp vec4 colorVarying; varying lowp vec4 v_pos; uniform mat4 modelViewProjectionMatrix; uniform mat3 normalMatrix; void main() { vec3 eyeNormal = normalize(normalMatrix * normal); vec3 lightPosition = vec3(0.0, 0.0, 1.0); vec4 diffuseColor = vec4(0.4, 0.4, 1.0, 1.0); float nDotVP = max(0.0, dot(eyeNormal, normalize(lightPosition))); colorVarying = diffuseColor * nDotVP; gl_Position = modelViewProjectionMatrix * position; v_pos = gl_Position; }
将 Shader.fsh 更改为以下内容。
varying lowp vec4 colorVarying; varying lowp vec4 v_pos; void main() { gl_FragColor = colorVarying; lowp float a = sin(v_pos.x * 10.0); // a = a * 1.0; // (!!!) gl_FragColor = vec4(a, 0.0, 0.0, 1.0); }
在设备上运行程序并查看蓝色立方体上的酷条:
取消注释由 (!!!) 标记的行 (
a = a * 1.0;
) 并再次运行: