DirectX 11 스터디 - 모듈화 (1)
앞선 스터디 과정에서는 하나의 클래스에 DirectX 객체들을 모두 모아서 구현했었음. 한 클래스에 모아서 구현했던 객체들과 개념, 동작들은 아래와 같음.
DirectX 핵심 객체 : Device, DeviceContext, SwapChain
Render Target : SwapChain 에서 백버퍼를 가져와서 RenderTarget 생성
RenderBegin : 렌더타겟뷰 셋팅, 클리어. 뷰포트 셋팅.
RenderEnd : 에서 SwapChain->Present 호출해서 백버퍼 고속복사로 화면 갱신.
Geometry 데이터 생성 및 관리
Vertex Buffer, Index Buffer 생성
Input Layout 생성 및 설정
Vertex Shader, Pixel Shader
Texture 로드, Shader Resource View 생성
Rasterizer State, Sampler State, Blend State
렌더링 파이프라인에 참여하는 객체와 개념들의 수가 많고 복잡한데, 구조화를 통해 책임과 역할을 구분하고 설계한다.
구조화를 위한 클래스와 역할 구분
클래스 이름과 설명.
Graphics : 장치 추상화 핵심 객체를 갖는 클래스. 언리얼 엔진에서는 RHI 로 명명해서 DX, Vulkan, Metal 등을 추상화.
(RHI = Render Hardware Interface)
Device, DeviceContext, SwapChain, Viewport
Geometry : 버텍스와 인덱스 등 3D 기하학 데이터 관리. 어떤 버텍스 데이터 타입 배열을 받을지 모르니 템플릿으로 작성.
VertextBuffer : 버텍스용 D3D 버퍼 관리. 어떤 버텍스 데이터 타입 배열을 받을지 모르니 템플릿으로 작성.
IndexBuffer : 인덱스용 D3D 버퍼 관리
VertexData, InputLayout : Vertex 하나의 데이터 구조/레이아웃 선언, 세팅
Shader(Vertex/Pixel) : Vertex Shader, Pixel Shader 로드/컴파일 및 관리
ConstantBuffer : 상수 버퍼 생성 관리. 상수 데이터로 다양한 구조체를 받을 수 있게 템플릿으로 작성.
Texture : 텍스쳐 파일을 로드하고 ShaderResourceView 를 생성.
여기까지 생성한 객체들.
shared_ptr<Geometry<VertexTextureData>> _geometry;
shared_ptr<VertexBuffer> _vertexBuffer;
shared_ptr<IndexBuffer> _indexBuffer;
shared_ptr<InputLayout> _inputLayout;
shared_ptr<VertexShader> _vertexShader;
shared_ptr<PixelShader> _pixelShader;
shared_ptr<Texture> _texture1;
shared_ptr< ConstantBuffer<TransformData>> _constantBuffer;
위 객체들 초기화 코드 참고. D3D 객체들을 모두 은닉화.
_RHI = make_shared<D3D11RHI>(hwnd);
_geometry = make_shared<Geometry<VertexTextureData >>();
_vertexBuffer = make_shared<VertexBuffer>(_RHI->GetDevice());
_indexBuffer = make_shared<IndexBuffer>(_RHI->GetDevice());
GeometryHelper::CreateRectangle(_geometry);
_vertexBuffer->Create(_geometry->GetVertices());
_indexBuffer->Create(_geometry->GetIndices());
_vertexShader = make_shared<VertexShader>(_RHI->GetDevice());
_vertexShader->Create(L"Default.hlsl", "VS", "vs_5_0");
_inputLayout = make_shared<InputLayout>(_RHI->GetDevice());
_inputLayout->Create(VertexTextureData::descs, _vertexShader->GetBlob());
_pixelShader = make_shared<PixelShader>(_RHI->GetDevice());
_pixelShader->Create(L"Default.hlsl", "PS", "ps_5_0");
_texture1 = make_shared<Texture>(_RHI->GetDevice());
_texture1->Create(L"Skeleton.png");
_constantBuffer = make_shared<ConstantBuffer<TransformData>>(_RHI->GetDevice(), _RHI->GetDeviceContext()) ;
_constantBuffer->Create();
다음은 구조화 마무리 단계.
<리얼-타임 렌더링(REAL-TIME RENDERING) 4/e> 구입 링크
https://link.coupang.com/a/8VWas
<DirectX 12를 이용한 3D 게임 프로그래밍 입문> 구입 링크
https://link.coupang.com/a/8V4Wq
<이득우의 게임 수학:39가지 예제로 배운다! 메타버스를 구성하는 게임 수학의 모든 것> 구입 링크
https://link.coupang.com/a/9BqLd
유니티 에셋 스토어 링크
https://assetstore.unity.com?aid=1011lvz7h
(링크를 통해 도서/에셋 구입시 일정액의 수수료를 지급받습니다.)