기능 수준 9 하드웨어의 사용자 클립 평면

Windows 8부터 Microsoft HLSL(High Level Shader Language)은 Microsoft Direct3D 11 API와 함께 사용하여 기능 수준 9_x 이상에서 사용자 클립 평면을 지정할 수 있는 구문을 지원합니다. 이 클립 평면 구문을 사용하여 셰이더를 작성한 다음 해당 셰이더 개체를 Direct3D 11 API와 함께 사용하여 모든 Direct3D 기능 수준에서 실행할 수 있습니다.

배경

IDirect3DDevice9::SetClipPlaneIDirect3DDevice9::GetClipPlane 메서드를 통해 Microsoft Direct3D 9 API에서 사용자 클립 평면에 액세스할 수 있습니다. Microsoft Direct3D 10 이상에서는 SV_ClipDistance 의미 체계를 통해 사용자 클립 평면에 액세스할 수 있습니다. 그러나 Windows 8 이전에는 SV_ClipDistance를 Direct3D 10 또는 Direct3D 11 API의 기능 수준 9_x 하드웨어에 사용할 수 없었습니다. 따라서 Windows 8 이전에는 기능 수준 9_x 하드웨어로 사용자 클립 평면에 액세스하는 유일한 방법은 Direct3D 9 API를 통해서였습니다. Direct3D Windows 스토어 앱은 Direct3D 9 API를 사용할 수 없습니다. 여기서는 기능 수준 9_x 이상에서 Direct3D 11 API를 통해 사용자 클립 평면에 액세스하는 데 사용할 수 있는 구문을 설명합니다.

앱은 클립 평면을 사용하여 그려진 모든 기본 요소를 클립하는(버리는) 3D 세계 내에서 보이지 않는 평면 집합을 정의합니다. Windows는 클립 평면의 음수 면에 있는 픽셀을 그리지 않습니다. 그러면 앱에서 클립 평면을 사용하여 평면 반사를 렌더링할 수 있습니다.

Syntax

이 구문을 사용하여 클립 평면을 함수 선언에서 함수 특성으로 선언합니다. 예를 들어, 여기에서는 꼭짓점 셰이더 조각에 다음 구문을 사용합니다.

cbuffer ClipPlaneConstantBuffer 
{
       float4 clipPlane1;
       float4 clipPlane2;
};

[clipplanes(clipPlane1,clipPlane2)]
VertexShaderOutput main(VertexShaderInput input)
{
       // the rest of the vertex shader doesn't refer to the clip plane
 
       …
 
       return output;
}

꼭짓점 셰이더 조각에 대한 이 예는 두 개의 클립 평면을 나타냅니다. 꼭짓점 셰이더의 반환 값 바로 앞에 대괄호 안에 새 clipplanes 특성을 배치해야 함을 보여 줍니다. clipplanes 특성 뒤의 괄호 안에 각 활성 클립 평면에 대한 평면 계수를 정의하는 최대 6개의 float4 상수 목록을 제공합니다. 이 예는 또한 각 평면의 계수가 상수 버퍼에 상주하도록 해야 함을 보여 줍니다.

참고

클립 평면을 동적으로 사용하지 않도록 설정하는 데 사용할 수 있는 구문이 없습니다. clipplanes 특성이 없는 동일한 셰이더를 다시 컴파일하거나 평면이 더 이상 기하 도형에 영향을 주지 않도록 앱에서 상수 버퍼의 계수를 0으로 설정할 수 있습니다.

 

이 구문은 vs_4_0_level_9_1 및 vs_4_0_level_9_3을 포함하는 모든 4.0 이상의 꼭짓점 셰이더 대상에 사용할 수 있습니다.

기능 수준 9 이상에서 클립 공간에 클립 평면 만들기

여기서는 기능 수준 9_x 이상에서 클립 공간에 클립 평면을 만드는 방법을 보여 줍니다.

배경 읽기

Frank D. Luna의 DirectX 10을 사용한 3D 게임 프로그래밍 소개"에서는 필요한 그래픽 수학 배경(1, 2, 3장)과 꼭짓점 셰이더에서 발생하는 다양한 공간 및 공간 변환(5.6 및 5.8절)에 대해 설명합니다.

10Level9 기능 수준

Direct3D 10 이상에서는 일반적으로 세계 공간이나 보기 공간과 같은 의미 있는 모든 공간에서 클립할 수 있습니다. 그러나 Direct3D 9는 사전 투시 분할 프로젝션 공간인 클립 공간을 사용합니다. 꼭짓점 셰이더가 벡터를 그래픽 파이프라인을 따르는 단계로 전달할 때 벡터는 클립 공간에 있습니다.

Windows 스토어 앱을 작성할 때 앱이 기능 수준 9_x 이상의 하드웨어에서 실행될 수 있도록 10Level9 기능 수준(기능 수준 9_x)을 사용해야 합니다. 앱이 기능 수준 9_x 이상을 지원하므로 클립 공간에 클립 평면을 적용하는 공통 기능도 사용해야 합니다.

vs_4_0_level_9_1 이상으로 꼭짓점 셰이더를 컴파일할 때 해당 꼭짓점 셰이더는 clipplanes 특성을 사용할 수 있습니다. Direct3D 10 이상 개체에는 특성에 지정된 각 float4 전역 상수를 포함하는 방출된 꼭짓점의 내적이 있습니다. Direct3D 9 개체에는 10Level9 런타임이 IDirect3DDevice9::SetClipPlane에 대한 적절한 호출을 실행하도록 하는 데 충분한 메타데이터가 있습니다.

클립 평면 수학

클립 평면은 4개의 성분이 있는 벡터로 정의됩니다. 처음 세 성분은 클립하려는 공간의 원본에서 나오는 x, y, z 벡터를 정의합니다. 이 벡터는 벡터에 수직이고 원본을 통과하는 평면을 의미합니다. Windows는 평면의 벡터 쪽에 모든 픽셀을 유지하고 평면 뒤의 모든 픽셀을 자릅니다. 네 번째 w 성분은 평면을 뒤로 밀고 벡터 선을 따라 Windows가 덜 잘리게 합니다(음수 w는 Windows가 더 많이 잘림). x, y, z 성분이 단위(정규화된) 벡터를 구성하는 경우 w는 평면을 w 단위 뒤로 밀어냅니다.

GPU(그래픽 처리 장치)가 클리핑을 결정하기 위해 수행하는 수학은 꼭짓점 벡터(x, y, z, 1)와 클리핑 평면 벡터 사이의 간단한 내적입니다. 이 수학 연산은 클립 평면 벡터에 프로젝션 길이를 만듭니다. 음의 내적은 꼭짓점이 평면의 잘린 쪽에 있음을 보여 줍니다.

보기 공간에서 클리핑

보기 공간의 꼭짓점은 다음과 같습니다.

보기 공간의 꼭짓점

보기 공간의 클립 평면은 다음과 같습니다.

보기 공간의 클립 평면

보기 공간에서 꼭짓점과 클립 평면의 내적은 다음과 같습니다.

ClipDistance = v · C = vCₓ +vyCy + vzCz + Cw

이 수학 연산은 Direct3D 10 이상의 개체에 대해 작동하지만 Direct3D 9 개체에 대해서는 작동하지 않습니다. Direct3D 9의 경우 먼저 프로젝션 변환을 통해 클립 공간으로 전환해야 합니다.

프로젝션 행렬

프로젝션 행렬은 꼭짓점을 보기 공간(여기서 원본이 뷰어의 눈인 경우, +x는 오른쪽, +y는 위쪽, +z는 바로 앞)에서 클립 공간으로 변환합니다. 프로젝션 행렬은 하드웨어 클리핑 및 래스터화 단계를 위한 꼭짓점을 준비합니다. 다음은 표준 원근 행렬입니다(다른 프로젝션에는 다른 수학이 필요함).

*r* 창 너비/높이의 비율 *α* 시야각 *f* 뷰어에서 먼 평면까지의 거리 *n* 뷰어에서 가까운 평면까지의 거리
![projection matrix](images/projection-matrix.png)

다음 행렬은 이전 행렬의 단순화된 버전입니다. 나중에 행렬 곱하기 연산에서 사용할 수 있도록 단순화된 행렬을 보여 줍니다.

간소화된 프로젝션 행렬

이제 행렬 곱을 사용하여 보기 공간 꼭짓점을 클립 공간으로 변환합니다.

행렬 곱하기

행렬 곱하기 작업에서 x 및 y 성분은 약간만 조정되지만 z 및 w 성분은 매우 복잡합니다. 클립 평면은 더 이상 원하는 것을 제공하지 않습니다.

클립 공간 클립 평면

여기에서 Microsoft는 클립 공간 꼭짓점과 내적이 보기 공간에서 클리핑 섹션의 v · C와 같은 값을 제공하는 클립 공간 클립 평면을 만들려고 합니다.

클립 평면

v · C = v P · CP

vCₓ +vyCy + vzCz + Cw = vPCPₓ +vyPyCPy + vzAyCPz + BCPz + vzCPw

이제 Microsoft는 꼭짓점 성분에 의한 앞의 수학 연산을 네 개의 개별 방정식으로 나눌 수 있습니다.

클립 평면 내적의 x 꼭짓점 성분

클립 평면 내적의 y 꼭짓점 성분

클립 평면 내적의 w 꼭짓점 성분

클립 평면 내적의 z 꼭짓점 성분

보기 공간 클립 평면과 프로젝션 행렬은 클립 공간 클립 평면을 파생하여 제공합니다.

클립 공간 클립 평면

HLSL에 대한 프로그래밍 지침

함수 선언 구문