samplerstate의 역할은 해당 텍스쳐에 대한 확대와 축소에 관해 픽셀을 어떻게 보간할지를 정하는 역할을 한다.
즉, 텍스쳐에 적용할 필터링에 필요한 객체이다.
예를 들면, 50x50의 이미지가 있다면, 해당 이미지를 100x100 또는 25x25 의 이미지로 확대 축소 할때, 확대를 한다면 픽셀이 빌것이고, 축소를 한다면 픽셀을 줄여야할 것이다. 이를 어떠한 형식으로 보간할지를 정하는것이다.
void GraphicShader::CreateSamplerState()
{
D3D11_SAMPLER_DESC tDesc = {};
tDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_POINT;
tDesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP;
tDesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP;
tDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP;
tDesc.MipLODBias = 0.0f;
tDesc.MaxAnisotropy = 1;
tDesc.ComparisonFunc = D3D11_COMPARISON_ALWAYS;
tDesc.BorderColor[0] = 0;
tDesc.BorderColor[1] = 0;
tDesc.BorderColor[2] = 0;
tDesc.BorderColor[3] = 0;
tDesc.MinLOD = 0;
tDesc.MaxLOD = D3D11_FLOAT32_MAX;
DEVICE->CreateSamplerState(&tDesc, m_SamplerState.GetAddressOf());
}
CONTEXT->PSSetSamplers(0, 1, m_SamplerState.GetAddressOf());
void GraphicShader::CreateResourceView(wstring& _texturePath)
{
wstring _path = PATH + _texturePath;
ScratchImage _Image;
LoadFromWICFile(_path.c_str(), WIC_FLAGS_NONE, NULL, _Image);
ComPtr<ID3D11Texture2D> _texture;
CreateTexture(DEVICE, _Image.GetImages(), _Image.GetImageCount(), _Image.GetMetadata(), (ID3D11Resource**)_texture.GetAddressOf());
// 쉐이더 리소스 뷰 생성.
D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
::ZeroMemory(&srvDesc, sizeof(srvDesc));
srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
srvDesc.Texture2D.MostDetailedMip = 0;
srvDesc.Texture2D.MipLevels = 1;
D3D11_TEXTURE2D_DESC textureDesc;
_texture->GetDesc(&textureDesc);
srvDesc.Format = textureDesc.Format;
ID3D11ShaderResourceView* shaderResourceView;
DEVICE->CreateShaderResourceView(
_texture.Get(),
&srvDesc,
m_ResourceView.GetAddressOf()
);
}
CONTEXT->PSSetShaderResources(0, 1, m_ResourceView.GetAddressOf());
전에는 DEVICE->CreateTextureFromFile()이라는 method를 사용했는데, windows8 이후에는 D3DXmethod를 더 이상 지원하지 않음
그래서 DirectTex library(정적 라이브러리)안에 LoadFromXXXFile() method and CreateShaderResourceView 또는 DirecXTK(동적 라이브러리)안에 CreateXXXTextureFromFile를 사용한다.
void GraphicShader::CreateBlendState()
{
D3D11_BLEND_DESC tDesc = {};
tDesc.RenderTarget[0].BlendEnable = true;
tDesc.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;
tDesc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_ZERO;
tDesc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_ZERO;
tDesc.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD;
tDesc.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD;
tDesc.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA;
tDesc.RenderTarget[0].DestBlend = D3D11_BLEND_INV_SRC_ALPHA;
DEVICE->CreateBlendState(&tDesc, m_BlendState.GetAddressOf());
}
CONTEXT->OMSetBlendState(m_BlendState.Get(), NULL, 0x3FF);