DirectX 11 그래픽스 스터디 초급 과정 정리 노트
DirectX SDK의 API를 활용해서 GPU에 일을 시키는 방법을 구체적으로 이해 하는 것이 중요.
GPU에 일을 시키려면 코드상으로 어떤 핵심 객체들이 필요한지 DX도구를 개념적으로 이해해야 함. 그래야 DX가 아닌 OpenGL, Vulkan, Metal 등 다른 RHI(Render Hardware Interface) 를 보더라도 이해할 수 있음.
필수/중요 객체와 메소드
ID3D11Device : 필요한 서브 객체들을 생성하는데 사용하는 최상위 객체.
ID3D11DeviceContext : 최상위 객체인 Device로부터 생성한 서브 객체들을 설정하고 연결하는데 사용하는 Bridge성격의 객체. Context(문맥)어휘대로 이해하면 좋다.
IDXGISwapChain : 접두어 DXGI~(Graphics Infrastructure)라는 이름처럼 그래픽 디바이스와 커널단을 별도로 추상화한 레이어의 기능들 모음. RHI(Render Hardware Interface)와 달리 기술 변경 이슈가 크지 않은 하위 수준 요소와 작업들을 나타내는 레이어. SwapChain은 화면에 표시하기 전, 렌더링에 쓸 백버퍼를 가지며 더블 버퍼링 화면 전환(Swap)등을 처리.
ID3D11RenderTargetView : 접두어 ~View 는 DX 렌더링 파이프라인에서 리소스를 가리키는 인터페이스. 렌더 타겟(RenderTarget)은 렌더링 파이프라인을 거치면서 데이터를 실제로 렌더링 할 대상 버퍼를 설정할 수 있음. 이 때 데이터를 실제로 렌더링 하는 버퍼인 Back Buffer는 SwapChain의 GetBuffer()메소드으로부터 얻어올 수 있음.
ID3D11DepthStencilView : ~View 로 끝나는 리소스 인터페이스 중 중요 객체로 Depth, Stencil 값을 렌더링하는 DepthStencilBuffer를 가리킴. TEXTURE2D_DESC 의 BindType을 D3D11_BIND_DEPTH_STENCIL로 설정해서 텍스처를 생성. Device::CreateDepthStencilView() 메소드로 생성.
RenderBegin 메소드
DeviceContext::RSSetViewports() : Rasterizer Stage를 위한 Viewports 정의 설정.
DeviceContext::OMSetRenderTargets() : Output Merger에 렌더 타겟을 알려주는 메소드. RenderTargetView와 DepthStencilView 를 전달.
DeviceContext::ClearRenderTargetView() / ClearDepthStencilView() : 각각 View를 청소.
RenderEnd 메소드
SwapChain::Present() 메소드로 BackBuffer를 디스플레이로 출력.
필수/중요 객체 초기화 및 필수 렌더링 메소드 순서
Device, DeviceContext, SwapChain 생성.
RenderTargetView 생성 : SwapChain으로부터 BackBuffer를 얻어와서 이를 참조하는 RenderTargetView 생성.
DepthStensilView 생성 : 깊이값과 스텐실값을 저장할 Texture2D 타입 버퍼와 View 생성.
D3D11_VIEWPORT 설정 : 렌더링을 시작할 때 Device에 알려줄 Viewport 정보 설정.
RenderBegin : RS단계 Viewports 설정. OM단계의 RenterTargets 설정. RenderTargetView, DepthStencilView 클리어.
RenderEnd : SwapChain의 Present() 메소드로 BackBuffer 출력 처리.
렌더링 스테이징 및 주요 메소드
IA Stage(Input-Assembler Stage) 단계의 VertexBuffer, IndexBuffer 생성 및 설정. InputLayout, PrimitiveTopology 설정.
VertexShader, PixelShader Stage 단계.
VertexShader 설정, 상수 버퍼 설정.
Rasterzer Stage 의 RasterizerState 설정.
PixelShader 설정, PixelShaderResources 설정, Sampler 설정.
OutputMerger Stage 의 BlendState 설정.
DeviceContext::Draw~()
<리얼-타임 렌더링(REAL-TIME RENDERING) 4/e> 구입 링크
https://link.coupang.com/a/8VWas
<이득우의 게임 수학:39가지 예제로 배운다! 메타버스를 구성하는 게임 수학의 모든 것> 구입 링크
https://link.coupang.com/a/9BqLd
유니티 에셋 스토어 링크
https://assetstore.unity.com?aid=1011lvz7h
(링크를 통해 도서/에셋 구입시 일정액의 수수료를 지급받습니다.)