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


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.