2012-08-01 3 views
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); 
} 

:

sin generated by fragment shader

참고로 표시된 라인 (!). float 값에 1.0을 곱하면 아무것도 변경되지 않아야합니다. 나는 행의 주석을 해제하고이 수신 (. 윈도우 OS에서 실행되는 동일한 쉐이더는 예상대로 정확하게 작동) 그래서 :

wtf?!

무슨 일을?!


재현하는 방법 :

  1. 은 엑스 코드에서 표준 템플릿에서 아이폰 OS 게임 프로젝트를 만듭니다. 프로젝트를 실행하면 두 개의 부동 큐브가 표시됩니다. 하나는 빨간색이고 다른 하나는 파란색입니다.
  2. 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; 
    } 
    
  3. 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); 
    } 
    
  4. 실행하는 장치에 프로그램과 파란색 큐브에 멋진 바 참조 : Cool bars

  5. 의 주석을 다시 실행에 의해 (!) 표시 라인 (a = a * 1.0;)과 : Uh?

+0

iOS의 그래픽 하드웨어에서 반올림 오류가 발생 했습니까? – deanWombourne

+0

마치 보입니다. 나는 또한 이것을 iPad에서 테스트했으며, 정상적으로 작동합니다. 다른 아이폰 장치에서도 테스트 해 볼 것입니다. –

+0

iPhone 4에도 문제가 있습니다. –

답변

0

글쎄, 나 자신의 질문에 대답하자. 쉐이더에서 사용되는 lowp 정밀도 한정자에 문제가 있습니다. mediump 셰이더로 변경 한 후 예상대로 작동하기 시작했습니다.