2010-08-07 8 views
1

셰이더 모델 2.0에서는 256 개의 상수 레지스터를 사용할 수 있습니다. 나는 다양한 쉐이더를보고 무엇이 단일 레지스터를 구성하는지 알아 내려고 노력하고 있습니까?HLSL에서 어떻게 레지스터를 계산합니까?

예를 들어, 내 인스 턴싱 쉐이더에서, 나는 다음과 같은 변수는 함수의 외부 상단에 선언 :

float4x4 InstanceTransforms[40]; 
float4 InstanceDiffuses[40]; 

float4x4 View; 
float4x4 Projection; 

float3 LightDirection = normalize(float3(-1, -1, -1)); 
float3 DiffuseLight = 1; 
float3 AmbientLight = 0.66; 

float Alpha; 

texture Texture; 

얼마나 많은 레지스터 내가 소비 한? 어떻게 계산합니까?

답변

4

각 상수 레지스터는 float4입니다.

float3, float2float은 각각 전체 레지스터를 할당합니다. float4x4은 4 개의 레지스터를 사용합니다. 배열은 요소 수만큼 할당 된 레지스터의 수를 단순히 곱합니다. 그리고 컴파일러는 여러 계산에서 상수로 사용할 레지스터 몇 개를 할당 할 것입니다.

쉐이더가 실제로 무엇을 사용 하는지를 알려주는 유일한 방법은 그것을 분해하는 것입니다. 이를 위해 나는 잠시 전에 물었던이 질문에 흥미가있을 수 있습니다. HLSL: Enforce Constant Register Limit at Compile Time

당신은이 모양을 볼 가치가 있습니다 : HLSL: Index to unaligned/packed floats. 그것은 40 float의 배열이 40 개의 레지스터를 사용하는 이유와 어떻게 10을 대신 사용할 수 있는지 설명합니다.

귀하의 texture은 상수 레지스터가 아닌 텍스처 샘플러 (귀하는 16 개가 있습니다)를 사용합니다.

참고로 다음은 ps_2_0 registersvs_2_0 registers의 목록입니다.

+0

내 픽셀 쉐이더에는 float []라는 커널이 있습니다. 이 배열의 길이를 늘리면 사용되는 레지스터가 증가합니다. 루프에서 if (kernel [i]! = 0)를 사용하면 사용되는 레지스터도 비약적으로 증가합니다. 왜이게 될지 아십니까? – Darkhydro

관련 문제