DX11 2D Game Programming

DX11_2020_0716_목_Framework

HI2 2020. 7. 13. 19:10

 

200716_DX11_Framework.zip
1.98MB

1. Device class

  a. Clear() 함수에서 clearColor를 멤버변수로 사용

    -> 멤버변수는 생성자에서 SetClearColor()로 설정

더보기
Device::Device(HWND hWnd)
	:hWnd(hWnd)
{
	// 이전코드 생략
	SetClearColor();
}

void Device::SetClearColor()
{
	float tmpColor[4] = { 0.0f, 0.125f, 0.3f, 1.0f };
	copy(tmpColor, tmpColor + 4, clearColor);
}

void Device::Clear()
{
	deviceContext->ClearRenderTargetView(renderTargetView, clearColor);
}

 

1. Program class

  a. Init() 함수로 ShaderManager(싱글톤) 생성

    -> Get으로 접근할때 생성 & Init() 으로 초기화

더보기
Program::Program()
{
	if (Init() == false)
		return;
	// 이하 코드 생략
}

bool Program::Init()
{ // Initialize Singletons
	if (SM->Init() == false)
		return false;
	//
	return true;
}

 

2. ShaderManager class(Singleton)

  a. Init() 함수에서 vertexShader, pixelShader 생성

  b. 각 Shader 생성 여부 확인하여 bool값 return

  c. Set() 함수로 DeviceContext에 Shader 세팅

    -> 추후 적용할 Shader 변경시 함수에 인자 추가하여 셰이더 선택

더보기
class ShaderManager
{
private:
	static ShaderManager* instance;
	VertexShader* vertexShader;
	PixelShader* pixelShader;

private:
	ShaderManager();
	~ShaderManager();
	//
public:
	static ShaderManager* Get()
	{
		if (instance == nullptr)
			instance = new ShaderManager;
		return instance;
	}
	static void Destroy()
	{
		delete instance;
		instance = nullptr;
	}
	//
	bool Init();
	//
	VertexShader* GetVS() { return vertexShader; }
	PixelShader* GetPS() { return pixelShader; }
	//
	void Set();
};
//////////////////////////////////////////////////////////////////////////////////////////
#include "Framework.h"
#include "ShaderManager.h"

ShaderManager* ShaderManager::instance = nullptr;

ShaderManager::ShaderManager()
	:vertexShader(nullptr), pixelShader(nullptr)
{
}

ShaderManager::~ShaderManager()
{
	delete vertexShader;
	vertexShader = nullptr;
	//
	delete pixelShader;
	pixelShader = nullptr;
}

bool ShaderManager::Init()
{
	vertexShader	= new VertexShader(L"Shaders/VertexShader.hlsl");
	if(vertexShader == nullptr)
		return false;
	//
	pixelShader		= new PixelShader(L"Shaders/TextureShader.hlsl");
	if(pixelShader == nullptr)
		return false;

	return true;
}

void ShaderManager::Set()
{
	// Shader 종류 추가시 수정
	vertexShader->Set();
	pixelShader->Set();
}

 

3. Texture class

  a. 생성자 내부 코드 함수화

  b. SetVertices()

    -> 인자로 XMVECTOR4를 받아 vertex 할당( x : left, y : top, z : right, w : bottom)

  c. SetIndices()

  d. Render() 에서 ShaderManager를 통해 PixelShader, VertexShader에 접근하여 Shader Set

더보기
#pragma once

class Texture
{
private:
	VertexBuffer* vertexBuffer;
	IndexBuffer* indexBuffer;
	//
	vector<Vertex> vertices;
	vector<UINT> indices;
	//
	ID3D11ShaderResourceView* shaderResourceView;
	ID3D11SamplerState* samplerState;
	//

public:
	Texture(wstring file, XMFLOAT4 tmp);
	~Texture();
	//
	void Render();
	//
	void SetVertices();
	void SetVertices(XMFLOAT4 tmp);
	void SetIndices();
	void CreateBuffer();
	void SetImageAndCreateShaderResourceView(wstring file);
	void SetSamplerDescAndCreateSamplerState();
	//
	void ReleaseMemory(); // 소멸자에서 실행 or 수동으로 메모리 초기화
};
//////////////////////////////////////////////////////////////////////////////////////////
#include "Framework.h"
#include "Texture.h"

Texture::Texture(wstring file, XMFLOAT4 tmp)
	: vertexBuffer(nullptr), indexBuffer(nullptr),
	shaderResourceView(nullptr), samplerState(nullptr)
{
	SetVertices(tmp);
	SetIndices();
	CreateBuffer();
	//
	SetImageAndCreateShaderResourceView(file);
	SetSamplerDescAndCreateSamplerState();
}

Texture::~Texture()
{
	ReleaseMemory();
}

void Texture::Render()
{
	vertexBuffer->Set();
	indexBuffer->Set();
	// Set Vertex Picking Mode
	DC->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
	// Set ShaderResource
	DC->PSSetShaderResources(0, 1, &shaderResourceView);
	// Set Sampler
	DC->PSSetSamplers(0, 1, &samplerState);
	// Set Shader
	SM->Set();
	// Draw by Index
	DC->DrawIndexed(indices.size(), 0, 0);
}

void Texture::SetVertices(XMFLOAT4 tmp)
{
	// tmp.x : left,  tmp.y : top,  tmp.z : right,  tmp.w : bottom, 
	vertices.resize(4);
	vertices[0].uv = { 0,0 };
	vertices[1].uv = { 1,0 };
	vertices[2].uv = { 0,1 };
	vertices[3].uv = { 1,1 };
	// LT
	vertices[0].pos = { tmp.x, tmp.y, 0.0f };
	// RT
	vertices[1].pos = { tmp.z, tmp.y, 0.0f };
	// LB
	vertices[2].pos = { tmp.x, tmp.w, 0.0f };
	// RB
	vertices[3].pos = { tmp.z, tmp.w, 0.0f };
}

void Texture::SetIndices()
{
	indices.emplace_back(0);
	indices.emplace_back(1);
	indices.emplace_back(2);
	//
	indices.emplace_back(2);
	indices.emplace_back(1);
	indices.emplace_back(3);
}

void Texture::CreateBuffer()
{
	vertexBuffer = new VertexBuffer(vertices.data(), sizeof(Vertex), vertices.size());
	indexBuffer = new IndexBuffer(indices.data(), indices.size());
}

void Texture::SetImageAndCreateShaderResourceView(wstring file)
{
	ScratchImage image;
	LoadFromWICFile(file.c_str(), WIC_FLAGS_NONE, nullptr, image);

	CreateShaderResourceView(DEVICE, image.GetImages(), image.GetImageCount(),
		image.GetMetadata(), &shaderResourceView);
}

void Texture::SetSamplerDescAndCreateSamplerState()
{
	D3D11_SAMPLER_DESC sampDesc{};
	sampDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_POINT;
	sampDesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP;
	sampDesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP;
	sampDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP;
	sampDesc.ComparisonFunc = D3D11_COMPARISON_NEVER;
	sampDesc.MinLOD = 0;
	sampDesc.MaxLOD = D3D11_FLOAT32_MAX;
	//
	DEVICE->CreateSamplerState(&sampDesc, &samplerState);
}

void Texture::ReleaseMemory()
{
	delete vertexBuffer;
	vertexBuffer = nullptr;
	//
	delete indexBuffer;
	indexBuffer = nullptr;
	//
	shaderResourceView->Release();
	shaderResourceView = nullptr;
	//
	samplerState->Release();
	samplerState = nullptr;
}

 

4. TutorialScene

더보기
TutorialScene::TutorialScene()
{
	XMFLOAT4 tmp{}; // x(left), y(top), z(right), w(bottom)
	//
	tmp = { -1, 1, 1, -1 };
	bg = new Texture(L"Textures/bg.png", tmp);
	//
	tmp = { -0.5, 0.5, 0.5, -0.5 };
	player = new Texture(L"Textures/player.png", tmp);
}

TutorialScene::~TutorialScene()
{
	delete bg;
	bg = nullptr;
	
	delete player;
	player = nullptr;
}

void TutorialScene::Render()
{
	bg->Render();
	player->Render();
}

 

5. DirectXTex.inl // enum class 관련 warning 무시

-> #pragma warning(disable : 26812)

 

6. 실행 결과