DirectX/DirectX 3D_(구)
09_Texture
컴맹학자
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 관련 버퍼 생성부터 정의까지 따로 만들어줘야함