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 공간을 처리할 수 있다.

 

Mipmap 보충설명

 

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;
}

 

 


더 자세한 내용이 궁금하시다면 직접 들어보시는 걸 추천드립니다!

 

Comments