0
這是我在iPhone 3g上運行iOS 5.1.1的片段着色器程序。iOS中的基本算術GLSL片段着色器
#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操作系統中運行相同的着色器工程完全按照預期的。)所以,我去掉行和接收這樣的:
WTF?
如何重現:
- 創建一個從在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; }
Chnge 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;
),然後再次運行:
是由iOS上的圖形硬件引入的舍入錯誤? – deanWombourne 2012-08-01 11:53:27
它看起來像。 我也在iPad上測試過它,它工作正常。我也會嘗試在其他iPhone設備上進行測試。 – 2012-08-01 12:29:42
iPhone 4上也存在問題。 – 2012-08-01 13:34:01