스칼라 데이터 형식

HLSL은 여러 스칼라 데이터 형식을 지원합니다.

  • bool - true 또는 false입니다.
  • int - 32비트 부호 있는 정수입니다.
  • uint - 32비트 부호 없는 정수입니다.
  • dword - 32비트 부호 없는 정수입니다.
  • half - 16비트 부동 소수점 값입니다. 이 데이터 형식은 언어 호환성을 위해서만 제공됩니다. Direct3D 10 셰이더 대상은 모든 절반 데이터 형식을 부동 데이터 형식에 매핑합니다. 균일한 전역 변수에서 절반 데이터 형식을 사용할 수 없습니다(해당 기능이 필요한 경우 /Gec 플래그 사용).
  • float - 32비트 부동 소수점 값입니다.
  • double - 64비트 부동 소수점 값입니다. 스트림의 입출력으로 배정밀도 값을 사용할 수 없습니다. 셰이더 간에 배정밀도 값을 전달하려면 각 doubleuint 데이터 형식 쌍으로 선언합니다. 그런 다음 asuint 함수를 사용하여 각 doubleuint 쌍과 asdouble 함수를 사용하여 uint 쌍을 다시 double로 압축 해제합니다.

Windows 8부터 HLSL은 최소 정밀 스칼라 데이터 형식도 지원합니다. 그래픽 드라이버는 지정된 비트 정밀도보다 크거나 같은 정밀도를 사용하여 최소 정밀도 스칼라 데이터 형식을 구현할 수 있습니다. 특정 기본 정밀도에 의존하는 클램핑 또는 래핑 동작에 의존하지 않는 것이 좋습니다. 예를 들어, 그래픽 드라이버는 최대 32비트 정밀도로 min16float 값에 대해 산술 연산을 실행할 수 있습니다.

  • min16float - 최소 16비트 부동 소수점 값입니다.
  • min10float - 최소 10비트 부동 소수점 값입니다.
  • min16int - 최소 16비트 부호 있는 정수입니다.
  • min12int - 최소 12비트 부호 있는 정수입니다.
  • min16uint - 최소 16비트 부호 없는 정수입니다.

스칼라 리터럴에 대한 자세한 내용은 문법을 참조하세요.

다음 스칼라는 HLSL 셰이더 모델 6.0(Windows 10 버전 1607)에서 도입되었습니다.

  • uint64_t - 64비트 부호 없는 정수입니다.
  • int64_t - 서명된 64비트 정수입니다.

다음 스칼라는 HLSL 셰이더 모델 6.2(Windows 10 버전 1803)에서 도입되었으며 가 사용되는 경우 -enable-16bit-types 사용할 수 있습니다.

  • float16_t - 항상 16비트 부동 소수점 값입니다(16비트일 수도 있거나 그렇지 않을 수도 있는 다른 16비트 부동 소수점과 반대).
  • uint16_t - 부호 없는 16비트 정수입니다.
  • int16_t - 16비트 부제 정수입니다.

16비트 형식에 대한 자세한 내용은 16비트 스칼라 형식을 참조하세요. 이를 위해서는 튜링 이상에서 지원하는 하드웨어에서 16비트 지원이 필요합니다.

Direct3D 9와 Direct3D 10의 차이점:

Direct3D 10에서 다음 형식은 float 형식의 한정자입니다.

  • snorm float - 범위가 -1~1인 IEEE 32비트 부호 정규화 부동 소수점입니다.
  • unorm float - 범위가 0~1인 IEEE 32비트 부호 없는 정규화된 부동 소수점입니다.

예를 들어 다음은 4개 구성 요소로 서명된 정규화된 float-variable 선언입니다.

snorm float4 fourComponentIEEEFloat;

string 형식

HLSL은 ASCII 문자열인 string 형식도 지원합니다. 문자열을 허용하는 작업이나 상태는 없습니다. 그러나 효과는 문자열 매개 변수 및 주석을 쿼리할 수 있습니다.

예제

// Top-level variable.
float globalShaderVariable; 

// Top-level function.
void function(
in float4 position: POSITION0 // Top-level argument.
              )
{
  float localShaderVariable; // Local variable.
  function2(...)
}

void function2()
{
  ...
}

참고 항목