0

두 개의 삼각형을 결합하여 선분을 그립니다. 삼각형의 각 꼭지점은 다양한 변수 (vec3 vBC)로 고유 한 좌표 집합을 가져옵니다. 그런 다음 프래그먼트 셰이더에서이 변수에 대해 얻은 값은 보간 된 값이며 삼각형 내부의 조각 위치를 나타냅니다. 이 값을 사용하여 조각이 삼각형의 가장자리에서 얼마나 멀리 떨어져 있는지를 결정합니다. 그러면 삼각형의 가장자리에서 앤티 앨리어싱을 수행하는 데 사용됩니다. 나는이 같은 가장자리 BC와 DE에 앤티 앨리어싱을 적용하고 있지 않다 때문이다 사각형 1의 가장자리의 계단이 내부 가장자리 있습니다 enter image description hereOpenGL에서 중심 좌표를 사용하는 앤티 앨리어싱 된 라인

주의 사항 :

은 아래 이미지의 문제를 참조하십시오. 길이 x가 매우 작기 때문에 꼭짓점 C 및 D에 가까운 가장자리 BC 및 DE의 들쭉날쭉 한 가장자리가 표시됩니다. 이 들쭉날쭉 한 가장자리는 길이 x보다 길이가 더 깁니다. 이 두 가장자리 (BC 및 DE)에 앤티 앨리어싱을 적용하면 Rect 2가 표시됩니다. 앤티 앨리어싱 중 스무딩 프로세스는 알파 값 0.0을 가장자리에 있거나 매우 가까운 가장자리에 배치하기 때문에 발생합니다. 따라서 안티 앨리어싱 된 BC와 DE는 내부에 흰색 대각선을 도입합니다.

제 질문은 어떻게 제가 Rect 1을 부드럽게 할 수 있을까요?

단편 쉐이더 :

셰이더 코드
varying vec4 DestinationColor; 
varying vec2 TexCoordOut; 
varying vec3 vBC; 
uniform sampler2D Texture; 
uniform int TexEnabled; 
float edgeFactor(); 

void main() { 
    if (TexEnabled == 1) { 
    gl_FragColor = texture2D(Texture, TexCoordOut) * DestinationColor; 
    } else{ 
    gl_FragColor = vec4(DestinationColor.xyz, edgeFactor()); 
    } 
} 

float edgeFactor() { 
    vec3 d = fwidth(vBC); 
    vec3 a3 = smoothstep(vec3(0.0), d*1.5, vBC); 
    return a3.y; 
}; 

, a3.y 번째 값을 말한다 (정점 D 또는 C 및 조각 사이의 거리)의 좌표, 즉 (Y)의 세트는 D 1 (0 나타낸다 1,0)이고 첫 번째 0과 두 번째 0은 각각 x와 z를 나타냅니다.

+0

"* Rect 1의 들쭉날쭉 한 모서리에 주목하십시오."아니요. 두 구석에 약간의 얼룩이있는 검은 색 사각형이 보입니다. –

+0

OpenGL에서 가져온 원본 출력이 아닙니다. 나는 방금 들쭉날쭉 한 가장자리의 위치를 ​​보여 주려고했습니다. 그 "얼룩"은 실제로 선 BC와 DE의 날카로운 모서리입니다. BC와 DE – asad

+0

"* OpenGL에서 얻은 원본 출력이 아닙니다. *"그래서 사람들이 실제로 거기에없는 것을 눈치 채기를 어떻게 기대합니까? 당신은 당신이 제공 한 이미지에 표시되지 않는 들쭉날쭉 한 가장자리에 대해 묻고 있습니다. –

답변

0

알고리즘은 대부분 소리가 들지만 간단한 가장자리로는 할 수없는 내부 가장자리와 외부 가장자리를 구별하는 방법이 필요합니다. 내부 에지에 기여하는 정점이 외부 에지와 다르게 보이도록 일부 고유 한 속성을 가질 수 있도록 정점을 복제해야합니다. 즉, 그것은 비싼 소리 ...

선의 너비를 따라 반복되는 선 너비에 걸쳐 적용되는 가장자리쪽으로 투명한 알파 값을 갖는 작은 텍스처를 만드는 것이 더 간단 할 수도 있습니다. 특히 지오메트리 처리가 지연된 모바일에서 모든 추가 정점 데이터보다 빠를 수 있습니다.

관련 문제