표준 뷰 볼륨의 목적은 무엇입니까?


15

나는 현재 OpenGL을 배우고 있는데이 질문에 대한 답을 찾지 못했습니다.

투영 행렬이 뷰 공간에 적용된 후, 모든 포인트가 [-1, 1] 범위 내에 있도록 뷰 공간이 "정규화"된다. 이를 일반적으로 "정규 뷰 볼륨"또는 "정규화 된 장치 좌표"라고합니다.

이런 일이 어떻게 일어나는지 알려주는 자료가 많이 있지만 그 일이 일어나는지 전혀 보지 못했습니다 .

이 단계의 목적은 무엇입니까?

답변:


7

가장 중요한 점은 3D 월드 공간에서 2D 화면 공간으로 포인트 (정점)를 변환한다는 것입니다.

즉, 정점에이 행렬을 곱한 후 X 및 Y 좌표가 화면의 위치 ([-1, 1] 사이)이고 Z가 깊이임을 의미합니다. Z는 깊이 버퍼에 사용되며 평면 근처에서 카메라의 정점 (또는 조각)이 얼마나 멀리 있는지 식별합니다.

투영은 가까운 평면에서 더 가까운 정점이 화면의 중앙에서 더 멀다는 것을 의미합니다.-> 카메라에 더 가까운 삼각형은 멀리있는 것보다 큽니다. 그리고 이것은 당신의 시야를 기반으로합니다-당신은 createProjectionMatrix 함수 또는 createFrustum에 입력합니다. 그것은 당신의 카메라 절두체와 정점을 전단하고 단위 큐브로 크기를 조정합니다. 1보다 크고 -1보다 작은 값은 표시되지 않습니다.

또한 픽셀 종횡비를 유지하므로 픽셀을 제곱 할 수 있습니다. 간단합니다. 더 넓은 스크린-> 더 많은 수직 전단 및 그 반대의 경우와 같이 카메라 절두체를 전단합니다.

간단한 대답 :
카메라 프러스 텀을 정의하며 다음과 같은 장점이 있습니다.

  • 가까이있는 물체가 멀리있는 물체보다 크게 보이게합니다.
  • 픽셀 종횡비 유지-모두 정사각형 픽셀을 좋아합니까? :)

프로젝션 매트릭스의 기능을 묻는 부분은 없습니다. 그는 정규화 된 장치 좌표가 무엇인지 궁금해하는 것 같습니다.
Chris는 Reinstate Monica가

투영 매트릭스 카메라 절두체를 정의한다. 그러나 이것은 [-1,1]을 표준 시청량으로 사용하는 이유를 설명하지 않습니다. [-100,100] 대신에 왜?
bobobobo

1
D (0 것이 일반적입니다 만, 큐브 0x0x0은 ... 매우 흥미로운되지 않습니다) : 1 (100)에 비해 "더 일반적인 수는"때문에
이반 Kuckir

5

이 답변은 사실 후에도 오래되었지만 Google에서 이것을 발견 했으므로 여전히 누군가를 도울 것입니다. JasonD와 Notabene이 말한 것을 분명히하고 싶습니다. 클리핑 계산을 수행하는 것이 훨씬 쉽습니다 (당신이보고있는 것과 멀리 떨어져있는 방식으로 볼 수있는 것과 보이지 않아야하는 것을 알아 내십시오) ). 뷰 프러스 텀의 경계에서 평면과 교차하는지 확인하는 대신 모든 것의 x, y, z를 xMax, xMin, yMax 등으로 비교하면됩니다. 큐브가 있으므로 간단합니다. 보여지는 것의 일부만 갖고 싶다면 조금 더 복잡하지만, 수학은 절두체보다 단위 큐브를 사용하는 것이 좋습니다.

다른 답변에서 오해의 소지가있는 몇 가지 사항 :

뷰 프러스 텀에서 측면을 깎지 않고 균일 한 행렬 변환을 사용하여 큐브로 변형시킵니다.

-이 단계에서는 2D 화면으로 변환하지 않습니다. 이 단계는 필요하지 않습니다. 이론적으로 우리는 절두체를 먼저 큐브로 변환하지 않고 모든 작업을 수행 할 수 있습니다. 직관적이지만 어려운 수학이지만 그래픽은 평균 게임 / 무엇이든 초당 많은 계산이 있기 때문에 계산이 정말 빠릅니다.

더 자세하게 : 이것은 반드시 우리가 변환하는 단위 큐브 일 필요는 없으며, 최대-최소 계산을 위해서는 사각형 상자 일뿐입니다. 실제로 클래스에서는 카메라가 z 축을 향하고 z는 0에서 1로, x는 -1에서 1로, y는 -1에서 1로 이동하는 상자를 사용했습니다. 일반적으로 수학 1, 0, -1은 계산을 더 쉽게하기위한 좋은 숫자입니다. 그래서 우리는 -100에서 100 또는 다른 것으로 이동하지 않습니다.

TLDR : 클리핑이 쉬워집니다.

편집 : bobobobo는 그 요점을 가지고 있습니다. 모든 것은 삼각형입니다. 일반적으로 : D.

출처 : 대학 그래픽 수업 수강


흥미롭지 만 요점은 부분적으로 사실 인 것 같습니다. 동종 행렬을 사용하지 않고 클립 공간에서 점이 동종 공간에 정의되어 있습니다. 2) 클립 공간에서 pont이 아직 화면에 투사되지 않습니다. 원근 분할 후 발생하지만 클립 공간에서 직교 공간으로 돌아갈 때 반드시 발생합니다. 3) 그렇습니다. 점 좌표를 NDC 공간으로 변환하는 것은 여전히 ​​필요합니다. 필요하지 않은 것은 GPU와 관련된 클립 공간입니다. ...
18490

... 단위 공간으로 다시 매핑하는 것이 아니라 필요하지 않은 클립 공간 단계입니다. 마지막 가정도 정확하지 않습니다. NDC 공간에서 래스터 공간 (뷰포트 변환)으로 이동하는 것이 더 쉽기 때문에 -1을 1로 다시 매핑합니다. NDC 공간이 [0,1] 범위에 있으면 실제로 구현하기가 더 쉽습니다. 결국 그것은 모든 수학이므로 다른 규칙을 사용할 수 있는지 확인하십시오. 자세한 내용은 좋은 scratchapixel 웹 사이트를 참조하십시오.
user18490


1

OpenGL이 이미지가 표시되는 방법 (화면 비율 또는 해상도, 하드웨어 세부 사항 등)에 대해 가정 할 수 없기 때문이라고 생각합니다. 운영 체제 나 드라이버 또는 모든 것이 올바른 해상도 / 크기로 조정되는 중간 형태로 렌더링 및 이미지됩니다.


하드웨어 세부 사항에 대해 염려 할 때 올바르지 않습니다. 없습니다. 또한 CPU에 rastarizator를 작성하는 경우 (왜해야합니까?이 작업 방법을 배우려면 :)) GPU와 동일한 행렬을 사용하고 있습니다. 당신은 내가 여전히 투표권을 가지지 않는 것이 운이 좋다 :)
Notabene

종횡비를 알 필요가 없습니까? 내가 이해 한 바에 따르면 이미지는 나중에 올바른 종횡비를 갖도록 X 및 Y의 배율을 저장합니다.
breadjesus

3
내가 틀렸다면 저를 정정하십시오. 그러나 그는 당신이 포인트를 투영 한 후에 이야기하고 있기 때문에 우리는 2D를 이야기하고 있습니다. 이 경우 OpenGL은이 이미지를 놓을 화면의 위치 나 이미지 표시 방법을 모릅니다. 크기를 조정하고 쉽게 배치 할 수있는 이미지를 만들지 만 그렇게하지는 않습니다. 하드웨어 세부 정보가 나쁜 이름이라는 데 동의합니다. 나는 단순히 위의 의미를 의미했습니다. 또한 종횡비로 프로젝션 매트릭스를 지정할 수 있지만 그 비율이 모니터와 같을 필요는 없습니다.
질긴 검볼

3
나는이 대화를 정말로 즐긴다 고 말해야한다. 당신은 옳은 근처에 있습니다. 더 깊이 가자. projMat로 정점을 곱한 후 이미지가 없습니다. 결과는 깊이가있는 2D 점의 설정입니다. Rastarization보다 이미지가 생성됩니다. (cpu에서 삼각형 vert 사이에 선을 그리고 그것을 채울 것입니다 (그리고 무엇이든 가리십시오 ...) gpu에서는 픽셀 / 조각 쉐이더 직전에 수행됩니다. 또한 가로 세로 비율은 "확대"되어야하는 포인트를 1보다 크거나 -1보다 작은 값으로 표시하며 표시되지 않습니다.
Notabene

2
아아! 여기에 문제가 있습니다. "이는 일반적으로"정규 뷰 볼륨 "또는"정규화 된 장치 좌표 "라고합니다." 나는 그가 표준화 된 장치 좌표에 대해 묻는 것처럼 대답하고 있었지만 실제로는 전혀 좌표에 대해 묻지 않았습니다. 그것들은 사실 완전히 다른 두 가지이기 때문에 우리가 여기에 반대하는 이유입니다. 사람들이 내가 저지른 실수를 저 지르지 않도록 분명히해야 할 것입니다.
질긴 검볼

1

답변이 이미 수락되었지만 일반적으로 뷰 절두체를 단위 큐브로 변환하는 데 클리핑에 유용합니다.


사실, 나는 이것에 대해 더 명확하게 대답을 거의 편집하지 않았습니다.
Notabene

그건 그렇고 단위 큐브는 1면 큐브입니다. 이름이 부적절합니다. 대신 표준 시청량이라고합니다.
user18490

1

나는 또한 이것을 궁금해했다. 고려해야 할 몇 가지가 있습니다.

첫째, 세계의 모든 것이 원점을 중심으로하는 그 단위 큐브 [-1,1]로 변형됩니다. 해당 단위 큐브에 무언가가 없으면 표시되지 않습니다.

이것에 대한 좋은 점은 이제 삼각형을 매우 쉽게 컬링 할 수 있다는 것입니다. (삼각형의 3 개의 꼭짓점이 모두 x > 1있거나 x < -1그 삼각형을 컬링 할 수있는 경우).


0

Scratchapixel의 투시 투영 행렬에 대한 교훈을 확인하는 것이 좋습니다.

http://www.scratchapixel.com/lessons/3d-basic-rendering/perspective-and-orthographic-projection-matrix/build-basic-perspective-projection-matrix

뷰 프러스 텀 공간을 단위 큐브로 워프하는 이유를 명확하게 설명합니다. 왜? 기본적으로 캔버스에 3D 포인트를 투영하는 프로세스는 NDC 공간을 변환하기 위해 관련되어 있기 때문에 스크린의 포인트가 [-1,1] 범위에서 리 맵핑되는 공간입니다 (화면이 정사각형이라고 가정). 이제 Z 좌표를 [0,1] (또는 때로는 [-1,1]) 범위로 다시 매핑하여 결국에는 큐브로 끝납니다. 사실 포인트가 큐브에 포함되어 있으면 뷰 프러스 텀 (이상한 공간, 잘린 피라미드)에 정의 된 것보다 처리하기가 더 쉽습니다. 또 다른 이유는 CG에서 상상할 수있는 모든 종류의 프로젝션 변환을 동일한 공간 (단위 큐브)으로 가져 오기 때문입니다. 예를 들어 원근법 또는 직교 투영법을 사용하는지 여부에 관계없이

어쩌면 그 이유에 너무 집중할 수도 있습니다. 단위 큐브는 실제로 정점을 화면에 투영 한 다음 좌표를 래스터 공간에 다시 매핑하는 데 사용되거나 사용 된 수학 과정의 결과입니다.

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