KoreanFoodie's Study
DirectX 11 2D 게임 프로그래밍 - 15. UV 좌표 조작과 Sampler State설정 본문
Game Dev/DirectX
DirectX 11 2D 게임 프로그래밍 - 15. UV 좌표 조작과 Sampler State설정
GoldGiver 2021. 11. 4. 08:45
DirectX 11 2D 게임 프로그래밍 - 15. UV 좌표 조작과 Sampler State설정
UV 좌표 조작하기
- UV 좌표를 임의로 늘릴 순 있지만, 픽셀 데이터를 추출할 때는 반드시 0~1 범위로 맞춰야 한다.
Sampler State 설정과 세팅하기
- Filter에서는 세 가지만 기억 MIN - 축소, Mag - 확대, MIP - 밉맵
- Point에서는 끊어지는 듯한 이미지, Linear는 부드러운 이미지를 얻을 수 있다.
- CLAMP, WRAP 등의 Address Mode를 활용하여 확장된 UV 공간을 처리할 수 있다.
Execute.cpp
Sampler State를 설정해 주자.
//Create Sampler State
{
D3D11_SAMPLER_DESC desc;
ZeroMemory(&desc, sizeof(D3D11_SAMPLER_DESC));
desc.AddressU = D3D11_TEXTURE_ADDRESS_MIRROR_ONCE;
desc.AddressV = D3D11_TEXTURE_ADDRESS_MIRROR_ONCE;
desc.AddressW = D3D11_TEXTURE_ADDRESS_MIRROR_ONCE;
desc.BorderColor[0] = 1;
desc.BorderColor[1] = 0;
desc.BorderColor[2] = 0;
desc.BorderColor[3] = 1;
desc.ComparisonFunc = D3D11_COMPARISON_ALWAYS;
desc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;
desc.MaxAnisotropy = 16;
desc.MaxLOD = std::numeric_limits<float>::max();
desc.MinLOD = std::numeric_limits<float>::min();
desc.MipLODBias = 0.0f;
auto hr = graphics->GetDevice()->CreateSamplerState(&desc, &sampler_state);
assert(SUCCEEDED(hr));
}
// Render에서.. 아래 줄 추가
graphics->GetDeviceContext()->PSSetShaderResources(0, 2, shader_resource);
그 후, AddressU/V/W 옵션과 Filter옵션을 바꾸어 주면서 이미지를 조정한다.
필요하다면, Vertex Data의 좌표값들을 바꾸어 이미지를 이동시켜 보자.
//Vertex Data
{
vertices = new VertexTexture[4];
vertices[0].position = D3DXVECTOR3(-0.5f, -0.5f, 0.0f); //0
vertices[0].uv = D3DXVECTOR2(0.0f, 1.0f);
vertices[1].position = D3DXVECTOR3(-0.5f, +0.5f, 0.0f); //1
vertices[1].uv = D3DXVECTOR2(0.0f, 0.0f);
vertices[2].position = D3DXVECTOR3(+0.5f, -0.5f, 0.0f); //2
vertices[2].uv = D3DXVECTOR2(1.0f, 1.0f);
vertices[3].position = D3DXVECTOR3(+0.5f, +0.5f, 0.0f); //3
vertices[3].uv = D3DXVECTOR2(1.0f, 0.0f);
}
// 좌표값들을 1.0f 대신 4.0f로 바꾸면... 그리고 옵션을 WRAP으로 바꾸면?
// 이미지 16개가 바둑판 격자처럼 들어감 (좌표로 한 변의 크기를 결정하는 느낌이네)
Texture.hlsl
Texture.hlsl에서 구체적으로 어떤 녀석을 출력할지를 지정한다.
Texture2D source_texture1 : register(t0);
Texture2D source_texture2 : register(t1); //128 -> 0 ~ 127
SamplerState samp : register(s0); //16 -> 0 ~ 15
float4 PS(PixelInput input) : SV_Target
{
float4 color = 0.0f;
if (input.uv.x < 1.0f)
color = source_texture1.Sample(samp, input.uv);
else
color = source_texture2.Sample(samp, float2(input.uv.x - 1.0f, input.uv.y));
//clip(color.a - 0.9f);
//if(color.a < 0.1f)
// discard;
//float4 color = source_texture1.Sample(samp, input.uv);
return color;
}
더 자세한 내용이 궁금하시다면 직접 들어보시는 걸 추천드립니다!
'Game Dev > DirectX' 카테고리의 다른 글
2. DirectXMath 라이브러리의 행렬 다루기 (0) | 2021.11.15 |
---|---|
1. 벡터의 개념과 DirectXMath 라이브러리의 벡터 (0) | 2021.11.09 |
DirectX 11 2D 게임 프로그래밍 - 14. Texture 설정과 이미지 띄우기 (0) | 2021.11.03 |
DirectX 11 2D 게임 프로그래밍 - 13. Rasterizer state과 좌표계 (0) | 2021.10.31 |
DirectX 11 2D 게임 프로그래밍 - 12. 행렬 결합 : 이동과 회전 (0) | 2021.10.31 |
Comments