원근 투영은 원근법에 대한 것으로,
원근범에 대한 기본적인 방식은 먼 거리에 있는 물체가
더 작게 보이게 2D 화면에 나타내는 방식이다.
3D 투영 (또는 그래픽 투영)은 2차원 (2D) 표면에
3차원 (3D) 객체를 표시하는 데 사용되는 디자인 기술이다.
원근법을 적용한 그림들의 공통점은 '소실점의 존재'이다.
이 소실점을 기준으로 일정 각도만큼의 직선들을 나란히 그리게 되면
실제로 소실점에 가까운 부분들은 멀어보이게 되는 시각적 효과를 가져온다.
하지만, 3D 컴퓨터 환경에서 원근법을 적용하기 위해선
실제 그림에서 적용되는 방식과는 조금 다르다.
결론은 3D Rendering 에서는 소실점 개념은 필요치 않다.
우선, 한가지 생각해볼 문제는 우리가 바라보는 위치
즉, 3D 공간을 표현하기 위한 우리의 시계에서는
'카메라가 우리의 눈'이 된다.
컴퓨터에 Rendering 되어진다는 의미는 해당 물체를 정점으로 표현하고
그 정점을 이으면서 나타나는 영역에 색을 입히게 되면서
우리 모니터에 보이게 된다.
정점을 통해 그려지는 컴퓨터는 정점의 위치만 알 수 있으면 해당 물체를 그릴 수 있다.
따라서,
소실점 개념이 필요없는 이유는 소실점을 기준으로 물체를 표현할 필요가 없기 때문이다.
3D 원근 투영을 위해서 우리는 '절두체' 공간을 만들어 원근 투영을 표현한다.
'절두체'라는 특별한 공간을 이용해야하는 이유는
3D 원근 투영에 효과적이기 때문이다.
한가지 이유로는 '삼각비'를 사용하기 때문이다.
물체에 포함된 하나의 정점이 화면 어디에 위치하는지 비율을 통해서
해당 위치를 구할 수 있는 식이 나온다.
이제 우리는 정점이 화면 어디에 위치하는지 알고 잇다.
이 때 만약 해당 위치에 두 개 이상의 정점이 들어오게 된다면
이를 구별하기 위해서 깊이 정보를 알아야한다.
절두체를 사용하는 또 한가지 이유는 이 깊이 범위를 지정하기 위함이다.
카메라와 vertex(x, y, z)의 거리와 z(depth)는 다르다.
뒤에서 깊이 버퍼에 저장된 z로부터 거리를 계산할 수 있다.
왜냐하면, 이론상 3D 공간에서의 깊이는 무한대이기 때문이다.
범위를 지정하기 위해 가까운 평면과 먼 평면을 둔다.
추가적인 이유는 나중에 나올 z 값 정규화를 위한 계산에서
거리의 시작점과 끝점을 정의해 mapping 하기 위함이다.
일정 범위의 공간에 점들을 배치시키고 해당 공간의 점들을
viewport(Screen Space)로 배치시키는 과정을 거쳐야한다.
이 때, 일정 범위의 공간에 점들을 배치시키는 작업을 '정규화'라고 한다.
이러한 정규화 작업을 통해서
Screen Space에서 이 축소된 공간을 viewport 기준점으로 위치시키고,
해상도의 크기에 비례하면서 픽셀에 매칭하게 된다.
'그래픽스 > DX11' 카테고리의 다른 글
D3D11 Rasterization - Light (0) | 2024.10.30 |
---|---|
DX11 - 쉐이딩(Blinn-Phong Shading) (0) | 2024.10.25 |
DX11 - 쉐이더 개념 + 뒷면 제거 (0) | 2024.10.21 |
D3D11 - 2차원 애니메이션 + 깊이 버퍼 (2) | 2024.10.20 |
DX11 - 2차원 변환(VertexShader작업) (1) | 2024.10.03 |