다음을 통해 공유


기능 수준 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 이전에는 Direct3D 10 또는 Direct3D 11 API의 기능 수준 9_x 하드웨어에 SV_ClipDistance 사용할 수 없었습니다. 따라서 Windows 8 이전에는 기능 수준 9_x 하드웨어를 사용하여 사용자 클립 평면에 액세스하는 유일한 방법은 Direct3D 9 API를 사용하는 것이었습니다. Direct3D Windows 스토어 앱은 Direct3D 9 API를 사용할 수 없습니다. 여기서는 기능 수준 9_x 이상에서 Direct3D 11 API를 통해 사용자 클립 평면에 액세스하는 데 사용할 수 있는 구문을 설명합니다.

앱은 클립 평면을 사용하여 그려진 모든 기본 형식을 클립(throw)하는 3D 세계 내에서 보이지 않는 평면 집합을 정의합니다. Windows는 클립 평면의 음수 면에 있는 픽셀을 그리지 않습니다. 그런 다음 앱은 클립 평면을 사용하여 평면 리플렉션을 렌더링할 수 있습니다.

통사론

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

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;
}

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

메모

클립 평면을 동적으로 사용하지 않도록 설정하는 데 사용할 수 있는 구문은 없습니다. 클립플레인 특성이 없는 동일한 셰이더를 다시 컴파일하거나, 평면이 더 이상 기하 도형에 영향을 주지 않도록 앱에서 상수 버퍼의 계수를 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 이상을 사용하여 꼭짓점 셰이더를 컴파일하는 경우 해당 꼭짓점 셰이더는 클립플레인 특성을 사용할 수 있습니다. 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 w

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

프로젝션 행렬

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

*r* 비율 창 너비/높이 *α* 보기 각도 *f* 뷰어에서 먼 평면까지의 거리 *n* 뷰어에서 가까운 평면까지의 거리
! [프로젝션 매트릭스](이미지/projection-matrix.png)

다음 행렬은 이전 행렬의 간소화된 버전입니다. 행렬 곱하기 연산의 뒷부분에서 사용할 수 있도록 행렬이 간소화된 것으로 표시됩니다.

간소화된 프로젝션 행렬

이제 뷰 공간 꼭짓점을 행렬을 곱한 클립 공간으로 변환합니다.

행렬 곱하기

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

클립 공간 클립 평면

여기에서 클립 공간 꼭짓점이 있는 점 제품이 v ·와 동일한 값을 제공하는 클립 공간 클립 평면을 만들려고 합니다. 뷰 공간 섹션의 클리핑에서 C.

클립 평면

v · C = v P · CP

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

이제 위의 수학 연산을 꼭짓점 구성 요소별로 네 개의 별도 수식으로 분할할 수 있습니다.

클립 평면 제품x 꼭짓점 구성 요소

클립 평면 제품y 꼭짓점 구성 요소

클립 평면 제품

클립 평면 제품z 꼭짓점 구성 요소

뷰 공간 클립 평면과 프로젝션 행렬은 파생되어 클립 공간 클립 평면을 제공합니다.

클립 공간 클립 평면

HLSL 대한 프로그래밍 가이드

함수 선언 구문