Texturing
카테고리: Graphics
태그: DirectX
홍정모님의 그래픽스 새싹코스 강의를 듣고 정리한 내용입니다.
🐥 Texture
// Declare
ComPtr<ID3D11Texture2D> m_texture;
ComPtr<ID3D11ShaderResourceView> m_textureResourceView;
// Create
AppBase::CreateTexture("crate2_diffuse.png", m_texture,
m_textureResourceView);
// Send to Pixel Shader
ID3D11ShaderResourceView *pixelResources[1] = {m_textureResourceView.Get()};
m_context->PSSetShaderResources(0, 1, pixelResources);
- ID3D11ShaderResourceView : Texture를 shader의 resource view로 사용
- 하나의 shader에서 render target view에 그린 후 다른 shader에서 resource view로 받아 오는 경우도 존재
- 일반적으로 여러 개의 texture를 사용하기 때문에 포인터로 한 번에 보내줌
🐥 hlsl
// Declare
ComPtr<ID3D11SamplerState> m_samplerState;
D3D11_SAMPLER_DESC sampDesc;
ZeroMemory(&sampDesc, sizeof(sampDesc));
sampDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;
sampDesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP;
sampDesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP;
sampDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP;
sampDesc.ComparisonFunc = D3D11_COMPARISON_NEVER;
sampDesc.MinLOD = 0;
sampDesc.MaxLOD = D3D11_FLOAT32_MAX;
// Create
m_device->CreateSamplerState(&sampDesc, m_samplerState.GetAddressOf());
// Send to Pixel Shader
m_context->PSSetSamplers(0, 1, m_samplerState.GetAddressOf());
- Shaer에서 Texture를 사용할 경우 Sampler도 함께 지정해야 함
- Filter : interpolation 어떻게 할지
- Adress U/V/W : texcoord 0~1 넘어가면 어떻게 처리할지 (3차원)
- Comparison : MipMap간 비교 연산
Address U/V/W
CLAMP | WRAP | MIRROR |
---|---|---|
🐥 Pixel Shader
// texture, sampler 받아오기
Texture2D g_texture0 : register(t0);
SamplerState g_sampler : register(s0);
float4 main(PixelShaderInput input) : SV_TARGET {
return = g_texture0.Sample(g_sampler, input.texcoord + float2(xSplit, 0.0));
}
xSplit | ySplit |
---|---|
조명 효과 내기
float4 main(PixelShaderInput input) : SV_TARGET {
float x = input.texcoord.x;
float y = input.texcoord.y;
float f = (x - 0.5 - xSplit) * (x - 0.5 - xSplit) +
(y - 0.5) * (y - 0.5) -
0.3 * 0.3;
float4 color = g_texture0.Sample(g_sampler, input.texcoord);
if (f < 0.0)
return color * 1.5;
else
return color * 0.3;
}
Texture 2개 사용
float4 main(PixelShaderInput input) : SV_TARGET {
return input.texcoord.x > xSplit
? g_texture0.Sample(g_sampler, input.texcoord)
: g_texture1.Sample(g_sampler, input.texcoord);
}
댓글 남기기