[GPG 3 글 4.10] 이 셰이더가 최대 임시 레지스터 갯수 초과한다고 에러 납니다.

GPG 시리즈 관련 질답, 논의 공간.

Moderator: 류광

비회원

이 셰이더가 최대 임시 레지스터 갯수 초과한다고 에러 납니다.

Post by 비회원 »

도와주세요. 아래 셰이더를 이용한 예제 프로그램을 돌리는데

최대 임시 레지스터 갯수 초과한다는 에러가 발생하네요.

꼭 돌리고 이해하고 싶은 프로그램 입니다.

도와주시면 감사하겠습니다.

혹시나 해서 아래


float4x4 m_mtBlnd[128]: WORLDMATRIXARRAY; // Blending Matrix Buffer
을 지우고 하니까 잘 되는데요.

최대 상수레지스터가 다이렉트 9.Xx에서 256으로 알고있거든요. 저걸 어떻게 수정해서
사용할 수 없을까요? 이걸 만드신 분과 제 다이렉트 버전이 틀려서 소소한 문법 차이에서
에러가 나는 거같은데 도와 주시면 감사하겠습니다.

//
// Shader Example.
// Copyleft (c) 2007 Heesung Oh(Galic Studio). All rights Not reserved.
////////////////////////////////////////////////////////////////////////////



sampler smp0:register(s0);
sampler smp1:register(s1);
sampler smp2:register(s2);


float4x4 m_mtWld;
float4x4 m_mtViw;
float4x4 m_mtPrj;

float4x4 m_mtBlnd[128]: WORLDMATRIXARRAY; // Blending Matrix Buffer


float4 VtxProc( float3 Pos : POSITION) : POSITION
{
float4 Pout=0;

Pout = mul(float4(Pos,1), m_mtWld);
Pout = mul(Pout, m_mtViw);
Pout = mul(Pout, m_mtPrj);

return Pout;
}


float4 PxlProc() : COLOR0
{
float4 Out={1.5f, 1.5f, 0.0f, 1.0f};
return Out;
}


struct SVsOut
{
float4 Pos: POSITION;
float2 Tex: TEXCOORD0; // 정점의 텍스처 좌표
float3 Nor: TEXCOORD7; // 정점의 법선 벡터
};


SVsOut VtxBlend(float4 Pos: POSITION // Position
, float4 Wgt: BLENDWEIGHT // Blending Weight
, int4 Idx: BLENDINDICES // Blending Index

, float3 Nor: NORMAL // Normal Vector
, float2 Tex: TEXCOORD0 // Texture Coordinate
)
{
SVsOut Out = (SVsOut)0;

float4 Pout =0.0f;
float4x4 mtW = 0.0f;

float4 Wgx = Wgt;


//////////////////////////////////////////////////////////////////////////
// Vertex Blending

Wgx[3] = 1.0f - (Wgx[0] + Wgx[1] + Wgx[2]);

// ΣMi * Wi 연산
for(int i=0; i<4; ++i)
mtW += Wgx * m_mtBlnd[Idx];


// _44 값이 1에서 멀리 떨어져 있으면 단위행렬로 만든다.
if(mtW._44 <0.001f)
mtW = float4x4(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1);

mtW = mul(mtW, m_mtWld); // 객체의 월드 행렬과 곱셈

Pout = mul(Pos, mtW); // 월드 변환
Pout = mul(Pout, m_mtViw); // 뷰 변환
Pout = mul(Pout, m_mtPrj); // 투영 변한
//
//////////////////////////////////////////////////////////////////////////

Out.Pos = Pout;
Out.Nor = Nor;
Out.Tex = Tex;

return Out;
}



float4 PxlBlend(SVsOut In) : COLOR0
{
float4 Out = tex2D(smp0, In.Tex); // Sampling from Texture by Sampler

return Out;
}


technique Tech
{
pass P0
{
VertexShader = compile vs_2_0 VtxProc();
PixelShader = compile ps_2_0 PxlProc();
}

pass P1
{
VertexShader = compile vs_2_0 VtxBlend();
PixelShader = compile ps_2_0 PxlBlend();
}
};
비회원

Post by 비회원 »

float4x4 는 레지스터 4개짜리입니다. 따라서

float4x4 m_mtBlnd[128]: WORLDMATRIXARRAY; // Blending Matrix Buffer

이건 128 * 4 = 512개 짜리예요..

vs_3_0, ps_3_0 으로 해보시고 그래도 안되면 갯수를 줄여야 할듯하네요.
Post Reply