표면이 다른 표면과 정확히 겹치는 원인은 무엇입니까?


10

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

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

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

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

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

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

답변:


11

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

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

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


내가 간단한 렌더러를 만들고 있다고 말하는 것이 맞습니다. 요점은 3D 라이브러리를 사용하지 않는다는 것입니다. 모든 투영 계산을 직접 수행 한 다음 2D 도면 라이브러리를 사용하여 선을 그립니다. 이것은 가장 빠르지 않으며 픽셀 단위로 아무것도하지 않습니다. 각 표면에 4 점이 있고 직사각형 모양을 색상으로 채 웁니다. 한 번에 완전한 곡면을 그리는 중이므로 다시 앞뒤로 그려야한다고 말하는 것이 맞습니까?
pimvdb

재미 있고 배울 수있는 좋은 방법 인 것 같습니다. 깊이 버퍼를 사용하지 않고이 작업을 수행하는 경우 맨 뒤로 이동하는 것이 유일한 방법입니다. 다각형의 모든 화면 좌표를 계산 한 다음 겹치는 부분을 확인해야한다고 생각합니다. 깊이가 겹치는 경우 렌더링 할 다각형을 잘라 내야 실제로 정렬을 올바르게 해결할 수 있습니다. 반드시 보이지 않아야하는 다각형을 제거하는 방법으로 Back Culling을 살펴볼 수도 있습니다.
Roger Perkins

로저 퍼킨스가 옳다. 다각형을 자르지 않으면 올바른 z 정렬 방식을 얻을 수 없습니다. 그래도 다소 느려질 수 있습니다.
bummzack

나는 그것을 작동시켰다! 내가 한 것은 뒷면 컬링과 정렬의 조합이었습니다. 단단한 큐브에서는 일부 얼굴은 보이지 않지만 다른 얼굴은 (최대 3)입니다. 그래서 보이지 않는 부분을 먼저 그리고 그 위에 보이는 부분을 그렸습니다. 이것은 매력처럼 작동합니다. 하나 이상의면을 제거하면 겹치지 만 올바른 순서로 그려집니다. 감사!
pimvdb

1
큐브와 같은 단순한 볼록한 모양에만 작동합니다. 현재 귀하에게 도움이되어 기쁘지만 일반적인 해결책은 아닙니다.
Richard Fabian

3

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


고마워하지만 z 버퍼링은 내가 착각하지 않으면 픽셀 당 렌더링이 필요합니다. 나는 그렇게하지 않습니다-큐브의 투영 된 지점 사이에 직선을 그립니다. Z- 버퍼링이 여전히 가능합니까?
pimvdb

직선을 그리더라도 이미지가 화면 (또는 비트 맵 파일)에 도달하기 전 어느 시점에서 이미지는 픽셀 형식입니다.
바트 반 Heukelom

맞습니다.하지만 그림 라이브러리는 20fps로 픽셀 렌더링을하기에는 너무 느립니다. 그래도 고마워.
pimvdb

2

평균 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- 값의 최소 / 최대 범위를 정렬하는 것입니다. 두면의 범위가 겹치지 않으면 어느면이 앞에 있는지 알 수 있습니다. 그들이 경우, 때로는 얼굴을 분할해야합니다. 폐색이나 다른 기술을 위해 모든 정점을 광선 추적하는 것으로 충분할 때가 있습니다.


이 다이어그램은 스크린 샷에서 내가 추측하고있는 것에 대한 오버 헤드보기입니다.
jhocking 2016 년

1

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

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

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


답변 주셔서 감사합니다. 나는 뒷면 컬링에 대해 읽었지만 요점은 한쪽을 제거 할 수 있기를 원한다는 것입니다. 단단한 큐브를 사용하면 이것이 잘 작동 할 수 있지만 한쪽을 제거하면 점유가 발생하므로 여전히 정렬해야합니다. 어쨌든, 나는 원점에서 표면의 중간 점을 통해 광선을 발사한다는 아이디어를 생각해 냈습니다. 그 광선이 나중에 다른 표면과 교차하면 첫 번째 표면이 두 번째 표면과 겹칩니다. 그 아이디어가 올바른지 말해 주실 수 있습니까? 감사!
pimvdb

귀하의 아이디어는 귀하의 사례에 효과적이지만, 효과가 없을 다른 사례가 많이 있습니다. 예를 들어, 같은 장면이 있지만 잘못된 렌더링 쿼드의 중심이 겹치지 않도록 카메라를 기울인 상태에서 프리미티브를 작은 조각으로 테셀레이션해야한다고 생각합니다.
Richard Fabian
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.