2013-03-13 4 views
1

필자는 며칠 동안 셰이더를 사용하여 그림자 그림자와 내부 그림자를 추가하는 간단한 가장자리 감지 셰이더를 작성했습니다. 그것은 내 은하 s2와 아이폰 4에 잘 작동하지만 은하계 탭과 ipad2 가장자리의 양쪽에 매우 얇고 거친 찾고 그림자를 생산하고 있습니다. 필자는 왜 시간을 보냈지 만 기쁨이 없었으므로 도와주세요! 시뮬레이터에서 ipad2 해상도를 시뮬레이트하면 효과가 정확합니다.셰이더가 태블릿에서 잘못된 결과를 생성 함

쉐이더는 모든 장치 (640x480 픽셀)에서 화면 버퍼와 동일한 크기로 작동합니다.

vertex shader: 
{ 
    attribute highp vec4 inVert; //vertex stream 
    uniform highp mat4 inPMVMat; //transform to projected space 
    attribute mediump vec2 inUV0; 
    attribute lowp vec4 inCol; 
    uniform mediump vec2 inUVOffset; 
      uniform mediump vec2 inUVScale; 
    varying mediump vec2 vTexCoord; 
    varying mediump float FragColor; 
    void main(void) 
    { 
     gl_Position = inPMVMat * inVert;//set vertex position in projected space 
     vTexCoord = inUV0*inUVScale;// + inUVOffset;//pass texture to fragment shader 
     FragColor = inCol.a; 
    } 
} 


fragment shader: 
{ 
    uniform sampler2D myTexture; 
    varying mediump vec2 vTexCoord; 
    varying mediump float FragColor; 
    lowp float MaxDistance, Distance; 
    lowp float Shift; 
    void main(void) 
    { 
     gl_FragColor = texture2D(myTexture, vTexCoord); 
     mediump vec2 PixelSize = vec2(1.0/640.0, 1.0/480.0); 
     mediump vec2 Direction = vec2(PixelSize.x*0.5,PixelSize.y*0.5); 

     if(gl_FragColor.a >= 0.5) 
     { 
      //inner shadow 
      MaxDistance = 15.0; 
     } else { 
      //drop shadow 
      MaxDistance = 12.0; 
      Direction = -Direction; 
     } 


     mediump vec2 Position = vTexCoord; 
     mediump float c; 
     for(Distance = MaxDistance; Distance > 0.0;Distance -= 1.0) 
     { 
      Position += Direction; 
      c = texture2D(myTexture,Position).a; 
      if(c < 0.5) 
      { 
       if(gl_FragColor.a >= 0.5) 
       { 
        //found transparent edge - do inner shadow 
        Shift = 1.0-((0.5/MaxDistance)*Distance); 
        gl_FragColor.r *= Shift; 
        gl_FragColor.g *= Shift; 
        gl_FragColor.b *= Shift; 
        break; 
       } 
      } else { 
       if(gl_FragColor.a < 0.5) 
       { 
        //found opaque edge - do dropshadow 
        gl_FragColor.a = ((0.8/MaxDistance)*Distance); 
        break; 
       } 
      } 
     } 
     gl_FragColor.a *= FragColor; 
    } 
} 

이미지 :

gs2

tab

답변

1

나는 결국 실험을 많이 한 후 이에 대한 해결책을 발견했다. lowp MaxDistance, Distance 및 Shift 변수가 범인이었습니다. mediump로 변경 한 후 모든 장치에서 정상적으로 작동합니다. 장치 간 정밀도에는 약간의 차이가 있다고 생각합니다.

관련 문제