공통 셰이더 코어
셰이더 모델 4에서 모든 셰이더 단계는 공통 셰이더 코어를 사용하여 동일한 기본 기능을 구현합니다. 또한 세 개의 셰이더 단계(꼭짓점, 기하 도형 및 픽셀) 각각은 기하 도형 셰이더 단계에서 새 기본 형식을 생성하거나 픽셀 셰이더 단계에서 특정 픽셀을 삭제하는 기능과 같이 각 스테이지에 고유한 기능을 제공합니다. 다음 다이어그램은 데이터가 셰이더 단계들을 통과하는 방법과 셰이더 메모리 리소스와 공통 셰이더 코어의 관계를 보여 줍니다.
- 입력 데이터: 꼭짓점 셰이더는 입력 어셈블러 단계에서 해당 입력을 받습니다. 기하 도형 및 픽셀 셰이더는 이전 셰이더 단계로부터 입력을 받습니다. 추가 입력에는 해당되는 파이프라인의 첫 번째 단위에서 사용할 수 있는 시스템 값 의미 체계가 포함됩니다.
- 출력 데이터: 셰이더는 파이프라인의 후속 단계에 전달될 출력 결과를 생성합니다. 기하 도형 셰이더의 경우 단일 호출에서 출력되는 데이터 양은 다를 수 있습니다. 일부 출력은 공통 셰이더 코어(예: 꼭짓점 위치 및 render-target-array 인덱스)에 의해 해석되며, 다른 출력은 애플리케이션에서 해석하도록 설계되었습니다.
- 셰이더 코드: 셰이더는 메모리에서 읽거나, 벡터 부동 소수점 및 정수 산술 연산을 수행하거나, 흐름 제어 작업을 수행할 수 있습니다. 셰이더에서 구현할 수 있는 문 수에는 제한이 없습니다.
- 샘플러: 샘플러가 텍스처를 샘플링하고 필터링하는 방법을 정의합니다. 동시에 최대 16개의 샘플러를 셰이더에 바인딩할 수 있습니다.
- 텍스처: 샘플러를 사용하여 텍스처를 필터링하거나 load 내장 함수를 사용하여 직접 텍셀 단위로 읽을 수 있습니다.
- 버퍼: 버퍼는 필터링되지 않지만 load 내장 함수를 사용하여 요소별로 메모리에서 직접 읽을 수 있습니다. 최대 128개의 텍스처 및 버퍼 리소스(결합됨)를 셰이더에 동시에 바인딩할 수 있습니다.
- 상수 버퍼: 상수 버퍼는 셰이더 상수 변수에 최적화되어 있습니다. 최대 16개의 상수 버퍼를 셰이더 스테이지에 동시에 바인딩할 수 있습니다. CPU에서 더 자주 업데이트하도록 설계되었습니다. 따라서 추가적인 크기, 레이아웃 및 액세스 제한이 있습니다.
Direct3D 9와 Direct3D 10의 차이점
- Direct3D 9에서 각 셰이더 단위에는 모든 상수 셰이더 변수를 저장하는 단일의 작은 상수 레지스터 파일이 있었습니다. 이 제한된 상수 공간으로 모든 셰이더를 수용하려면 CPU에서 상수를 자주 재활용해야 했습니다.
- Direct3D 10에서 상수는 메모리의 변경할 수 없는 버퍼에 저장되며 다른 리소스와 똑같이 관리됩니다. 애플리케이션이 만들 수 있는 상수 버퍼 수에는 제한이 없습니다. 업데이트 및 사용 빈도에 따라 상수를 버퍼로 구성하면 모든 셰이더를 수용하기 위해 상수를 업데이트하는 데 필요한 대역폭의 양을 크게 줄일 수 있습니다.
정수 및 비트 지원
공통 셰이더 코어는 IEEE 규격 32비트 정수 및 비트 연산의 전체 집합을 제공합니다. 이러한 작업을 통해 압축 및 압축 기술, FFT 및 비트필드 프로그램 흐름 제어가 포함된 그래픽 하드웨어 예제의 새로운 알고리즘 클래스를 사용할 수 있습니다.
Direct3D 10 HLSL의 int 및 uint 데이터 형식은 하드웨어의 32비트 정수에 매핑됩니다.
Direct3D 9와 Direct3D 10의 차이점 Direct3D 9에서는 HLSL에서 정수로 표시된 스트림 입력이 부동 소수점으로 해석되었습니다. Direct3D 10에서는 정수로 표시된 스트림 입력이 32비트 정수로 해석됩니다. 또한 부울 값은 이제 모든 비트가 설정되거나 모든 비트가 설정되지 않습니다. 부울로 변환된 데이터는 값이 0.0f(양수 및 음수 0은 모두 false가 될 수 있음)가 아닌 경우 true로 해석되고 그 외의 경우는 false로 해석됩니다. |
비트 연산자
공통 셰이더 코어는 다음 비트 연산자를 지원합니다.
연산자 | 기능 |
---|---|
~ | 논리적 NOT |
<< | 왼쪽 Shift |
>> | 오른쪽 Shift |
= | 논리적 And |
| | 논리 Or 연산입니다. |
^ | 논리적 Xor |
= | 왼쪽 Shift Equal |
= | 오른쪽 Shift Equal |
:\ | And Equal |
|= | Or Equal |
^= | Xor Equal |
비트 연산자는 int 및 uint 데이터 형식에서만 작동하도록 정의됩니다. float 또는 struct 데이터 형식에서 비트 연산자를 사용하려고 하면 오류가 발생합니다. 비트 연산자는 다른 연산자와 관련하여 C와 동일한 우선 순위를 따릅니다.
이진 캐스트
정수와 부동 소수점 형식 간에 캐스팅하면 C 잘림 규칙에 따라 숫자 값이 변환됩니다. float에서 int로 값을 캐스팅하고 float로 다시 캐스팅하면 대상 데이터 형식의 정밀도에 따라 손실 변환이 발생합니다. 다음은 asfloat(DirectX HLSL), asint(DirectX HLSL), asuint(DirectX HLSL) 변환 함수입니다.
이진 캐스트는 HLSL 내장 함수를 사용하여 수행할 수도 있습니다. 이렇게 하면 컴파일러가 숫자의 비트 표현을 대상 데이터 형식으로 재해석합니다.