Share via


셰이더 모델 3(HLSL 참조)

꼭짓점 셰이더 및 픽셀 셰이더는 이전 셰이더 버전에 비해 상당히 간소화되었습니다. 하드웨어에서 셰이더를 구현하는 경우 다른 셰이더 버전에서 vs_3_0 또는 ps_3_0을 사용하지 않을 수 있으며 고정 함수 파이프라인에서 셰이더 형식을 사용하지 않을 수 있습니다. 이러한 변경으로 드라이버와 런타임을 간소화할 수 있습니다. 유일한 예외는 모든 픽셀 셰이더 버전에서 소프트웨어 전용 vs_3_0 셰이더를 사용할 수 있다는 점입니다. 또한 이전 픽셀 셰이더 버전에서 소프트웨어 전용 vs_3_0 셰이더를 사용하는 경우 꼭짓점 셰이더는 FVF(Flexible Vertex Format) 코드와 호환되는 출력 시맨틱만 사용할 수 있습니다.

꼭짓점 셰이더 출력에 사용되는 시맨틱은 픽셀 셰이더 입력에서 사용해야 합니다. 시맨틱은 꼭짓점 셰이더 입력 레지스터 및 이전 셰이더 모델에 꼭짓점 선언이 매핑되는 방식과 유사하게 꼭짓점 셰이더 출력을 픽셀 셰이더 입력에 매핑하는 데 사용됩니다. vs 3.0 및 ps 3.0 셰이더에서 시맨틱 일치를 참조하세요.

이 새로운 체계에서는 추가 텍스처 좌표의 가능성을 포함하도록 추가 래핑 모드 렌더링 상태가 추가되었습니다. D3DDECLUSAGE_TEXCOORD 및 사용량 인덱스가 0~15인 특성은 해당 D3DRS_WRAP*가 설정된 경우 래핑 모드로 보간됩니다.

꼭짓점 셰이더 모델 3 기능

꼭짓점 셰이더 출력 레지스터 형식이 12개의 레지스터로 축소되었습니다(출력 레지스터 참조). 사용되는 각 레지스터는 dcl 명령 및 시맨틱(예: o0.xyzw dcl_color0)을 사용하여 선언해야 합니다.

3_0 꼭짓점 셰이더 모델(vs_3_0)은 더 강력한 레지스터 인덱싱, 간소화된 출력 레지스터 집합, 꼭짓점 셰이더에서 텍스처를 샘플링하는 기능 및 셰이더 입력이 초기화되는 속도를 제어하는 기능을 사용하여 vs_2_0의 기능을 확장합니다.

모든 레지스터 인덱싱

모든 레지스터(입력 레지스터출력 레지스터)는 루프 카운터 레지스터를 사용하여 인덱싱할 수 있습니다(이전 버전에서는 상수 레지스터만 인덱싱할 수 있었음).

입출력 레지스터는 인덱싱하기 전에 선언해야 합니다. 그러나 위치 또는 점 크기 시맨틱으로 선언된 출력 레지스터는 인덱싱할 수 없습니다. 실제로 인덱싱이 사용되는 경우 위치와 psize 시맨틱을 각각 o0 및 o1 레지스터에서 선언해야 합니다.

연속 범위의 레지스터만 인덱싱할 수 있습니다. 즉, 선언되지 않은 레지스터 간에는 인덱싱할 수 없습니다. 이 제한은 불편할 수 있지만 하드웨어 최적화가 수행되도록 허용합니다. 인접하지 않은 레지스터 간에 인덱싱을 시도하면 정의되지 않은 결과가 생성됩니다. 셰이더 유효성 검사는 이 제한을 적용하지 않습니다.

출력 레지스터 간소화

다양한 유형의 모든 출력 레지스터가 위치용 1개, 색상용 2개, 텍스처용 8개, 안개 또는 점 크기용 1개, 이렇게 12개의 출력 레지스터로 축소되었습니다. 이러한 레지스터는 픽셀 셰이더에 대해 포함하는 모든 데이터를 보간합니다. 출력 레지스터 선언이 필요하며 각 레지스터에 시맨틱이 할당됩니다.

레지스터는 다음과 같이 구분할 수 있습니다.

  • 하나 이상의 레지스터를 4-구성 요소 위치 레지스터로 선언해야 합니다. 유일하게 필요한 꼭짓점 셰이더 레지스터입니다.
  • 셰이더에서 사용하는 처음 10개의 레지스터는 구성 요소를 최대 4개(xyzw)까지 사용할 수 있습니다.
  • 마지막(또는 열두 번째) 레지스터에는 스칼라(예: 점 크기)만 포함될 수 있습니다.

레지스터 목록은 레지스터 - vs_3_0을 참조하세요.

꼭짓점 셰이더의 텍스처 샘플

꼭짓점 셰이더 3_0은 texldl - vs를 사용하여 꼭짓점 셰이더에서 텍스처 조회를 지원합니다.

픽셀 셰이더 모델 3 기능

픽셀 셰이더 색 및 텍스처 레지스터는 입력 레지스터 10개로 축소되었습니다(입력 레지스터 형식 참조). 면 레지스터는 부동 소수점 스칼라 레지스터입니다. 이 레지스터의 부호만 유효합니다. 부호가 음수이면 기본 형식은 뒷면입니다. 예를 들어 픽셀 셰이더 내에서 양면 조명을 구현하는 데 사용할 수 있습니다. 위치 레지스터는 현재 (x,y) 픽셀을 참조합니다.

셰이더 상수 레지스터는 다음을 사용하여 설정할 수 있습니다.

vs_3_0 및 ps_3_0 셰이더에서 시맨틱 일치

vs_3_0 및 ps_3_0에서 시맨틱 사용에는 몇 가지 제한 사항이 있습니다. 일반적으로 셰이더 출력에 사용되는 시맨틱과 일치하는 시맨틱을 셰이더 입력에 사용할 때는 주의해야 합니다.

예를 들어 다음 픽셀 셰이더는 여러 개의 이름을 레지스터 하나로 압축합니다.

ps_3_0 
dcl_texcoord0 v0.x 
dcl_texcoord1 v0.yz // Valid to pack multiple names into one register 
dcl_texcoord2_centroid v1.w
...

레지스터마다 시맨틱이 다릅니다. 쓰기 마스크를 사용하기 때문에 v0.x 및 v0.yz의 이름을 서로 다른(여러) 시맨틱을 사용하여 지정할 수도 있습니다.

픽셀 셰이더가 지정된 경우 다음 vs_3_0 셰이더는 픽셀 셰이더와 쌍으로 연결할 수 없습니다.

vs_3_0 
... 
dcl_texcoord0 o5.x 
dcl_texcoord1 o6.yzw 
...

이러한 두 셰이더는 D3DDECLUSAGE_TEXCOORD0D3DDECLUSAGE_TEXCOORD1 시맨틱의 사용이 충돌합니다.

시맨틱 충돌을 방지하기 위해 다음과 같이 꼭짓점 셰이더를 다시 작성합니다.

vs_3_0 
... 
dcl_texcoord2 o3 
dcl_texcoord3 o9 
...

마찬가지로 픽셀 셰이더의 다른 입력 레지스터(픽셀 셰이더의 v0 및 v1)에 선언된 의미 체계 이름은 이 꼭짓점 셰이더의 단일 출력 레지스터에서 사용할 수 없습니다. 예를 들어 D3DDECLUSAGE_TEXCOORD1이 픽셀 셰이더 입력 레지스터(v0, v1) 및 꼭짓점 셰이더 출력 레지스터 o3 둘 다에 사용되므로 이 꼭짓점 셰이더는 픽셀 셰이더와 쌍으로 연결할 수 없습니다.

vs_3_0 
... 
dcl_texcoord0 o3.x 
dcl_texcoord1 o3.yz 

dcl_texcoord2 o3.w // BAD! Would be valid if this were not o3 
dcl_texcoord3 o9 ... 

반면에 지정된 시맨틱을 사용하는 매개 변수의 출력 마스크는 픽셀 셰이더에서 요청한 데이터를 제공하지 않으므로 이 꼭짓점 셰이더를 픽셀 셰이더와 쌍으로 연결할 수 없습니다.

vs_3_0 
... 
dcl_texcoord0 o5.x 
dcl_texcoord1 o5.yzw 
dcl_texcoord2 o7.yz // BAD! Would be valid if w were included 
dcl_texcoord3 o9 
... 

이 꼭짓점 셰이더는 픽셀 셰이더에서 요청한 의미 체계 이름 중 하나를 사용하여 출력을 제공하지 않으므로 셰이더 쌍 연결이 잘못되었습니다.

vs_3_0 
... 
dcl_texcoord0 o5.x 
dcl_texcoord1 o5.yzw 
dcl_texcoord3 o9 
// The pixel shader wants texcoord2, with a w component, 
// but it isn't output by this vertex shader at all! 
... 

안개, 깊이 및 음영 모드 변경

클리핑 및 삼각형 래스터화 중에 플랫 음영을 위해 D3DRS_SHADEMODE가 설정된 경우 D3DDECLUSAGE_COLOR 있는 특성은 플랫 음영으로 보간됩니다. 레지스터의 구성 요소가 색 시맨틱으로 선언되었지만 동일한 레지스터의 다른 구성 요소에 다른 시맨틱이 주어지면 플랫 음영 보간(선형 대 플랫)은 색 시맨틱 없이 해당 레지스터의 구성 요소에 정의되지 않습니다.

안개 렌더링이 필요한 경우 vs_3_0 및 ps_3_0 셰이더가 안개를 구현해야 합니다. 셰이더 외부에서는 안개 계산이 수행되지 않습니다. vs_3_0에는 안개 레지스터가 없으며, 추가 시맨틱 D3DDECLUSAGE_FOG(꼭짓점당 계산된 안개 혼합 계수용) 및 D3DDECLUSAGE_DEPTH(깊이 값을 픽셀 셰이더에 전달하여 안개 혼합 계수 계산용)가 추가되었습니다.

픽셀 셰이더 3.0을 사용하는 경우 텍스처 스테이지 상태 D3DTSS_TEXCOORDINDEX가 무시됩니다.

이러한 변경 내용을 수용하기 위해 다음 값이 추가되었습니다.

// Fog and Depth usages
D3DDECLUSAGE_FOG 
D3DDECLUSAGE_DEPTH 

// Additional wrap states for vs_3_0 attributes with D3DDECLUSAGE_TEXCOORD 
D3DRS_WRAP8 
D3DRS_WRAP9 
D3DRS_WRAP10 
D3DRS_WRAP11 
D3DRS_WRAP12 
D3DRS_WRAP13 
D3DRS_WRAP14 
D3DRS_WRAP15

부동 소수점 및 정수 변환

부동 소수점 수학은 파이프라인의 여러 부분에서 서로 다른 정밀도 및 범위(16비트, 24비트 및 32비트)에서 발생합니다. 해당 파이프라인에 들어가는 파이프라인의 동적 범위보다 큰 값은(예: ps_2_0에서 32비트 float 텍스처 맵이 24비트 float 파이프라인으로 샘플링됨) 정의되지 않은 결과를 생성합니다. 예측 가능한 동작의 경우 이러한 값을 동적 범위 최댓값으로 고정해야 합니다.

부동 소수점 값에서 정수로의 변환은 다음과 같은 여러 경우에 발생합니다.

  • mova - vs 명령이 발생하는 경우
  • 텍스처 주소 지정 중
  • 부동 소수점이 아닌 렌더링 대상에 쓰는 경우

전체 또는 부분 정밀도를 지정하는 경우

ps_3_0 및 ps_2_x 모두 다음 두 가지 수준의 정밀도를 지원합니다.

ps_3_0 ps_2_0 전체 자릿수
x 전체 fp32 이상
x 부분 정밀도 fp16=s10e5
x x 전체 fp24=s16e7 이상
x x 부분 정밀도 fp16=s10e5

 

ps_3_0은 ps_2_0보다 더 확실하게 정밀도를 지원합니다. 기본적으로 모든 작업은 전체 정밀도 수준에서 발생합니다.

부분 정밀도(픽셀 셰이더 레지스터 한정자 참조)는 셰이더 코드에 _pp 한정자를 추가하여 요청됩니다(기본 구현에서 지원하는 경우). 구현은 항상 한정자를 무시하고 영향을 받는 작업을 전체 정밀도로 수행할 수 있습니다.

_pp 한정자는 다음 두 가지 컨텍스트에서 발생할 수 있습니다.

  • 부분 정밀도 텍스처 좌표를 픽셀 셰이더로 전달하기 위한 텍스처 좌표 선언에서. 이는 텍스처 좌표를 사용하여 색상 데이터를 픽셀 셰이더에 전달할 수 있는데, 일부 구현에서는 완전 정밀도보다 부분 정밀도가 더 빠를 수 있습니다.
  • 텍스처 로드 명령을 포함하여 부분 정밀도 사용을 요청하는 모든 명령에서. 이는 구현이 부분 정밀도로 명령을 실행하고 부분 정밀도 결과를 저장할 수 있음을 나타냅니다. 명시적 한정자가 없으면 명령은 (입력 피연산자의 정밀도에 관계없이) 전체 정밀도로 수행되어야 합니다.

애플리케이션은 성능을 위해 정밀도를 상쇄하도록 의도적으로 선택할 수 있습니다. 부분 정밀도 처리를 위한 자연스러운 후보인 여러 종류의 셰이더 입력 데이터가 있습니다.

  • 색 반복기는 부분 정밀도 값으로 잘 표시됩니다.
  • 대부분의 형식의 텍스처 값은 부분 정밀도 값으로 정확하게 나타낼 수 있습니다(32비트 부동 소수점 형식 텍스처에서 샘플링된 값은 명백한 예외임).
  • 상수는 셰이더에 적절하게 부분 정밀도 표현으로 표시될 수 있습니다.

이러한 모든 경우 개발자는 입력 데이터 정밀도 손실이 없다는 점을 알고 데이터 처리에 부분 정밀도를 지정하도록 선택할 수 있습니다. 경우에 따라 셰이더는 입력 및 최종 출력 값이 부분 정밀도를 초과하지 않는데도 계산의 내부 단계를 전체 정밀도로 수행해야 할 수 있습니다.

소프트웨어 꼭짓점 및 픽셀 셰이더

버전 2_0 셰이더 이상의 소프트웨어 구현(꼭짓점 셰이더에 대한 런타임 및 참조와 픽셀 셰이더에 대한 참조)에서는 몇 가지 유효성 검사가 완화되었습니다. 디버깅 및 프로토타입 생성 용도에 유용합니다. 애플리케이션은 런타임/어셈블러에 어셈블러(예: vs_2_sw)에서 _sw 플래그를 사용하여 완화된 유효성 검사의 일부가 필요함을 나타냅니다. 소프트웨어 셰이더는 하드웨어에서는 작동하지 않습니다.

vs_2_sw는 vs_2_x의 상한까지의 완화되었으며 마찬가지로, ps_2_sw는 ps_2_x의 상한까지 완화되었습니다. 특히 다음 유효성 검사가 완화되었습니다.

셰이더 모델 리소스 제한
vs_2_sw, vs_3_sw, ps_2_sw, ps_3_sw 명령 수 제한 없음
vs_2_sw, vs_3_sw, ps_2_sw, ps_3_sw Float 상수 레지스터 8192
vs_2_sw, vs_3_sw, ps_2_sw, ps_3_sw 정수 상수 레지스터 2048
vs_2_sw, vs_3_sw, ps_2_sw, ps_3_sw 부울 상수 레지스터 2048
ps_2_sw 종속 읽기 깊이 제한 없음
vs_2_sw 흐름 제어 명령 및 레이블 제한 없음
vs_2_sw, vs_3_sw, ps_2_sw, ps_3_sw 루프 시작/단계/개수 rep 및 루프 명령에 대한 반복 시작 및 반복 단계 크기는 부호가 있는 32비트 정수입니다. 개수는 최대 MAX_INT/64일 수 있습니다.
vs_2_sw, vs_3_sw, ps_2_sw, ps_3_sw 포트 제한 모든 레지스터 파일에 대한 포트 제한이 완화됩니다.
vs_3_sw 보간 수 vs_3_sw의 출력 레지스터 16개입니다.
ps_3_sw 보간 수 ps_3_sw에 대한 입력 레지스터 14(16-2)개입니다.

 

셰이더 모델 3(DirectX HLSL)