DirectX 10

Register에 텍스쳐 할당하기

공대나온남자 2010. 6. 22. 00:11

텍스쳐 사용에 있어서 DX10에서 DX9와 가장 크게 달라진 점은 텍스쳐와 샘플러가 분리되었다는 것이다. DX9에서는 샘플러에 텍스쳐가 포함되어있었기 때문에 텍스쳐 개수만큼 샘플러를 생성해야했지만 DX10에서는 하나의 샘플러를 여러 텍스쳐에 사용할 수 있다.

 

쉐이더 레지스터에 텍스쳐를 할당할 때도 DX9에서는 샘플러 레지스터에 텍스쳐를 할당하는 식이었는데 DX10에서는 텍스쳐와 샘플러를 따로 레지스터에 할당하게 되어있다.

 

예를 들면, DX9에서는

 

app:

device->SetTexture(0, Texture);

device->SetSamplerState(0, ...);

device->SetSamplerState(0, ...);

 

shader:

sampler s0 : register(s0);

...

float4 color = tex2D(s0, texcoord);

 

이런 식으로 사용했었는데, DX10에서는

 

app:

device->PSSetShaderResources(0, 1, &Texture);

device->PSSetSamplers(0, 1, &Sampler);

 

shader:

Texture2D g_tDiffuse :register(t0);

SamplerState g_sampler : register(s0);

...

float4 color=  g_tDiffuse.Sample(g_sampler, texcoord);

 

같은 식으로 사용한다.

 

 DX10에서는 앞에서 얘기한 것과 같이 텍스쳐는  t# 레지스터에, 샘플러는 s# 레지스터에 따로 지정한다. 그리고 API 이름에서 알 수 있듯이 픽셀 쉐이더 뿐만 아니라 다른 쉐이더에 대해서도 텍스쳐와 샘플러를 지정해줄 수 있는 다음과 같은 API가 존재한다.

 

ID3D10Device::VSSetShaderResources

ID3D10Device::VSSetSamplers

ID3D10Device::GSSetShaderResources

ID3D10Device::GSSetSamplers

 

한가지 유의할 점은 SetShaderResources(), SetSamplers() 류의 함수와 ID3D10EffectPass::Apply() 함수를 호출해주는 순서이다. SetShaderResources(), SetSamplers() 류의 함수보다 ID3D10EffectPass::Apply() 를 나중에 호출하면 제대로 동작하지 않을 수 있다. 쉐이더 내에서 설정한 값으로 다시 재설정되어 그런 듯.