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)