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

Utilitie도 다른 라이브러리 지원 및 주로 사용할 클래스들을 모아둘 관리용 파일
1. Libraries 위치 및 설명
※ 파일은 솔루션 밖에 만들어 둬서 혹시나 다른 프로젝트도 경로만 셋팅 하면 사용 하도록 둠
※ 빨강색 선 위로 fx 관련 필요한 API / 빨강색 선 아래 ui 관련 만들수 있는 API
※ 인터넷에 해당 클래스, 헤더 치면 더 높은 버젼이 있는 Github로 있으니 필요하면 해당 파일로 다운

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관련 만들었던것을 해당 클래스를 통해서 쉽게 관리
압축 풀고 셋팅하기

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

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 |