내보내기(0) 인쇄
모두 확장
정보
요청한 주제가 아래에 표시됩니다. 그러나 이 주제는 이 라이브러리에 포함되지 않습니다.

Direct3D 기능 수준 9용 그림자 버퍼 구현 (DirectX 및 C++)

Applies to Windows and Windows Phone

DirectX와 C++를 사용하여 그림자 효과를 렌더링하고 Direct3D 기능 수준 9_1, 9_2 또는 9_3을 사용하는 Windows 런타임 앱을 개발하려면 Direct3D 10_0+ 그림자 버퍼 기능의 특정 하위 집합을 사용하여 그림자 효과를 올바르게 구현해야 합니다. 여기서는 Direct3D 기능 수준 9용 그림자 버퍼 구현에 대해 소개합니다.

그림자 버퍼란?

그림자는 사실적인 3차원 화면을 만들고 깊이 효과를 주는 데 중요한 요소입니다. 그림자 버퍼 기법은 그래픽 하드웨어를 사용하여 그림자를 렌더링하는 일반적인 접근 방법이지만 비교적 비용이 많이 듭니다. 그림자 버퍼는 깊이 버퍼를 통해 광원 관점에서 화면 깊이 정보를 저장한 다음 화면에 렌더링된 각 점을 깊이 버퍼와 비교하여 점이 그림자에 속하는지 확인하는 방식으로 구현됩니다.

Direct3D 기능 수준 9_1, 9_2 또는 9_3에서 그림자 구현

앱이 시작되면 D3D11_FEATURE_D3D9_SHADOW_SUPPORT Direct3D 기능 열거 값을 통해 설치된 그래픽 드라이버가 그림자 버퍼를 지원하는지 확인하여 ID3D11Device::CheckFeatureSupport를 호출합니다. CheckFeatureSupport pFeatureSupportData 매개 변수에 의해 수신된 데이터(해당 D3D11_FEATURE_DATA_D3D9_SHADOW_SUPPORT 구조)의 SupportsDepthAsTextureWithLessEqualComparisonFilter 필드가 false로 설정되어 있으면 DirectX로 작성된 Windows 런타임 앱을 사용자 컴퓨터에서 실행할 때 그림자 버퍼가 작동하지 않습니다. 이 문제를 해결하려면 드라이버를 업그레이드해야 합니다.



D3D11_FEATURE_DATA_D3D9_SHADOW_SUPPORT d3d9ShadowSupportResults;
ZeroMemory(&d3d9ShadowSupportResults, sizeof(D3D11_FEATURE_DATA_D3D9_SHADOW_SUPPORT)); 

m_device->CheckFeatureSupport(
		D3D11_FEATURE_D3D9_SHADOW_SUPPORT, 
		&d3d9ShadowSupportResults,
		sizeof(D3D11_FEATURE_DATA_D3D9_SHADOW_SUPPORT)
		);
	

이 방법은 16비트 또는 24비트 깊이 버퍼에서 사용할 수 있으므로 두 가지 경우 모두 설명 섹션에 제공됩니다. 일부 드라이버 구현에서는 16비트 깊이 버퍼만 지원할 수 있습니다.

참고  자세한 내용은 그림자 깊이 맵을 향상시키기 위한 일반적인 기법을 읽어보세요.

  1. 24비트 깊이 버퍼가 지원될 경우에는 D3D11_TEXTURE2D_DESCFormat 필드를 DXGI_FORMAT_R24G8_TYPELESS로 설정하고 그렇지 않은 경우에는 DXGI_FORMAT_R16_TYPELESS로 설정하여 Texture2D 화면 리소스(ID3D11Device::CreateTexture2D 사용)를 만듭니다. BindFlags 필드에서 BIND_SHADER_RESOURCE 플래그 및 BIND_DEPTH_STENCIL 플래그 값을 지정합니다. 이렇게 하면 화면이 별도의 렌더링 단계에서 깊이 버퍼 또는 텍스처로 사용될 수 있습니다.

    참고  그래픽 드라이버가 이러한 특정 형식을 지원하는지 확인할 때 CheckFormatSupport를 사용하지 마세요. Direct3D 11 CheckFeatureSupportCheckFormatSupport API를 사용하여 기능 수준 9_*에 대한 DXGI_FORMAT 지원을 쿼리하는 경우 DirectX 런타임은 어떤 그림자 버퍼 기능에 대한 지원도 보고하지 않습니다.

  2. 24비트 그림자 버퍼 깊이에 대해 DXGI_FORMAT_D24_UNORM_S8_UINT, 16비트 그림자 버퍼 깊이에 대해 DXGI_FORMAT_D16_UNORM과 같은 깊이 형식을 사용하면 1단계에서 할당한 Texture2D 리소스에 ID3D11DepthStencilView(using ID3D11Device::CreateDepthStencilView)가 만들어집니다.

  3. 그림자 정보와 함께 그림자 버퍼를 로드합니다. 먼저 광원 위치에 임시 카메라를 설정하고 광원 방향을 향하게 합니다. 그런 후 화면에서 그림자를 자기 자신이나 다른 개체로 캐스팅할 수 있는 모든 개체를 렌더링합니다. 이 단계에서는 픽셀 셰이더를 설정하지 말고 출력에 대한 ID3D11DepthStencilView만 바인딩합니다.

  4. 그림자를 사용하여 화면에 개체를 렌더링하려면 비교 필터링이 설정된 샘플러 상태 개체를 만듭니다. 기능 수준 9_* 장치의 경우 비교 모드를 LessEqual로 설정해야 합니다. 일반적으로 대부분의 그래픽 드라이버는 Direct3D 기능 수준 9_1 및 9_2에서 BorderColor를 지원하지 않지만 이 깊이 샘플러에서는 BorderColor 주소 지정도 허용됩니다. 테두리 색을 사용하면 BorderColor 값을 각각 0.0 또는 1.0으로 설정하여 그림자 맵 외부 영역이 그림자에 항상 나타나는지 또는 절대 나타나지 않는지를 제어할 수 있습니다.

    그림자 필터 품질은 비교 샘플러의 MagMin 필터 옵션을 통해 제어됩니다. 포인트 샘플링은 별칭 가장자리가 있는 그림자를 생성합니다. 선형 필터 샘플러 설정을 사용하면 그림자 가장자리 품질이 높아지지만 일부 성능 최적화 장치의 성능에 영향을 미칠 수 있습니다.

    참고   몇 가지 사항에 유의해야 합니다. 먼저 MagMin 필터 옵션에 대해 별도의 설정을 사용하면 정의되지 않은 결과가 생성됩니다. 또한 이방성 필터링도 지원되지 않습니다. 마지막으로 Direct3D 기능 수준 9_*는 MIP 매핑 깊이 버퍼를 지원하지 않습니다.

  5. 1단계에 할당된 Texture2D 리소스에 대해 ID3D11ShaderResourceView를 만들고(ID3D11Device::CreateShaderResourceView 사용) 앞에 설명된 비교 샘플러에 바인딩합니다. 1단계에서와 같이 이 보기에 대한 픽셀 형식을 24비트 깊이의 경우 DXGI_FORMAT_R24_UNORM_G8_TYPELESS 으로, 16비트 깊이의 경우 DXGI_FORMAT_R16_UNORM으로 설정해야 합니다.

  6. 그림자 적용 단계에 대한 ps_4_0_level_9_* 픽셀 셰이더를 만들고 설정합니다. 광원 위치에 상대적으로 각 픽셀의 위치를 계산한 다음 픽셀의 z 값을 그림자 버퍼의 값과 비교하여 해당 픽셀이 그림자에 있는지 여부를 결정합니다. 다음에 대한 셰이더 코드를 작성하여 이 작업을 수행합니다(비교 단계를 수행하는 하드웨어 사용).

    • 먼저 현재 위치를 그림자 렌더링에 사용되는 동일한 월드, 보기 및 프로젝션 영역에 투영한 다음 [-1..1] 영역의 x-y 좌표를 그림자 맵 샘플링을 위한 [0..1] 영역에 다시 매핑하여 텍스처 좌표와 z 값을 구합니다.
    • 다음에는 현재 위치를 그림자 렌더링에 사용되는 동일한 월드, 보기 및 프로젝션 영역에 투영한 다음 [-1..1] 영역의 x-y 좌표를 그림자 맵 샘플링을 위한 [0..1] 영역에 다시 매핑하여 텍스처 좌표와 z 값을 구합니다.
    • 그런 다음 현재 픽셀에 대한 그림자 양을 확인하기 위해 SampleCmpSampleCmpLevelZero Texture2D 메서드를 사용하여 Direct3D 기능 수준 10_0 이상에서와 같이 5단계에서 만든 ID3D11ShaderResourceView에서 샘플링을 수행합니다. 이렇게 하면 범위 [0..1]의 값으로 지정된 선형 필터링에 대한 그림자에 없는 샘플 부분이 생성됩니다. 점 샘플링의 경우 0.0 또는 1.0 값이 반환됩니다.

    참고  Direct3D 기능 수준 9_1, 9_2 및 9_3에서 이러한 SampleCmp*를 사용하여 셰이더를 컴파일하려고 하면 이전 HLSL 컴파일러를 사용하는 내부 기능(예: Windows 7 버전의 ID3D11Device::CreatePixelShader 메서드)이 실패합니다. SampleCmp* 내부 기능은 Windows 8 이상에 포함되는 fxc 컴파일러 및 관련 DLL에서만 지원됩니다. 이러한 HLSL 내부 기능은 9보다 높은 Direct3D 기능 수준에 대한 셰이더 모델에도 존재합니다.

  7. 그림자가 캐스팅될 개체를 화면에 렌더링합니다.

그림자 렌더링 후에 반드시 API 상태를 정리해야 합니다. 기능 수준 9_1이 구성된 장치에서 API 상태가 일치하지 않으면 ID3D11DeviceContext::Draw 호출이 생략됩니다. 예를 들어 해당 샘플러가 비교 샘플링에 맞게 구성되어 있을 때 렌더러가 텍스처(깊이 등)를 바인딩하면 ID3D11DeviceContext::Draw가 생략됩니다. 이 경우 API 상태를 잘못 설정한 것입니다.

Direct3D 기능 수준 10_0 이상에서 그림자 구현

기능 수준 9 장치에서 그림자 매핑을 위해 수행하는 이전 단계는 기능 수준 10 이상 장치에서도 추가적인 코드 변경 없이 그대로 사용할 수 있습니다. 그러나 기능 수준이 높으면 고급 비교 모드 및 추가 깊이의 화면 형식을 비롯한 광범위한 옵션이 지원됩니다.

관련 항목

그림자 깊이 맵을 향상시키기 위한 일반적인 기법
Direct3D 11 기능 수준
다양한 Direct3D 기능 수준용 개발

 

 

표시:
© 2014 Microsoft