2012-12-27 1 views
1

enter image description herefwidth() 테그 라 3 GLSL

이 테그 라 3 장치에 몇 쿼드 렌더링이 프로그램의 결과입니다 : 내가 사용하고

#extension GL_OES_standard_derivatives : enable 
precision mediump float; 


uniform sampler2D sampler2d;                    
varying vec2 textureCoord;   

void main() 
{                       

    vec4 texColor = texture2D(sampler2d,textureCoord); 
    gl_FragColor = vec4(fwidth(texColor.a),0.0,0.0,1.0); 
} 

텍스처 빈, 투명 PNG,하지만 더있다 내가이 질감에 넣은 것이 그 와이어 프레임이 항상 보입니다.

Mali-400 장치의 동일한 코드가 정상적으로 작동합니다. 누구나 Tegra fwidth 구현이 적절하다고 말할 수 있습니까? 아니면 내 코드에 문제가 있습니까? 위의 코드는 쉐이더의 오류 부분 만 보여주는 예입니다.

+0

서로 다른 장치는 서로 다른 방식으로 파생물을 만들 수 있으므로 GPU에서 GPU로 동일하게 보이지 않도록하십시오. 'GLHFRAGMENT_SHADER_DERIVATIVE_HINT'로'glHint'를 시도해 보셨습니까? 또한 해당 텍스처의 샘플링 매개 변수는 무엇입니까? 이것은 쿼드 내부의 선을 설명하지는 않지만'GL_CLAMP_TO_BORDER'를 사용하면 경계 색으로 보간됩니다. 'GL_CLAMP_TO_EDGE'는 그것을 고쳐야합니다. – dupersuper

+0

es 2.0 – ZZZ

+0

에서 사용할 수있는 밉맵 힌트 만 있습니다. GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES이 (가) 있지만 문제의 원인이 아닙니다. – ZZZ

답변

1

저는 Tegra 3 장치에서만 앤티 앨리어싱이 적용된 후 글꼴에 삼각형 와이어 프레임 아티팩트가 표시되어 매우 비슷한 문제가있었습니다. 필자는 fwidth() 함수에서 반환 된 결과로 문제를 좁혔습니다. 불행히도 문제의 근원을 찾을 수 없었습니다. 삼각형 모서리에서 파생 함수가 잘못되어있을 것으로 예상됩니다.

그러나 해결 방법을 찾았습니다. fwidth에 의해 반환 된 너비가 .2보다 클 때 아티팩트가 표시되는지 확인하기 위해 색상 변경을 사용했습니다. 그런 다음 .2보다 큰 값을 무시하고보다 합리적인 하드 코드 된 fwidth 값으로 바꿨습니다. 0.025로 충분했기 때문에 사용 사례에 적합한 값을 찾으려면 약간의 연습을해야 할 수도 있습니다. 필요할 때 내 쉐이더 코드에서 분기하는 경우

을 방지하기 위해, 나는 fwidth 값을 대체하는 혼합 단계의 조합을 사용 :

mediump float dist = texture2D(Texture, TexCoordOut).a; 
mediump float width = fwidth(dist); 
width = mix(width, 0.025, step(0.2, width)); // if (width > 0.2) width = 0.025 

동안 멀리 이상적에서 대신 원시 fwidth 때의 폭을 사용하여 매끄러운 앤티 앨리어싱을 적용하면 아티팩트가없는 텍스트를 표시 할 수있었습니다.