DirectX/DirectX 3D_(구)

10_Sampler

컴맹학자 2021. 7. 2. 21:32
728x90

TextureSamplerDemo.cpp, h

 

더보기
#include "stdafx.h"
#include "TextureSamplerDemo.h"

void TextureSamplerDemo::Initialize()
{
	Context::Get()->GetCamera()->RotationDegree(0, 0, 0);
	Context::Get()->GetCamera()->Position(0, 0, -5);
	((Freedom*)Context::Get()->GetCamera())->Speed(5);

	shader = new Shader(L"10_Sampler.fxo");
	vertices = new Vertex[4];

	vertices[0].Position = Vector3(-0.5f, -0.5f, 0.0f);
	vertices[1].Position = Vector3(-0.5f, +0.5f, 0.0f);
	vertices[2].Position = Vector3(+0.5f, -0.5f, 0.0f);
	vertices[3].Position = Vector3(+0.5f, +0.5f, 0.0f);

	vertices[0].Uv = Vector2(0, 2);
	vertices[1].Uv = Vector2(0, 0);
	vertices[2].Uv = Vector2(2, 2);
	vertices[3].Uv = Vector2(2, 0);

	//Create VertexBuffer
	{
		D3D11_BUFFER_DESC desc;
		ZeroMemory(&desc, sizeof(D3D11_BUFFER_DESC));
		desc.ByteWidth = sizeof(Vertex) * 4;
		desc.BindFlags = D3D11_BIND_VERTEX_BUFFER;

		D3D11_SUBRESOURCE_DATA data = { 0 };
		data.pSysMem = vertices;

		Check(D3D::GetDevice()->CreateBuffer(&desc, &data, &vertexBuffer));
	}

	indices = new UINT[6]{ 0, 1, 2, 2, 1, 3 };

	//Create IndexBuffer
	{
		D3D11_BUFFER_DESC desc;
		ZeroMemory(&desc, sizeof(D3D11_BUFFER_DESC));
		desc.ByteWidth = sizeof(UINT) * 6;
		desc.BindFlags = D3D11_BIND_INDEX_BUFFER;

		D3D11_SUBRESOURCE_DATA data = { 0 };
		data.pSysMem = indices;

		Check(D3D::GetDevice()->CreateBuffer(&desc, &data, &indexBuffer));
	}

	SafeDelete(vertices);
	SafeDelete(indices);

	texture = new Texture(L"Box.png");
}

void TextureSamplerDemo::Destroy()
{
	SafeDelete(shader);
	SafeDelete(texture);

	SafeRelease(vertexBuffer);
	SafeRelease(indexBuffer);
}

void TextureSamplerDemo::Update()
{
	//Open FileDialog
	if (ImGui::Button("Load Texture"))
	{
		function<void(wstring)> f = bind(&TextureSamplerDemo::LoadTexture, this, placeholders::_1); //중요
		Path::OpenFileDialog(L"", Path::ImageFilter, L"../../_Textures/", f, D3D::GetDesc().Handle);
	};

	//SamplerState Filter Test
	{
		static UINT Filter = 0;
		ImGui::InputInt("Filter", (int*)&Filter);
		Filter %= 2;
		shader->AsScalar("Filter")->SetInt(Filter);
	}

	//SamplerState Address Test
	{
		static UINT Address = 0;
		ImGui::InputInt("Addres", (int*)&Address);
		Address %= 4;
		shader->AsScalar("Addres")->SetInt(Address);
	}
	
	Matrix world;
	D3DXMatrixIdentity(&world);

	shader->AsMatrix("World")->SetMatrix(world);
	shader->AsMatrix("View")->SetMatrix(Context::Get()->View());
	shader->AsMatrix("Projection")->SetMatrix(Context::Get()->Projection());
}

void TextureSamplerDemo::Render()
{
	UINT stride = sizeof(Vertex);
	UINT offset = 0;

	D3D::GetDC()->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
	D3D::GetDC()->IASetVertexBuffers(0, 1, &vertexBuffer, &stride, &offset);
	D3D::GetDC()->IASetIndexBuffer(indexBuffer, DXGI_FORMAT_R32_UINT, 0);

	//Texture 정보를 hlsl에 넘겨줌
	shader->AsSRV("DiffuseMap")->SetResource(texture->SRV());

	shader->DrawIndexed(0, 1, 6);
}

void TextureSamplerDemo::LoadTexture(wstring name)
{
	SafeDelete(texture);
	texture = new Texture(name);

	/* C++에서 보내는 방식
	ID3D11SamplerState* state;
	D3D11_SAMPLER_DESC desc;
	desc.AddressU = 0;
	D3D::GetDevice()->CreateSamplerState(&desc, &state);
	shader->AsSampler("Samp")->SetSampler(0, state);
	*/
}

 

#pragma once
#include "Systems/IExecute.h"

class TextureSamplerDemo : public IExecute
{
public:
	virtual void Initialize() override;
	virtual void Destroy() override;
	virtual void Update() override;
	virtual void PreRender() override {};
	virtual void Render() override;
	virtual void PostRender() override {};
	virtual void ResizeScreen() override {};

private:
	struct Vertex
	{
		Vector3 Position;
		Vector2 Uv;
	};

private:
	void LoadTexture(wstring name); 

private:
	Shader* shader;

	Vertex* vertices;
	ID3D11Buffer* vertexBuffer;

	UINT* indices;
	ID3D11Buffer* indexBuffer;

	Texture* texture = NULL;
};

10_Sampler.fx

더보기
matrix World, View, Projection;
Texture2D DiffuseMap;

struct VertexInput
{
    float4 Position : Position;
    float2 Uv : Uv;
};

struct VertexOutput
{
    float4 Position : SV_Position;
    float2 Uv : Uv;
};

VertexOutput VS(VertexInput input)
{
    VertexOutput output;
    output.Position = mul(input.Position, World);
    output.Position = mul(output.Position, View);
    output.Position = mul(output.Position, Projection);
        
    output.Uv = input.Uv;

    return output;
}

//SamplerState(Filter)
SamplerState PointSampler{ Filter = MIN_MAG_MIP_POINT; };
SamplerState LinearSampler{ Filter = MIN_MAG_MIP_LINEAR; };

//Imgui통해서 Sampler 조절
uint Filter;
float4 PS_Filter(VertexOutput input) : SV_Target
{
    if (Filter == 0)
        return DiffuseMap.Sample(PointSampler, input.Uv);
     
    return DiffuseMap.Sample(LinearSampler, input.Uv);
}

//SamplerState(ADDRESS)
SamplerState WarpSampler //복사
{
    AddressU = WRAP;
    AddressV = WRAP;
};

SamplerState MirrorSampler //거울복사
{
    AddressU = MIRROR;
    AddressV = MIRROR;
};

SamplerState ClampSampler //마지막 픽셀로 출력
{
    AddressU = CLAMP;
    AddressV = CLAMP;
};

SamplerState BorderSampler //빈공간 특정색으로 지정해서 출력
{
    AddressU = BORDER;
    AddressV = BORDER;

    BorderColor = float4(0, 0, 1, 1);
};

uint Addres;
float4 PS_Address(VertexOutput input) : SV_Target
{
    if (Addres == 0)  return DiffuseMap.Sample(WarpSampler, input.Uv);
    if (Addres == 1)  return DiffuseMap.Sample(MirrorSampler, input.Uv);
    if (Addres == 2)  return DiffuseMap.Sample(ClampSampler, input.Uv);
    if (Addres == 3)  return DiffuseMap.Sample(BorderSampler, input.Uv);
     
    return DiffuseMap.Sample(PointSampler, input.Uv);
}



technique11 T0
{
    pass P0
    {
        SetVertexShader(CompileShader(vs_5_0, VS()));
        SetPixelShader(CompileShader(ps_5_0, PS_Filter()));
    }

    pass P1
    {
        SetVertexShader(CompileShader(vs_5_0, VS()));
        SetPixelShader(CompileShader(ps_5_0, PS_Address()));
    }
}

실행

 


Sampler 구조체

더보기

여기서 Filter 옵션

 

공통 :

MIN : 축소

MAG : 확대

사용 모드 :

POINT : 인접 픽셀을 복사해서 축소 및 확대 했을때 빈공간을 채움

LINEAR : 인접 픽셀의 선형보간 해서 축소 및 확대 했을때 빈공간을 채움 

 

POINT 방식은 선명한 대식 확대하면 도트형식으로

LINEAR 방식은 부드럽지만 주변 확대하면 흐림 형식으로

 

기본적인 Sampler 구조체 기본값


Sampler에서 발달한 기술이 FXAA , SMAA 이고 대각선 처리기법 관련이고 D3D11_FILTER_ANISOTROPIC를 사용

추후 COMPARISON(깊이)를 이용해서 그림자 기법 사용할때 사용

'DirectX > DirectX 3D_(구)' 카테고리의 다른 글

12_Normal [1/2]  (0) 2021.07.03
11_Terrain  (0) 2021.07.02
09_Texture  (0) 2021.06.30
08_Cube  (0) 2021.06.30
07_Camera  (0) 2021.06.30