다음을 통해 공유


셰이더 모델 3(HLSL 참조)

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

꼭짓점 셰이더 출력에 사용되는 의미 체계는 픽셀 셰이더 입력에 사용해야 합니다. 의미 체계는 꼭짓점 셰이더 입력 레지스터 및 이전 셰이더 모델에 꼭짓점 선언이 매핑되는 방식과 유사하게 꼭짓점 셰이더 출력을 픽셀 셰이더 입력에 매핑하는 데 사용됩니다. 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 및사용하여 꼭짓점 셰이더에서 텍스처 조회를 지원합니다.

픽셀 셰이더 모델 3 기능

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

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

  • SetPixelShaderConstantB
  • setPixelShaderConstantI
  • SetPixelShaderConstantF

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_TEXCOORD0 And D3DDECLUSAGE_TEXCOORD1 의미 체계의 사용과 충돌합니다.

의미 체계 충돌을 방지하려면 다음과 같이 꼭짓점 셰이더를 다시 작성합니다.

vs_3_0 
... 
dcl_texcoord2 o3 
dcl_texcoord3 o9 
...

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

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 24비트 부동 소수 자릿수 파이프라인으로 샘플링된 32비트 float 텍스처 맵)은 정의되지 않은 결과를 만듭니다. 예측 가능한 동작의 경우 이러한 값을 동적 범위 최대값으로 고정해야 합니다.

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

전체 또는 부분 정밀도 지정

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 셰이더 이상의 소프트웨어 구현(꼭짓점 셰이더에 대한 런타임 및 참조 및 픽셀 셰이더에 대한 참조)에는 몇 가지 유효성 검사가 완화되었습니다. 디버깅 및 프로토타입 생성에 유용합니다. 애플리케이션은 런타임/어셈블러에 어셈블러의 _sw 플래그를 사용하여 완화된 유효성 검사의 일부가 필요하다는 것을 나타냅니다(예: vs_2_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 보간기 수 14(16-2) ps_3_sw 대한 입력 레지스터입니다.

 

셰이더 모델 3(DirectX HLSL)