표면이 다른 표면과 정확히 겹치는 원인은 무엇입니까? 만드는 3D 엔진에서 내

한 표면이 다른 표면과 겹치는 원인을 실제로 알 수는 없습니다. 내가 만드는 3D 엔진에서 내 기술은 가장자리가 실패합니다.

내 방법은 페인트 할 표면을 가장 먼 곳에서 가장 가까운 곳으로 정렬하는 것입니다. 친밀감을 결정하기 위해 평균 z 값을 비교하고 있습니다. 그러나 때로는 겹치는 표면이 겹치는 표면 보다 평균 z 값이 더 높습니다 . 따라서 더 멀리 떨어진 표면이 더 가까운 표면에 페인트되어 다음과 같이 기괴한 렌더링이 발생합니다.

측면에 빨간색 섹션이있는 큰 자주색 사각형

보아야 할 것은 입방체의 자주색 앞면 뿐이며, 빨간색면은 자주색면 위에 칠해져 있습니다. 자주색 표면의 평균 z 값이 더 높으므로 ‘더 멀어집니다’. 따라서이 기술이 올바른지 의심 스럽습니다.

내가 시도한 것은 카메라 (예 : 원점)에서 표면까지의 거리를 얻는 것입니다. 그러나 포인트가 필요했습니다. 각 표면의 중간을 선택했지만 모든 표면이 서로 큰 것은 아니기 때문에 항상 작동하지는 않습니다.

따라서 원점을 향한 표면의 근접 순서를 결정하는 신뢰할 수있는 방법은 무엇입니까?



답변

Painters Algorithm 을 구현하려는 것 같습니다 . 대부분의 최신 3D 하드웨어는 Bart가 언급 한 것 (Z / Depth 버퍼)을 사용하기 때문에 학습 연습으로 처음부터 래스터 라이저를 작성하려고하는 것 같습니다. 모든 경우에 화가 알고리즘이 작동하려면 가능한 시나리오 (위키 백과 페이지에 표시된 겹치는 다각형 문제 등)를 해결하기 위해 렌더링 될 때 표면을 세분화 할 준비가되어 있어야합니다.

가장 먼 곳에서 가장 가까운 곳으로 렌더링하면 나중에 다른 다각형에 의해 가려 질 수있는 픽셀을 렌더링하는 데 시간을 소비하게됩니다. 이는 다각형에 텍스처와 복잡한 쉐이더를 놓기 시작할 때 소중한 사이클을 낭비합니다. 이것이 현대 하드웨어가 깊이 버퍼를 사용하여 렌더링 할 픽셀이 화면의 픽셀보다 멀리 있는지 (따라서 버릴 수 있는지) 확인하기 위해 앞에서 뒤로 렌더링하는 것을 선호하는 이유입니다.

대부분의 최신 가속 하드웨어를 사용하더라도 반투명 다각형을 정렬하고 앞뒤로 렌더링해야 모든 불투명 다각형이 렌더링 된 후에 만 ​​렌더링 할 수 있습니다.


답변

당신이 가진 것은 가시성 문제 입니다. 한 가지 해결책은 z- 버퍼를 사용하는 것 입니다.


답변

평균 z- 값은 정점 또는 표면 픽셀의 실제 z- 값에 대한 정보를 제공하지 않기 때문에 평균 z- 값에 따라면을 정렬하는 것은 효과가 없습니다.

예 (경고, ASCII 기술) :

          /
         /
cam     /
-->    /
      /
     /--       <--B
    /
    ^--A

두면 A와 B가 있습니다. 카메라의 관점에서 A는 B 앞에 있습니다. 그러나 B의 평균 z- 값은 더 작습니다. 다른 z- 값을 보자 :

  • A의 최소 z- 값은 4입니다.
  • A의 최대 z- 값은 11입니다.
  • 따라서 A의 평균 z- 값은 7.5입니다.
  • B의 최소 z- 값은 6입니다.
  • B의 최대 z- 값은 8입니다.
  • 따라서 B의 평균 z- 값은 7입니다

최소 z 값으로 정렬하려고 시도해도 작동하지 않는 경우가 있습니다. z 값 하나만 사용하여 임의의면을 올바르게 정렬하는 방법은 없습니다.

Newell의 알고리즘 http://en.wikipedia.org/wiki/Newell ‘s_algorithm에서 수행하는 작업은 z- 값의 최소 / 최대 범위를 정렬하는 것입니다. 두면의 범위가 겹치지 않으면 어느면이 앞에 있는지 알 수 있습니다. 그들이 경우, 때로는 얼굴을 분할해야합니다. 폐색이나 다른 기술을 위해 모든 정점을 광선 추적하는 것으로 충분할 때가 있습니다.


답변

수행하여 렌더링에 대해 배우는 것이 좋습니다. 명성. 이 경우 정렬을 통해 문제를 해결하는 대신 “페인터 알고리즘”솔루션이 없습니다. PS1에서는 다각형이 서로 옆에있을 때 같은 크기로 다각형을 유지하려고했습니다. 내가 말할 수있는 한), 뒷면 컬 (당신이하지 않는)

이면 컬링 은 화면 공간의 표면 법선이 방향인지 확인합니다 (화면 공간에서 깊이 요소의 부호를 법선으로 변환했습니다 (이 경우 법선의 z였습니다) 또는 삼각형 즉 십자형 (v1-v0, v2-v0))

뒷면 컬링을 구현하면 수행중인 래스터 화의 양도 줄어 듭니다. 이중 승리.


답변