HLSL 최소 정밀도 사용

Windows 8부터 그래픽 드라이버는 지정된 비트 정밀도보다 크거나 같은 정밀도를 사용하여 최소 정밀도 HLSL 스칼라 데이터 형식을 구현할 수 있습니다. HLSL 최소 정밀도 셰이더 코드가 HLSL 최소 정밀도를 구현하는 하드웨어에서 사용되는 경우 메모리 대역폭을 적게 사용하므로 시스템 전력도 적게 사용합니다.

D3D11_FEATURE_SHADER_MIN_PRECISION_SUPPORT 값과 함께 ID3D11Device::CheckFeatureSupport를 호출하여 그래픽 드라이버가 제공하는 최소 정밀도 지원을 쿼리할 수 있습니다. 자세한 내용은 HLSL 최소 정밀도 지원을 참조하세요.

최소 정밀도 데이터 형식으로 변수 선언

HLSL 셰이더 코드에서 최소 정밀도를 사용하려면 min16float(벡터의 경우 min16float4), min16int, min10float 등과 같은 형식으로 개별 변수를 선언합니다. 이러한 변수를 사용하여 셰이더 코드는 변수가 나타내는 것보다 더 많은 정밀도가 필요하지 않음을 나타냅니다. 그러나 하드웨어는 최소 정밀도 표시기를 무시하고 완전한 32비트 정밀도로 실행할 수 있습니다. 셰이더 코드가 최소 정밀도를 활용하는 하드웨어에서 사용되는 경우 메모리 대역폭을 덜 사용하므로 셰이더 코드가 지정된 것보다 더 높은 정밀도를 기대하지 않는 한 시스템 전력도 적게 사용합니다.

최소 정밀도를 사용하거나 사용하지 않는 여러 셰이더를 작성할 필요가 없습니다. 대신 최소 정밀도로 셰이더를 만들고 최소 정밀도 변수는 그래픽 드라이버가 최소 정밀도를 지원하지 않는다고 보고하는 경우 완전한 32비트 정밀도로 작동합니다. HLSL 최소 정밀도 셰이더는 Windows 8 이전 운영 체제에서 작동하지 않으므로 이전 운영 체제를 대상으로 할 계획이라면 최소 정밀도를 사용하는 셰이더와 사용하지 않는 셰이더를 여러 개 작성해야 합니다.

참고

이러한 형식의 변환은 낭비적이고 성능을 저하시키므로 셰이더 내에서 서로 다른 정밀도 수준 간에 데이터를 전환하지 마세요. 예외는 셰이더 상수가 여전히 항상 32비트라는 것입니다. 그러나 공급업체는 HLSL 명령 읽기에서 사용할 수 있는 더 낮은 정밀도로 자유롭게 하향 변환할 수 있는 그래픽 하드웨어를 설계할 수 있습니다.

 

최소 정밀도를 사용하여 셰이더 코드의 다양한 부분에서 계산 정밀도를 제어할 수 있습니다.

HLSL 최소 정밀도에 대한 규칙은 C/C++와 유사합니다. 여기서 식의 형식은 결과적으로 작성되는 형식이 아니라 작업의 정밀도를 결정합니다.

최소 정밀도 셰이더 코드 테스트

기준 래스터라이저(D3D_DRIVER_TYPE_REFERENCE)는 각 HLSL 명령을 지정된 정밀도로 양자화하여 HLSL 셰이더 코드의 최소 정밀도가 어떻게 작동하는지 대략적으로 보여 줍니다. 이를 통해 실수로 최소 정밀도 이상에 의존할 수 있는 코드를 발견할 수 있습니다. 기준 래스터라이저는 HLSL 셰이더 코드가 최소 정밀도를 사용하는 경우 더 빨리 실행되지 않지만 이를 사용하여 코드의 정확성을 확인할 수 있습니다. WARP(D3D_DRIVER_TYPE_WARP)는 HLSL 셰이더 코드에서 최소 정밀도 사용을 지원하지 않습니다. WARP는 완전한 32비트 정밀도로 실행됩니다.

HLSL에 대한 프로그래밍 지침