Common-Shader Core

셰이더 모델 4에서 모든 셰이더 단계는 공통 셰이더 코어를 사용하여 동일한 기본 기능을 구현합니다. 또한 세 개의 셰이더 단계(꼭짓점, 기하 도형 및 픽셀)는 기하 도형 셰이더 단계에서 새 기본형을 생성하거나 픽셀 셰이더 단계에서 특정 픽셀을 삭제하는 기능과 같은 각 단계에 고유한 기능을 제공합니다. 다음 다이어그램에서는 셰이더 단계를 통해 데이터가 흐르는 방법과 셰이더 메모리 리소스와 공통 셰이더 코어의 관계를 보여줍니다.

셰이더 단계의 데이터 흐름 다이어그램

  • 입력 데이터: 꼭짓점 셰이더는 입력 어셈블러 단계에서 입력을 받습니다. geometry 및 pixel 셰이더가 이전 셰이더 단계에서 입력을 받습니다. 추가 입력에는 해당되는 파이프라인의첫 번째 단원에서 사용할 수 있는 시스템 값 의미 체계 가 포함됩니다.
  • 출력 데이터: 셰이더가 파이프라인의 후속 단계에 전달될 출력 결과를 생성합니다. 기하 도형 셰이더의 경우 단일 호출에서 출력되는 데이터 양이 다를 수 있습니다. 일부 출력은 공통 셰이더 코어(예: 꼭짓점 위치 및 render-target-array 인덱스)에 의해 해석되며, 다른 출력은 애플리케이션에서 해석되도록 설계되었습니다.
  • 셰이더 코드: 셰이더가 메모리에서 읽거나, 벡터 부동 소수점 및 정수 산술 연산을 수행하거나, 흐름 제어 작업을 수행할 수 있습니다. 셰이더에서 구현할 수 있는 문 수에는 제한이 없습니다.
  • 샘플러: 샘플러가 질감을 샘플링하고 필터링하는 방법을 정의합니다. 16개 샘플러를 셰이더에 동시에 바인딩할 수 있습니다.
  • 질감: 질감은 샘플러를 사용하여 필터링하거나 부하 기본 함수를 사용하여 직접 텍셀 단위로 읽을 수 있습니다.
  • 버퍼: 버퍼는 필터링되지 않지만 로드 기본 함수를 통해 요소별로 직접 메모리에서 읽을 수 있습니다. 최대 128개의 질감 및 버퍼 리소스(결합)를 셰이더에 동시에 바인딩할 수 있습니다.
  • 상수 버퍼: 상수 버퍼는 셰이더 상수 변수에 최적화되어 있습니다. 최대 16개의 상수 버퍼를 셰이더 단계에 동시에 바인딩할 수 있습니다. CPU에서 더 자주 업데이트하도록 설계되었습니다. 따라서 추가 크기, 레이아웃 및 액세스 제한이 있습니다.

Direct3D 9와 Direct3D 10 간의 차이점:

  • Direct3D 9에서 각 셰이더 단위에는 모든 상수 셰이더 변수를 저장할 수 있는 작은 단일 상수 레지스터 파일이 있었습니다. 이 제한된 상수 공간으로 모든 셰이더를 수용하려면 CPU에서 상수를 자주 재활용해야 했습니다.
  • Direct3D 10에서 상수는 메모리의 변경 불가능한 버퍼에 저장되고 다른 리소스처럼 관리됩니다. 애플리케이션에서 만들 수 있는 상수 버퍼 수에는 제한이 없습니다. 업데이트 및 사용 빈도에 따라 상수를 버퍼로 구성하면 모든 셰이더를 수용하기 위해 상수를 업데이트하는 데 필요한 대역폭의 양을 크게 줄일 수 있습니다.

정수 및 비트 지원

공통 셰이더 코어는 IEEE 규격 32비트 정수 및 비트 연산의 전체 집합을 제공합니다. 이러한 작업을 통해 압축 및 압축 기술, FFT 및 비트필드 프로그램 흐름 제어가 포함된 그래픽 하드웨어 예제의 새로운 알고리즘 클래스를 사용할 수 있습니다.

Direct3D 10 HLSL의 intuint 데이터 형식은 하드웨어의 32비트 정수에 매핑됩니다.

Direct3D 9와 Direct3D 10 간의 차이점:
Direct3D 9에서는 HLSL에서 정수로 표시된 스트림 입력이 부동 소수점으로 해석되었습니다. Direct3D 10에서 정수로 표시된 스트림 입력은 32비트 정수로 해석됩니다.
또한 부울 값은 이제 모든 비트가 설정되거나 모든 비트가 설정되지 않습니다. bool로 변환된 데이터는 값이 0.0f(양수 및 음수 0 모두 false일 수 있음)와 같지 않으면 true로 해석되고, 그렇지 않으면 false로 해석됩니다.

비트 연산자

공통 셰이더 코어는 다음 비트 연산자를 지원합니다.

연산자 기능
~ 논리적 NOT
<< 왼쪽 시프트
>> 오른쪽 시프트
& 논리적 And
| 논리 Or 연산입니다.
^ 논리 Xor
<<= 왼쪽 시프트 같음
>>= 오른쪽 시프트 같음
&= And Equal
|= 또는 같음
^= Xor Equal

비트 연산자는 intuint 데이터 형식에서만 작동하도록 정의됩니다. float 또는 struct 데이터 형식에서 비트 연산자를 사용하려고 하면 오류가 발생합니다. 비트 연산자는 다른 연산자에서 C와 동일한 우선 순위를 따릅니다.

이진 캐스트

정수와 부동 소수점 형식 간에 캐스팅하면 C 잘림 규칙에 따라 숫자 값이 변환됩니다. float 에서 int 로 값을 캐스팅하고 float로 다시 캐스팅하는 것은 대상 데이터 형식의 정밀도에 따라 손실 변환입니다. 다음은 asfloat(DirectX HLSL) , asint(DirectX HLSL), asuint(DirectX HLSL)등의 변환 함수입니다.

HLSL 내재 함수를 사용하여 이진 캐스트를 수행할 수도 있습니다. 이렇게 하면 컴파일러가 숫자의 비트 표현을 대상 데이터 형식으로 재해석합니다.

셰이더 모델 4