DirectX/DirectX 2D

DX2D_07 Librarie 및 Utilitie

컴맹학자 2022. 11. 24. 00:39
728x90

기존에 HLSL 파일을 통해서 쉐이더 파일을 썻는데 이게 cpu와 gpu 연결 시키는 layoutDesc 통해서 매번 SemanticName을 맞춰서 선언 하기도 관리 도 해야 하기 때문에 shader 관련 클래스 및 hlsl -> fx, fxo 파일로 변경 해서 사용

gpu에 값을 연결 시켜주는 구조체

Utilitie도 다른 라이브러리 지원 및 주로 사용할 클래스들을 모아둘 관리용 파일

 

1. Libraries 위치 및 설명

※ 파일은 솔루션 밖에 만들어 둬서 혹시나 다른 프로젝트도 경로만 셋팅 하면 사용 하도록 둠

※ 빨강색 선 위로 fx 관련 필요한 API / 빨강색 선 아래 ui 관련 만들수 있는 API 

※ 인터넷에 해당 클래스, 헤더 치면 더 높은 버젼이 있는 Github로 있으니 필요하면 해당 파일로 다운

_Libraries.zip
2.55MB


2. 경로 설정 &  준수모드 설정

stdafx.h에 새롭게 넣은 라이브러리의 경로를 간단하게 써서 사용 (경로 다 써서 사용할 꺼면 설정 안해도됨)

 

프로젝트 -> 프로젝트 설정


 

c/c++, Linker에 해당 라이브러리 경로 추가 설정

※ ../;../../_Libraries; (해당 경로는 셋팅한 위치로 맞춰서 셋팅)


 

 stdafx.h 수정

※ 적당한 위치에 아래 코드 작성

//D3D11 fx & Imgui
#include <d3dx11effect.h>
#include <D3Dcompiler.h>
#pragma comment(lib, "Effects11d.lib")
#pragma comment(lib, "d3dcompiler.lib")
#include <imgui.h>
#include <imguiDx11.h>
#pragma comment(lib, "ImGui.lib")

준수 모드 미사용

※ 준수모드 역할은 비쥬얼 스튜디오 내부에서 보안용으로 사용하는 옵션이기 때문에 외부 라이브러리 및 환경에서 사용시 문제가 되기 때문에 사용 x


 

3. Renders & Utilities

render 관련 필요한 클래스를 모아둘 파일(필터) 앞으로 hlsl 대신에 fx를 사용할 예정

추가로 애기 하자면 fx도 미리헤더 컴파일 처럼 만들수 있는 프로그램으로 통해서 fxo 만들어서 사용할 예정이다.

※ fx로 사용 해도되지만 쉐이더 오류를 찾을때 사용할 때도 사용 하기 때문에 사용 하기도 함

 

Renders

 

필요한 클래스 파일

※ 해당 파일도 이름으로 검색하면 github에 있지만 사용하는 기능과 추가로 수정한 내용이 있기 때문에 필요하면 원본 파일로 사용 하는걸 추천.

※ 압축을 풀면 Shader 클래스가 있는데 layoutDesc관련 만들었던것을 해당 클래스를 통해서 쉽게 관리 

Renders.zip
0.00MB


 

압축 풀고 셋팅하기


Utilities 

 

3번에서 shader 클래스를 열어보면 빨간줄로 많이 있는데 추가적으로 파일을 넣어서 stdafx.h 추가 시키고 매크로 및 헤더 파일 추가만 해주면 해결

 

Utilities 관련 파일도 솔루션안에 넣고 셋팅

Utilities.zip
0.00MB


 

stdafx.h 수정

※ Imgui 선언한 밑에 매크로 4개 추가 (맨 밑에랑 차이는 인터페이스 용도)

※ System 주석영역에 넣은 Renders & Utilitie 관련 선언

//D3D11 fx & Imgui
#include <d3dx11effect.h>
#include <D3Dcompiler.h>
#pragma comment(lib, "Effects11d.lib")
#pragma comment(lib, "d3dcompiler.lib")
#include <imgui.h>
#include <imguiDx11.h>
#pragma comment(lib, "ImGui.lib")
#define SafeRelease(p) { if(p) { (p)->Release(); (p) = nullptr; } }
#define SafeDelete(p) { if(p) { delete (p); (p) = nullptr; } }
#define SafeDeleteArray(p) { if(p) { delete[] (p); (p) = nullptr; } }
#define Check(hr) { assert(SUCCEEDED(hr)); }
//System
#include "System/Keyboard.h"
#include "Renders/Shader.h"
#include "Utilities/Path.h"
#include "Utilities/String.h"

4. 수정

※위에 Utilities, Renders 넣으면서 이제 필요 없거나 새로 변경 해야함

 

shader 변수들 관련 삭제

※ 더 이상 필요없는 변수들 (shader 클래스에서 해당 변수들 관리 하기 때문에 필요가 없다)

stdafx.h

※ shader 관련 외부 변수들 삭제


Device.cpp

 

전역 공간

※ shader 관련 변수 삭제

void InitDirct3D()

※ shader 관련 셋팅 삭제

void Destroy()

※ 새롭게 만든 매크로 로 적용

void Destroy()
{
SafeRelease(RTV);
SafeRelease(SwapChain);
SafeRelease(DeviceContext);
SafeRelease(Device);
}

Scene.cpp

 

전역공간

※ ID3D11InputLayout 관련 변수 삭제

 

InputLayout 관련 변수들 수정

※ void InitScene(), void DestroyScene(), void Render() 함수 안에 있는 내용들 삭제


 

shader 

 

hlsl 파일 삭제


 

_Shader 파일 만들고 솔루션도 셋팅


 

fx 만들기 & 코드 작성

더보기
//---------------------------------------------------
//-------------------구조체 정의---------------------
//---------------------------------------------------
struct VertexInput
{
float4 Position : Position;
float3 Color : Color;
};
struct VertexOutput
{
float4 Position : SV_Position;
float3 Color : Color;
};
//---------------------------------------------------
//--------------cpu -> gpu에 값을 받는곳--------------
//---------------------------------------------------
VertexOutput VS(VertexInput input)
{
VertexInput output;
output.Position = input.Position;
output.Color = input.Color;
return output;
}
//---------------------------------------------------
//------------------Pixel 처리 하는곳-----------------
//---------------------------------------------------
float4 Color = float4(1, 0, 0, 1);
float4 PS(VertexOutput input) : SV_Target
{
return Color;
}
//---------------------------------------------------
//-------Pass 번호를 통해서 계산된 값 출력-------------
//---------------------------------------------------
technique11 T0
{
pass P0
{
SetVertexShader(CompileShader(vs_5_0, VS()));
SetPixelShader(CompileShader(ps_5_0, PS()));
}
}

5. 적용

1~4 모든 작업이 끝나면 이제 Scene.cpp에 기존에 썻던 shader 관련을 클래스 형태로 봐꺼서 사용해서 실제로 적용 하는지 확인

 

Scene.cpp

※ 클래스 선언


void InitScene()

※ 클래스 생성 & 파일 이름 셋팅

void InitScene()
{
shader = new Shader(L"01_Effect.fx");
//VertexBuffer Setting & Create VertexBuffer
{...}
// Index Buffer & IndexBuffer Setting
{...}
//RasterizerState
{...}
}

void Render()

※ 기존의 Draw 방식 변경

void Render()
{
D3DXCOLOR bgcolor = D3DXCOLOR(0.22f, 0.27f, 0.44f, 1.0f); // 배경색
DeviceContext->ClearRenderTargetView(RTV, (float*)bgcolor); //앞
{
UINT stride = sizeof(Vertex); //간격(보폭, 인덱스 나눠줄 크기)
UINT offset = 0; //시작점
DeviceContext->IASetVertexBuffers(0, 1, &vertexBuffer, &stride, &offset);
DeviceContext->IASetIndexBuffer(IndexBuffer, DXGI_FORMAT_R32_UINT, 0);
DeviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
DeviceContext->RSSetState(Wirte ? rs_FrameMode : NULL);
//DeviceContext->DrawIndexed(6 , 0 , 0);
shader->DrawIndexed(0 , 0 , 6); //변경
}
SwapChain->Present(0, 0); //백퍼에 위에 내용 보냄
}

실행

※ 정상적으로 빨강색 사각형이 그려진다면 성공


추가사항 1

참고로 01_Effect.fx 에서 PS 부분을 아래 이미지처럼 수정하면 기존에 정점 마다 색상 지정한 값으로 색팅 된다.

 

추가사항 2

※ Shader 클래스 생성자 부분에 file의 경로 확인 해서 사용

 

 

요약.

1. ID3D11InputLayout 관련된 모든 변수들을 일일이 선언 및 관리 하기 어렵기 때문에 Shader 클래스 통해서 관리

2. 이젠 .hlsl 파일이 아닌 fx, fxo 파일로 쉐이더 사용

 

https://github.com/ascher8159/DX2D

DX2D_07

 

'DirectX > DirectX 2D' 카테고리의 다른 글

DX2D_08 ImGui  (0) 2022.11.27
정리 & Plug in  (0) 2022.11.26
DX2D_06 IndexBuffer  (2) 2022.11.22
DX2D_05 정점 Update  (0) 2022.11.19
DX_2 삼각형, DX_3 RS  (0) 2022.11.13