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);
}
:
참고로 표시된 라인 (!). float 값에 1.0을 곱하면 아무것도 변경되지 않아야합니다. 나는 행의 주석을 해제하고이 수신 (. 윈도우 OS에서 실행되는 동일한 쉐이더는 예상대로 정확하게 작동) 그래서 :
무슨 일을?!
재현하는 방법 :
- 은 엑스 코드에서 표준 템플릿에서 아이폰 OS 게임 프로젝트를 만듭니다. 프로젝트를 실행하면 두 개의 부동 큐브가 표시됩니다. 하나는 빨간색이고 다른 하나는 파란색입니다.
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
마치 보입니다. 나는 또한 이것을 iPad에서 테스트했으며, 정상적으로 작동합니다. 다른 아이폰 장치에서도 테스트 해 볼 것입니다. –
iPhone 4에도 문제가 있습니다. –