Register에 텍스쳐 할당하기
텍스쳐 사용에 있어서 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() 를 나중에 호출하면 제대로 동작하지 않을 수 있다. 쉐이더 내에서 설정한 값으로 다시 재설정되어 그런 듯.