일치하는 표면으로 z- 파이팅 피하기


26

두 개의 겹치는 동일 평면 표면을 렌더링 할 때 일반적인 문제는 "z- 파이팅"인데, 렌더러는 두 표면 중 어느 표면이 카메라에 더 가까운지를 결정할 수 없으므로 겹치는 영역에 시각적 아티팩트가 있습니다.

이에 대한 표준 솔루션은 모델을 설계 할 때 표면을 약간 오프셋하는 것입니다. 다른 해결책이 있습니까?


2
로그 깊이 버퍼를 체크 아웃 할 수 있습니다. 가마 수트라에
Soapy

1
"평면"이라고 말하면 "거의"또는 "정확하게"동일 평면을 의미합니까? 렌더링 하드웨어는 마지막 경우에 결정 론적이어야하며 (임의의 순서로 제출하지 않는 경우) 싸워서는 안됩니다. 동일하지 않은 표면이지만 정확히 동일 평면에있는 경우 표면을 겹치거나 겹치지 않는 부분으로 분할하도록 모델을 업데이트 할 수 있습니까?
Simon F

@SimonF, "co-planar"는 "정확히 co-planar"를 의미합니다. Soapy의 솔루션은 "거의 거의 동일 평면"인 경우에만 작동합니다.
Mark

표면의 예를 들어 주시겠습니까? @SimonF가 언급 한 것처럼 머리 꼭대기에서 생각할 수있는 유일한 것은 중복 삼각형입니다.
RichieSams

@RichieSams 내가 생각할 수있는 가장 일반적인 경우는 정확히 중복 삼각형이 필요없는 데칼입니다.
rys

답변:


10

표면이 정확히 동일 평면 상에 있다면, 운명은 FPU 신에게 달려있다. 당신은 Z- 파이팅을 가지고있을 것입니다. 삼각형 인 경우 와 동일 하고 할 정확한 각각 같은 수학을, 당신은 모두에 대해 동일한 Z-값으로 끝낸다. 그러나 다시 말하지만, 수학 연산이 둘 다 동일 할 경우에만 발생합니다. (일반적으로 FPU 작업은 정식이 아닙니다)

가능한 해결책 중 하나는 Z- 버퍼를 전혀 사용하지 않는 것입니다. 오히려 Painter 's Algorithm을 사용할 수 있습니다 . 물론 이것은 화가 알고리즘의 모든 문제와 함께 제공됩니다. 그러나 Z- 파이팅을 해결할 것입니다.

SSD (Screen Space Decals)의 경우, 일반적인 해결책은 간단한 얇은 큐브 인 오프셋을 사용하는 것입니다. SSD에 대한 Warhammer 40k 프레젠테이션 을 참조하십시오. 또는 Bart Wronski의 게시물 은 데칼과 관련된 다른 문제를 해결하고 SSD에 대한 다른 프레젠테이션으로 연결됩니다.


5
동일한 변환으로 동일한 형상을 다시 렌더링하면 매번 동일한 깊이 값이 안정적으로 생성됩니다. (즉 , 그것은 이 아니며 의지입니다 ). 예를 들어 다중 패스 포워드 라이팅이 작동하는 이유입니다.
Nathan Reed

@NathanReed가 수정되었습니다. 설명을 주셔서 감사합니다
RichieSams

1
: 해당 기능을 얻으려면 당신은 불변 GLSL에서 규정 사용할 필요가 opengl.org/wiki/Type_Qualifier_%28GLSL%29#Invariance_qualifiers
ashleysmithgpu

정점 위치를 평가할 때 동일한 셰이더 표현식 (및 입력)은 동일한 결과를 얻기에 충분하지 않을 수 있습니다. 일부 최적화는 나머지 셰이더에 따라 달라질 수 있습니다. GLSL에는 "불변"키워드가있어 다른 셰이더에서 동일하게 평가해야하는 셰이더 출력을 선언합니다.
Firadeoclus

2

과거에 이것을 해결 한 방법은 다음과 같습니다.

  1. 깊이 테스트를 통해 첫 번째 객체 (다른 객체 뒤에 표시되어야하는 객체)를 그리 되 깊이 쓰기는 하지 않습니다.
  2. 깊이 테스트와 깊이 쓰기로 두 번째 객체를 그립니다. 1 단계에서 깊이를 쓰지 않았으므로 z- 파이팅이 발생하지 않습니다.
  3. 색상 버퍼가 아닌 깊이 버퍼에만 쓰면 첫 번째 객체 를 그립니다. 이렇게하면 객체 2가 아닌 객체 1로 덮힌 모든 픽셀에 대해 깊이 버퍼가 최신 상태가됩니다.

이 작업을 수행하려면 객체를 연속적으로 그려야합니다.


0

렌더러에 따라 노이즈 유사 알고리즘을 사용하여 멀티 샘플링 깊이에서 최소 오프셋을 적용하여 표면을 "퍼지"로 만들 수 있습니다. 이렇게하면 깊이가 근접한 표면에 일종의 혼합 효과가 나타납니다. 내가 아는 것을 위해 조각 쉐이더에서 샘플 당 깊이를 설정하는 것은 OpenGL에서 매우 최근에 확장 된 것입니다.

OpenGL은 PolygonOffset을 가지고 있지만, 어떤 것을 동일 평면에 렌더링 할 것인지 미리 알고 있어야합니다. 단일 모델 내의 표면에는 적합하지 않지만, 예를 들어 토지에 겹쳐서 도로를 렌더링 할 때 유용하게 작동 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.