| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 | 21 | 22 |
| 23 | 24 | 25 | 26 | 27 | 28 | 29 |
| 30 | 31 |
- 언리얼엔진
- listen server
- stride
- rpc
- animation
- photon fusion2
- attribute
- unity
- ability task
- 게임 개발
- Multiplay
- 언리얼 엔진
- gameplay ability system
- 게임개발
- os
- Replication
- UI
- gas
- Aegis
- linear regression
- 유니티
- CTF
- 보안
- C++
- MAC
- local prediction
- widget
- Unreal Engine
- gameplay effect
- gameplay tag
- Today
- Total
Replicated
장치 초기화 본문
ComPtr< ID3D11Device > _device;
ComPtr< ID3D11DeviceContext > _deviceContext;
ComPtr< IDXGISwapChain > _swapChain;
_device : 리소스 생성
_deviceContext : GPU에 명령 발행
_swapChain : 화면 출력
void Game::Init(HWND hand)
{
_hwnd = hand;
_width = GWinSizeX;
_height = GWinSizeY;
CreateDeviceAndSwapChain();
CreateRenterTargetView();
SetViewPort();
}
초기화 진입점.
순서는 강제. 스왑체인이 있어야 백버퍼를 꺼낼 수 있고, 백버퍼가 있어야 RTV(Render Target View)를 만들 수 있음
void Game::CreateDeviceAndSwapChain()
{
DXGI_SWAP_CHAIN_DESC desc;
ZeroMemory(&desc, sizeof(desc));
{
desc.BufferDesc.Width = _width;
desc.BufferDesc.Height = _height;
desc.BufferDesc.RefreshRate.Numerator = 60;
desc.BufferDesc.RefreshRate.Denominator = 1;
desc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
desc.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
desc.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;
desc.SampleDesc.Count = 1;
desc.SampleDesc.Quality = 0;
desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
desc.BufferCount = 1;
desc.OutputWindow = _hwnd;
desc.Windowed = true;
desc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
}
HRESULT hr = ::D3D11CreateDeviceAndSwapChain(
nullptr,
D3D_DRIVER_TYPE_HARDWARE,
nullptr,
0,
nullptr,
0,
D3D11_SDK_VERSION,
&desc,
_swapChain.GetAddressOf(),
_device.GetAddressOf(),
nullptr,
_deviceContext.GetAddressOf()
);
CHECK(hr);
}
디바이스, 디바이스 컨텍스트, 스왑체인 생성
desc 밀어버리는 건 DX가 쓰레기값 진짜값으로 오인하는 경우가 있음
DXGI_SWAP_CHAIN_DESC
- 인자용 구조체
- Width, Height : 백버퍼 해상도로 창 크기와 별개
- RefreshRate : 주사율, 전체 화면에서만 유효
- Format : 픽셀 저장 방식
- Count : 픽셀 당 샘플 수로 1 = MSAA 끔. 안티 앨리어싱 관련 필드
- BufferUsage : 버퍼 용도 선언
- BufferCount : 백버퍼 개수
- OutputWindow : 출력 대상 윈도우
- SwapEffect : 프레젠트 후 백버퍼 처리 방식
RefreshRate가 분수인건 실제 모니터가 59.94Hz ( 60000/1001 )같은 값이라..
DXGI_FORMAT_R8G8B8A8_UNORM
- 채널당 8비트로 총 32비트
desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
이 버퍼는 렌더링 용이다 미리 정해놔야 GPU가 세팅함
desc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
화면에 직접 그리면 그려지는 과정이 보여서 티어링 생기니까 백버퍼에 완성하고 교체하는데
디스카드는 교체 후 이전 내용을 버린다는 뜻
D3D_DRIVER_TYPE_HARDWARE
GPU 하드웨어 가속
void Game::CreateRenterTargetView()
{
HRESULT hr;
ComPtr<ID3D11Texture2D> backBuffer = nullptr;
hr = _swapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (void**)backBuffer.GetAddressOf());
CHECK(hr);
hr = _device->CreateRenderTargetView(backBuffer.Get(), nullptr, _renderTargetView.GetAddressOf());
CHECK(hr);
}
1. 백버퍼(리소스) 꺼내기
스왑체인이 내부적으로 들고 있는 백버퍼를 꺼냄
__uuidof는 이 인터페이스로 달라는 요청.
2. 뷰 만들기
리소스는 뷰와 다름. GPU는 리소스에 직접 접근하지 않고 항상 뷰를 통해 접근
리소스: 실제 픽셀이 담긴 메모리 덩어리, 백버퍼
렌더 타겟 뷰 : 해당 메모리를 렌더 타겟으로 해석하라는 설명서
같은 텍스처 하나를 이번 패스에선 그릴 대상(RTV)로, 다음 패스에선 셰이더가 읽는 텍스처(SRV)로 쓸 수 있음
그때마다 다른 뷰를 만들어 끼움
| 뷰 | 의미 |
| RTV (Render Target View) | 여기다 그린다 |
| SRV (Shader Resource View) | 셰이더에서 읽는다 |
| DSV (Depth Stencil View) | 깊이, 스텐실 판정 |
| UAV (Unordered Accessn View) | 셰이더에서 읽고 쓴다 |
void Game::RenderBegin()
{
_deviceContext->OMSetRenderTargets(1, _renderTargetView.GetAddressOf(), nullptr);
_deviceContext->ClearRenderTargetView(_renderTargetView.Get(), _clearColor);
_deviceContext->RSSetViewports(1, &_viewport);
}
매 프레임 렌더 준비
함수 접두사 == 파이프라인 단계
| 단계 |
| IA (Input Assembler) |
| VS (Vertex Shader) |
| RS (Rasterizer) |
| PS (Pixel Shader) |
| OM (Output Shader) |
void Game::RenderEnd()
{
HRESULT hr = _swapChain->Present(1, 0);
CHECK(hr);
}
완성된 백버퍼 화면과 교체
첫 인자는 VSync, 수직 동기화임
'DirectX 11' 카테고리의 다른 글
| Constant Buffer (0) | 2026.08.01 |
|---|---|
| 텍스처, UV (0) | 2026.08.01 |
| 삼각형 띄우기 (0) | 2026.08.01 |
| Windows API로 진입점 만들기 (0) | 2025.04.07 |
| 그래픽스 개요 (0) | 2025.04.06 |