컴맹학자 2021. 6. 30. 21:34
728x90

TextureDemo.cpp, h

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

void TextureDemo::Initialize()
{
	Context::Get()->GetCamera()->RotationDegree(0, 0, 0);
	Context::Get()->GetCamera()->Position(0, 0, -5);
	
	//카메라 속도 재셋팅
	//dynamic_cast<Freedom*>(Context::Get()->GetCamera())->Speed(5);
	((Freedom*)Context::Get()->GetCamera())->Speed(5);

	shader = new Shader(L"09_Texture.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, 1);
	vertices[1].Uv = Vector2(0, 0);
	vertices[2].Uv = Vector2(1, 1);
	vertices[3].Uv = Vector2(1, 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 TextureDemo::Destroy()
{
	SafeDelete(shader);
	SafeDelete(texture);

	SafeRelease(vertexBuffer);
	SafeRelease(indexBuffer);
}

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


	Matrix world;
	D3DXMatrixIdentity(&world);

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

void TextureDemo::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, 0, 6);
}

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

}

 

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

class TextureDemo : 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;
};

//Texture 그리는 핵심
/*
1. UV
2. SRV
3. Sample
*/

09_Texture.fx

더보기
matrix World, View, Projection;

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

Texture2D DiffuseMap;
SamplerState Samp;
float4 PS(VertexOutput input) : SV_Target
{
    return DiffuseMap.Sample(Samp, input.Uv);
}

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

실행

 


1. cpp에 Texture2D 관련으로 버퍼 생성 코드가 없음

2. Framework안에 Renders -> Texture.cpp에 Texture2D 생성 및 관리 클래스가 따로 있음

3. 만약 따라할려면 Texture2D 관련 버퍼 생성부터 정의까지 따로 만들어줘야함