Common-Shader Core
셰이더 모델 4에서 모든 셰이더 단계는 공통 셰이더 코어를 사용하여 동일한 기본 기능을 구현합니다. 또한 세 개의 셰이더 단계(꼭짓점, 기하 도형 및 픽셀)는 기하 도형 셰이더 단계에서 새 기본 형식을 생성하거나 픽셀 셰이더 단계에서 특정 픽셀을 삭제하는 기능과 같은 각 단계에 고유한 기능을 제공합니다. 다음 다이어그램에서는 셰이더 단계를 통해 데이터가 흐르는 방법과 셰이더 메모리 리소스와 공통 셰이더 코어의 관계를 보여 줍니다.
셰이더 단계다이어그램
- 입력 데이터: 꼭짓점 셰이더는 입력 어셈블러 단계에서 입력을 받습니다. geometry 및 픽셀 셰이더는 이전 셰이더 단계에서 해당 입력을 받습니다. 추가 입력에는 시스템 값 의미 체계포함됩니다. 이 의미 체계는 해당되는 파이프라인의 첫 번째 단원에서 사용할 수 있습니다.
- 출력 데이터: 셰이더는 파이프라인의 후속 단계에 전달될 출력 결과를 생성합니다. 기하 도형 셰이더의 경우 단일 호출의 데이터 출력 양이 다를 수 있습니다. 일부 출력은 공통 셰이더 코어(예: 꼭짓점 위치 및 render-target-array 인덱스)에 의해 해석되며, 다른 출력은 애플리케이션에서 해석되도록 설계되었습니다.
- 셰이더 코드: 셰이더는 메모리에서 읽거나, 벡터 부동 소수점 및 정수 산술 연산을 수행하거나, 흐름 제어 작업을 수행할 수 있습니다. 셰이더에서 구현할 수 있는 문 수에는 제한이 없습니다.
- 샘플러: 샘플러가 텍스처를 샘플링하고 필터링하는 방법을 정의합니다. 최대 16명의 샘플러를 셰이더에 동시에 바인딩할 수 있습니다.
- 텍스처: 텍스처는 샘플러를 사용하여 필터링하거나 로드 내장 함수를 사용하여 직접 텍셀 단위로 읽을 수 있습니다.
- 버퍼: 버퍼는 필터링되지 않지만 로드 내장 함수를 사용하여 요소별로 메모리에서 직접 읽을 수 있습니다. 최대 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비트 정수로 해석됩니다. 또한 부울 값은 이제 모든 비트가 설정되거나 모든 비트가 설정되지 않습니다. bool 변환된 데이터는 값이 0.0f(양수 및 음수 0은 모두 false로 허용됨)와 false가 아닌 경우 true로 해석됩니다. |
비트 연산자
공통 셰이더 코어는 다음 비트 연산자를 지원합니다.
연산자 | 기능 |
---|---|
~ | 논리 Not |
<< | 왼쪽 시프트 |
>> | 오른쪽 시프트 |
& | 논리 및 |
| | 논리적 또는 |
^ | 논리 Xor |
<<= | 왼쪽 시프트 등 |
>>= | 오른쪽 시프트 등 |
&= | 그리고 같음 |
|= | 또는 같음 |
^= | Xor Equal |
비트 연산자는 int 및 uint 데이터 형식에서만 작동하도록 정의됩니다. float 또는 구조체 데이터 형식에서 비트 연산자를 사용하려고 하면 오류가 발생합니다. 비트 연산자는 다른 연산자를 기준으로 C와 동일한 우선 순위를 따릅니다.
이진 캐스트
정수와 부동 소수점 형식 간에 캐스팅하면 C 잘림 규칙에 따라 숫자 값이 변환됩니다. float값을 int캐스팅하고 float 다시 캐스팅하는 것은 대상 데이터 형식의 정밀도에 따라 손실 변환입니다. 다음은 asfloat(DirectX HLSL), asint(DirectX HLSL), asuint(DirectX HLSL)변환 함수입니다.
HLSL 내장 함수를 사용하여 이진 캐스트를 수행할 수도 있습니다. 이렇게 하면 컴파일러가 숫자의 비트 표현을 대상 데이터 형식으로 재해석합니다.