これは、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);
}
それは素晴らしい罪を生み出します:
(!!!) でマークされた行に注意してください。float 値に 1.0 を掛けても何も変わらないはずだと思います。(Windows OS で実行されている同じシェーダーは、期待どおりに動作します。) そこで、行のコメントを外すと、次のようになります。
なんてこと?!
再現方法:
- xcode の標準テンプレートから iOS ゲーム プロジェクトを作成します。プロジェクトを実行すると、2 つのフローティング キューブが表示されます。赤と青が1つずつ。
Shader.vsh の内容を次のように変更します。(私は 1 つの可変パラメーター 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;
(!!!) でマークされ た行 ( ) のコメントを外して、再度実行します。