텍스쳐 사용에 있어서 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() 를 나중에 호출하면 제대로 동작하지 않을 수 있다. 쉐이더 내에서 설정한 값으로 다시 재설정되어 그런 듯.
'DirectX 10' 카테고리의 다른 글
텍스쳐 해제 (0) | 2011.06.13 |
---|---|
Rendering to multi window in DX10 (0) | 2011.03.13 |
쉐이더 파일 내에서 Render State 설정 (0) | 2010.11.20 |
텍스쳐 포맷 (0) | 2010.09.29 |
쉐이더 이펙트 생성시 define을 사용했을때 런타임 에러 발생하는 경우 (0) | 2010.09.21 |