뷰포트 및 클리핑 (Direct3D 9)

개념적으로 viewport는 3D 장면을 프로젝션 하는 2 차원 (2D) 사각형입니다. Direct3D에서 사각형은 시스템에서 렌더링 대상으로 사용 하는 Direct3D surface 내 좌표로 존재 합니다. 투영 변환은 꼭 짓 점을 뷰포트에 사용 되는 좌표계로 변환 합니다. 뷰포트는 장면이 렌더링 될 렌더링 대상 표면의 깊이 값 범위 (일반적으로 0.0 ~ 1.0)를 지정 하는 데에도 사용 됩니다.

보기의 하 한

시야를 확인 하는 것은 뷰포트의 카메라를 기준으로 하는 장면의 3D 볼륨입니다. 볼륨의 모양은 카메라 공간에서 화면으로 모델을 투영 하는 방법에 영향을 줍니다. 가장 일반적인 형식의 투영 인 관점 프로젝션은 카메라 근처의 개체가 거리 내에서 개체 보다 크게 표시 되는 것을 담당 합니다. 큐브 뷰 보기의 경우 다음 그림에 표시 된 것 처럼 보기와 같이 카메라를 팁에 배치 하 여 시야를 피라미드형으로 시각화할 수 있습니다. 이 피라미드는 front 및 back 클리핑 평면과 교차 합니다. 앞과 뒤로 클리핑 평면 사이의 피라미드 내에서의 볼륨은 보기 두 번째입니다. 개체는이 볼륨에 있는 경우에만 표시 됩니다.

front 및 back 클리핑 계획을 사용한 보기 frustrum의 그림

진한 방에 집중 하 고 정사각형 창을 살펴보면 시야를 보는 것을 볼 수 있습니다. 이 비유에서 주변 클리핑 평면은 창이 며, 뒤로 클리핑 평면은 모든 거리에서 skyscraper, 거리의 산 또는 아무 것도 표시 되지 않습니다. 창에서 시작 하 여 보기를 방해 하는 것으로 끝나는 잘린 피라미드 안의 모든 항목을 볼 수 있으며, 다른 항목은 볼 수 없습니다.

다음 다이어그램에 표시 된 것 처럼 시야 (시야)와 z 좌표에 지정 된 front 및 back 클리핑 평면의 거리에 의해 정의 됩니다.

시야를 볼 때의 다이어그램

이 다이어그램에서 D 변수는 카메라에서 기 하 도형 파이프라인의 마지막 부분에 정의 된 공간의 원점 까지의 거리입니다 (보기 변환). 이는 보기의 한도를 정렬 하는 데 사용할 수 있는 공간입니다. 이 D 변수를 사용 하 여 프로젝션 행렬을 작성 하는 방법에 대 한 자세한 내용은 프로젝션 변환 (Direct3D 9) 을 참조 하세요.

뷰포트 사각형

D3DVIEWPORT9 구조체를 사용 하 여 c + +에서 뷰포트 사각형을 정의 합니다. D3DVIEWPORT9 구조체는 IDirect3DDevice9 인터페이스에 의해 노출 되는 다음 뷰포트 조작 메서드와 함께 사용 됩니다.

D3DVIEWPORT9 구조체에는 장면이 렌더링 되는 렌더링 대상 표면의 영역을 정의 하는 X, Y, Width, Height의 네 멤버가 포함 되어 있습니다. 이러한 값은 다음 다이어그램에 표시 된 것 처럼 대상 사각형 또는 뷰포트 사각형에 해당 합니다.

뷰포트 사각형의 다이어그램

X, Y, Width, Height 멤버에 대해 지정 하는 값은 렌더링 대상 표면의 왼쪽 위 모퉁이에 상대적인 화면 좌표입니다. 구조는 장면이 렌더링 되는 깊이 범위를 나타내는 두 개의 추가 멤버 (MinZ 및 MaxZ)를 정의 합니다.

Direct3D에서는 뷰포트 클리핑 볼륨의 범위가-1.0에서 1.0, X에서 1.0 ~-1.0 인 것으로 가정 합니다. 이러한 설정은 과거 응용 프로그램에서 가장 자주 사용 되는 설정입니다. 프로젝션 변형을사용 하 여 클리핑 하기 전에 뷰포트 가로 세로 비율을 조정할 수 있습니다.

참고

MinZ 및 MaxZ는 장면이 렌더링 되 고 클리핑에 사용 되지 않는 깊이 범위를 표시 합니다. 대부분의 응용 프로그램은 이러한 멤버를 0.0 및 1.0으로 설정 하 여 시스템에서 깊이 버퍼의 전체 깊이 값 범위에 렌더링할 수 있게 합니다. 경우에 따라 다른 깊이 범위를 사용 하 여 특수 효과를 달성할 수 있습니다. 예를 들어 게임에서 헤드 표시를 렌더링 하려면 두 값을 모두 0.0로 설정 하 여 시스템이 포그라운드에서 장면의 개체를 렌더링 하도록 하거나, 항상 백그라운드에 있어야 하는 개체를 1.0로 설정 합니다.

뷰포트에 대 한 D3DVIEWPORT9 구조의 X, Y, Width, Height 멤버에 사용 되는 차원은 렌더링 대상 화면에서 뷰포트의 위치 및 크기를 정의 합니다. 이러한 값은 표면의 왼쪽 위 모퉁이를 기준으로 화면 좌표에 있습니다.

Direct3D는 뷰포트 위치 및 차원을 사용 하 여 렌더링 된 장면에 맞게 꼭 짓 점의 크기를 대상 표면의 적절 한 위치에 맞게 조정 합니다. 내부적으로 Direct3D는 이러한 값을 각 꼭 짓 점에 적용 되는 다음 행렬에 삽입 합니다.

각 꼭 짓 점에 적용 되는 행렬의 수식

이 매트릭스는 뷰포트 크기 및 원하는 깊이 범위에 따라 꼭 짓 점의 크기를 조정 하 고 렌더링 대상 표면의 적절 한 위치로 변환 합니다. 또한 매트릭스는 y 좌표를 대칭 이동 하 여 왼쪽 위 모퉁이에 y가 하향 화면 원점이 반영 되도록 합니다. 이 행렬을 적용 한 후에는 꼭 짓 점 (즉, [ x, y, z, w ] 꼭 짓 점)으로 존재 하며, 래스터 라이저에 전송 하기 전에 유형이 다른 좌표로 변환 해야 합니다.

참고

뷰포트 크기 조정 행렬은 D3DVIEWPORT9 구조의 minz 및 maxz 멤버를 통합 하 여 깊이 범위 [ Minz, maxz에 맞게 꼭 짓 점을 조정 합니다 ] . 이러한 멤버는 클리핑에 사용 된 이전 버전의 DirectX와 다른 의미 체계를 나타냅니다.

참고

응용 프로그램은 일반적으로 MinZ와 MaxZ를 각각 0.0 및 1.0으로 설정 하 여 시스템에서 전체 깊이 범위를 렌더링 하도록 합니다. 그러나 다른 값을 사용 하 여 특정 영향을 달성할 수 있습니다. 예를 들어 모든 개체를 포그라운드로 강제로 적용 하도록 두 값을 모두 0.0로 설정 하거나 모든 개체를 배경으로 렌더링 하려면 1.0로 설정 합니다.

뷰포트 지우기

뷰포트를 지우면 렌더링 대상 화면에서 뷰포트 사각형의 내용이 다시 설정 됩니다. 깊이 및 스텐실 버퍼 화면에서 사각형을 지울 수도 있습니다.

뷰포트를 지우려면 IDirect3DDevice9:: Clear 를 사용 합니다. 메서드는 지워지는 표면의 영역을 정의 하는 하나 이상의 사각형을 허용 합니다. Count 매개 변수를 1로 설정 하면 pRects 매개 변수는 전체 뷰포트 영역을 포함 하는 단일 사각형의 주소로 전체 뷰포트가 지워집니다. 전체 뷰포트를 지우는 또 다른 방법은 pRects 매개 변수를 NULL 로 설정 하 고 Count 매개 변수를 0으로 설정 하는 것입니다.

IDirect3DDevice9:: Clear 는 깊이 버퍼 내에서 스텐실 비트를 지우는 데 사용할 수 있습니다. Flags 매개 변수를 설정 하 여 IDirect3DDevice9:: Clear 가 렌더링 대상과 관련 된 깊이 또는 스텐실 버퍼와 함께 작동 하는 방식을 결정 합니다. D3DCLEAR _ TARGET 플래그는 색 인수에 제공한 임의의 RGBA 색 (재질 색이 아님)을 사용 하 여 뷰포트를 지웁니다. D3DCLEAR _ ZBUFFER 플래그는 Z: 0.0가 가장 가까운 거리이 고 1.0이 가장 먼 거리에 있는 임의의 깊이에 대해 깊이 버퍼를 지웁니다. D3DCLEAR _ 스텐실 플래그는 스텐실 비트를 스텐실 인수에 제공 하는 값으로 다시 설정 합니다. 0에서 2n-1 범위의 정수를 사용할 수 있습니다. 여기서 n은 스텐실 버퍼 비트 깊이입니다.

렌더링 대상 및 깊이 버퍼 표면의 작은 부분만 렌더링 하는 경우도 있습니다. Clear 메서드를 사용 하면 단일 호출에서 표면의 여러 영역을 지울 수도 있습니다. 이렇게 하려면 Count 매개 변수를 지워지는 사각형의 수로 설정 하 고 pRects 매개 변수의 사각형 배열에서 첫 번째 사각형의 주소를 지정 합니다.

클리핑에 대 한 뷰포트 설정

프로젝션 행렬의 결과는 다음과 같이 프로젝션 공간의 클리핑 볼륨을 결정 합니다.

-wc<= xc<= wc

-wc<= yc<= wc

0 <= zc<= wc

여기서: x, y, z 및 w는 프로젝션 변환이 적용 된 후 꼭 짓 점 좌표를 나타냅니다. 이러한 범위를 벗어난 x, y 또는 z 구성 요소가 있는 꼭 짓 점은 클리핑 (기본 동작)이 설정 된 경우 잘립니다.

꼭 짓 점 버퍼를 제외 하 고 응용 프로그램은 D3DRS _ 클리핑 렌더링 상태를 사용 하 여 클리핑을 사용 하거나 사용 하지 않도록 설정 합니다. 꼭 짓 점 버퍼에 대 한 클리핑 정보는 처리 중에 생성 됩니다. 자세한 내용은 고정 함수 꼭 짓 점 처리 (direct3d 9)프로그래밍 가능 꼭 짓 점 처리 (direct3d 9)를 참조 하세요.

Direct3D는 IDirect3DDevice9::P rocessvertices에서 가져온 경우를 제외 하 고 꼭 짓 점 버퍼에서 기본 형식의 변환 된 꼭 짓 점을 클리핑 하지 않습니다. 사용자 고유의 변환을 수행 하 고 Direct3D를 수행 하는 데 Direct3D가 필요한 경우 꼭 짓 점 버퍼를 사용 하면 안 됩니다. 이 경우 응용 프로그램은 데이터를 순회 하 여 변환 합니다. Direct3D는 데이터를 두 번째로 트래버스하 고 드라이버는 데이터를 렌더링 하므로 비효율적입니다. 따라서 응용 프로그램이 데이터를 변환 하는 경우도 데이터를 클리핑 해야 합니다.

장치에서 잘라내야 하는 미리 변환 된 꼭지점과 lit 버텍스 (T&L 꼭 짓 점)를 수신 하면 클리핑 작업을 수행 하기 위해 꼭 짓 점 간 (RHW) 및 뷰포트 정보를 사용 하 여 꼭지점이 클리핑 공간으로 다시 변환 됩니다. 그러면 클리핑이 수행 됩니다. 모든 장치에서 T&L 꼭지점을 클리핑 하기 위해이 백 변환을 수행할 수 있는 것은 아닙니다.

D3DPMISCCAPS _ CLIPTLVERTS device 기능은 장치가 T&L 꼭지점을 클리핑 할 수 있는지 여부를 나타냅니다. 이 기능을 설정 하지 않으면 응용 프로그램은 렌더링할 장치에 보내려는 T&L 꼭 짓 점을 클리핑 해야 합니다. 장치는 소프트웨어 꼭 짓 점 처리 모드에서 장치를 만들었는지 아니면 소프트웨어 꼭 짓 점 처리 모드로 전환 했는지 여부에 관계 없이 항상 소프트웨어 꼭 짓 점 처리 모드에서 T&L 꼭지점을 클리핑 할 수 있습니다.

렌더링 장치에 대 한 뷰포트 매개 변수를 구성 하는 유일한 요구 사항은 뷰포트의 클리핑 볼륨을 설정 하는 것입니다. 이렇게 하려면 클리핑 볼륨과 렌더링 대상 표면의 클리핑 값을 초기화 하 고 설정 합니다. 일반적으로 뷰포트는 렌더링 대상 표면의 전체 영역으로 렌더링 하도록 설정 되지만 반드시 필요한 것은 아닙니다.

D3DVIEWPORT9 구조체의 멤버에 대해 다음 설정을 사용 하 여 c + +에서이를 달성할 수 있습니다.

D3DVIEWPORT9 viewData = { 0, 0, width, height, 0.0f, 1.0f };

D3DVIEWPORT9 구조체에서 값을 설정한 후 해당 IDirect3DDevice9:: setviewport 메서드를 호출 하 여 장치에 뷰포트 매개 변수를 적용 합니다. 다음 코드 예제에서는이 호출의 모양을 보여 줍니다.

HRESULT hr;

hr = pd3dDevice->SetViewport(&viewData);
if(FAILED(hr))
    return hr;

호출에 성공 하면 뷰포트 매개 변수가 설정 되 고 다음에 렌더링 메서드가 호출 될 때 적용 됩니다. 뷰포트 매개 변수를 변경 하려면 D3DVIEWPORT9 구조체의 값을 업데이트 하 고 IDirect3DDevice9:: setviewport 를 다시 호출 하면 됩니다.

참고

D3DVIEWPORT9 구조체 Members minz 및 maxz는 장면이 렌더링 되 고 클리핑에 사용 되지 않는 깊이 범위를 표시 합니다. 대부분의 응용 프로그램은 이러한 멤버를 0.0 및 1.0으로 설정 하 여 시스템에서 깊이 버퍼의 전체 깊이 값 범위에 렌더링할 수 있게 합니다. 경우에 따라 다른 깊이 범위를 사용하여 특수 효과를 얻을 수 있습니다. 예를 들어 게임에서 헤드업 디스플레이를 렌더링하려면 두 값을 모두 0.0으로 설정하여 시스템에서 포그라운드 장면의 개체를 렌더링하도록 하거나, 항상 배경에 있어야 하는 개체를 렌더링하도록 둘 다 1.0으로 설정할 수 있습니다.

시작