...
// demo를 초기화한다
CDemoBlankWndD3D demo;
if (!demo.Initialize(g_hWnd, g_hInst))
return -1;
// Main message loop
MSG msg = { 0 };
while (msg.message != WM_QUIT)
{
if (::PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
// 업데이트 후 렌더링
demo.Update();
demo.Render();
}
// Terminate demo
demo.Terminate();
...
WinMain의 메시지 while문에서 demo를 업데이트하고 렌더링한다.
void CDemoBlankWndD3D::Render()
{
// Check if D3D is ready
if (m_pD3DContext == NULL)
return;
// Clear back buffer
float color[4] = { 0.0f, 0.0f, 0.5f, 1.0f };
m_pD3DContext->ClearRenderTargetView(m_pD3DRenderTargetView, color);
// Present back buffer to display
m_pSwapChain->Present(0, 0);
}
CDemoBlankWndD3D에서 렌더링을 설정한다.
// Set attributes
m_hWnd = hWnd;
m_hInst = hInst;
// Get window size
RECT rc;
::GetClientRect(hWnd, &rc); //현재 창의 크기를 rc에 대입한다.
UINT nWidth = rc.right - rc.left;
UINT nHeight = rc.bottom - rc.top;
// ##1 Swap chain structure
// 첫번째로 스왑체인을 설정한다.
/*
스왑 체인은 사용자에게 프레임을 표시하는 데 사용되는 버퍼의 컬렉션입니다.
애플리케이션이 표시할 새 프레임을 표시할 때마다 스왑 체인의 첫 번째 버퍼가 표시된 버퍼를 대신합니다.
이 프로세스를 교환 또는 대칭 이동이라고 합니다.
*/
DXGI_SWAP_CHAIN_DESC swapChainDesc; //스왑체인 생성
::ZeroMemory(&swapChainDesc, sizeof(swapChainDesc));
//스왑 체인의 버퍼 수를 설명하는 값입니다. IDXGIFactory::CreateSwapChain을 호출하여 전체 화면 스왑 체인을 만들 때 일반적으로 이 값에 전면 버퍼를 포함합니다.
swapChainDesc.BufferCount = 1;
//버퍼의 크기는 창의 크기와 같게하는것을 권장
swapChainDesc.BufferDesc.Width = nWidth;
swapChainDesc.BufferDesc.Height = nHeight;
//비교적 표준 형식
swapChainDesc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
//주사율 (60fps)
swapChainDesc.BufferDesc.RefreshRate.Numerator = 60;
swapChainDesc.BufferDesc.RefreshRate.Denominator = 1;
swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
//출력 윈도우에 핸들을 지정
swapChainDesc.OutputWindow = (HWND)hWnd;
//샘플데스크 안티앨리어싱을 위한 것
swapChainDesc.SampleDesc.Count = 1;
swapChainDesc.SampleDesc.Quality = 0;
//윈도우 모드?
swapChainDesc.Windowed = true;
// Supported feature levels/
D3D_FEATURE_LEVEL featureLevel;
D3D_FEATURE_LEVEL featureLevels[] =
{
D3D_FEATURE_LEVEL_11_0,
D3D_FEATURE_LEVEL_10_1,
D3D_FEATURE_LEVEL_10_0
};
UINT numFeatureLevels = ARRAYSIZE(featureLevels);
// Supported driver levels
D3D_DRIVER_TYPE driverTypes[] =
{
D3D_DRIVER_TYPE_HARDWARE, D3D_DRIVER_TYPE_WARP,
D3D_DRIVER_TYPE_REFERENCE, D3D_DRIVER_TYPE_SOFTWARE
};
UINT numDriverTypes = ARRAYSIZE(driverTypes);
// Flags
UINT flags = 0;
#ifdef _DEBUG
flags = D3D11_CREATE_DEVICE_DEBUG;
#endif
https://docs.microsoft.com/en-us/windows/win32/api/dxgi/ns-dxgi-dxgi_swap_chain_desc
DXGI_SWAP_CHAIN_DESC (dxgi.h) - Win32 apps
Describes a swap chain.
docs.microsoft.com
// Create the D3D device and the swap chain
//장치와 스왑체인을 만든다
HRESULT hr = ::D3D11CreateDeviceAndSwapChain(
NULL,
D3D_DRIVER_TYPE_HARDWARE,
NULL,
flags,
featureLevels,
numFeatureLevels,
D3D11_SDK_VERSION,
&swapChainDesc,
&m_pSwapChain, //멤버 변수
&m_pD3DDevice, //멤버 변수
&featureLevel,
&m_pD3DContext //멤버 변수
);
// Check device
if (FAILED(hr)) {
MessageBox(hWnd, TEXT("A DX11 Video Card is Required"), TEXT("ERROR"), MB_OK);
return false;
}
// Get the back buffer from the swapchain
// 스왑체인으로부터 백버퍼를 받아온다.
ID3D11Texture2D *pBackBuffer;
hr = m_pSwapChain->GetBuffer( 0, //백 버퍼의 번호
__uuidof(ID3D11Texture2D), //백 버퍼에 접근하는 인터페이스
(LPVOID*)&pBackBuffer); //백 버퍼를 받아올 변수
if (FAILED(hr)) {
MessageBox(hWnd, TEXT("Unable to get back buffer"), TEXT("ERROR"), MB_OK);
return false;
}
// Create the render target view
//텍스쳐는 파이프라인으로부터 '뷰(View)'를 통해서 접근이 가능합니다.
//렌더타겟도 텍스쳐의 일종이기 때문에 역시 뷰를 이용하여 접근해야 합니다.
//렌더타겟에 접근할 때는 '렌더타겟 뷰'를 사용하여 접근할 수 있습니다.
hr = m_pD3DDevice->CreateRenderTargetView(pBackBuffer, NULL, &m_pD3DRenderTargetView);
// Release the back buffer
if (pBackBuffer != NULL)
pBackBuffer->Release();
// Check render target view
if (FAILED(hr)) {
MessageBox(hWnd, TEXT("Unable to create render target view"), TEXT("ERROR"), MB_OK);
return false;
}
// Set the render target
//렌더타겟뷰를 설정
m_pD3DContext->OMSetRenderTargets(1, &m_pD3DRenderTargetView, NULL);
// Set the viewport
//뷰포트 설정
D3D11_VIEWPORT viewPort;
viewPort.Width = (float)nWidth;
viewPort.Height = (float)nHeight;
viewPort.MinDepth = 0.0f;
viewPort.MaxDepth = 1.0f;
viewPort.TopLeftX = 0;
viewPort.TopLeftY = 0;
m_pD3DContext->RSSetViewports(1, &viewPort);
// Load content
return LoadContent();
https://vsts2010.tistory.com/517
[알콜코더의 미리 배워보는 DX11-입문편] 1.튜터리얼01:백버퍼의 설정 #1
참고 소스 : DirectX SDK – DirectX 11 Tutorial 02 위 소스를 기반으로 연재를 진행합니다. 연재외에 자세한 내용은 소스와 DX SDK 문서를 참조하시면 도움이 됩니다. 안녕하세요. 알콜코더 민군입니다. ^^
vsts2010.tistory.com
// DemoBlankWndD3D.h : Defines the CDemoBlankWndD3D class.
//
// By Geelix School of Serious Games and Edutainment.
//
#ifndef _DEMOBLANKWNDD3D_H_
#define _DEMOBLANKWNDD3D_H_
#include "Dx11Base.h"
//그리고자 하는 클래스는 CDx11Base에게서 상속받는다
class CDemoBlankWndD3D : public CDx11Base
{
// Constructors
public:
CDemoBlankWndD3D();
virtual ~CDemoBlankWndD3D();
// Overrides
public:
virtual bool LoadContent();
virtual void UnloadContent();
virtual void Update();
virtual void Render();
};
#endif // _DEMOBLANKWNDD3D_H_

상속을 받고 초기화를 디바이스 초기화를 한다. update와 render을 loop
void CDemoBlankWndD3D::Render()
{
// Check if D3D is ready
if (m_pD3DContext == NULL)
return;
// Clear back buffer
float color[4] = { 0.0f, 0.0f, 0.5f, 1.0f };
m_pD3DContext->ClearRenderTargetView(m_pD3DRenderTargetView, color);
// Present back buffer to display
m_pSwapChain->Present(0, 0);
}
Render을 오버라이딩하여 이용한다.

'기타 > directX' 카테고리의 다른 글
[DirectX11] 삼각형 그리기 (0) | 2022.02.26 |
---|---|
[DirectX11] sprite 그리기 (0) | 2022.02.26 |
[DirectX11] 텍스쳐 그리기 (0) | 2022.02.22 |
...
// demo를 초기화한다
CDemoBlankWndD3D demo;
if (!demo.Initialize(g_hWnd, g_hInst))
return -1;
// Main message loop
MSG msg = { 0 };
while (msg.message != WM_QUIT)
{
if (::PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
// 업데이트 후 렌더링
demo.Update();
demo.Render();
}
// Terminate demo
demo.Terminate();
...
WinMain의 메시지 while문에서 demo를 업데이트하고 렌더링한다.
void CDemoBlankWndD3D::Render()
{
// Check if D3D is ready
if (m_pD3DContext == NULL)
return;
// Clear back buffer
float color[4] = { 0.0f, 0.0f, 0.5f, 1.0f };
m_pD3DContext->ClearRenderTargetView(m_pD3DRenderTargetView, color);
// Present back buffer to display
m_pSwapChain->Present(0, 0);
}
CDemoBlankWndD3D에서 렌더링을 설정한다.
// Set attributes
m_hWnd = hWnd;
m_hInst = hInst;
// Get window size
RECT rc;
::GetClientRect(hWnd, &rc); //현재 창의 크기를 rc에 대입한다.
UINT nWidth = rc.right - rc.left;
UINT nHeight = rc.bottom - rc.top;
// ##1 Swap chain structure
// 첫번째로 스왑체인을 설정한다.
/*
스왑 체인은 사용자에게 프레임을 표시하는 데 사용되는 버퍼의 컬렉션입니다.
애플리케이션이 표시할 새 프레임을 표시할 때마다 스왑 체인의 첫 번째 버퍼가 표시된 버퍼를 대신합니다.
이 프로세스를 교환 또는 대칭 이동이라고 합니다.
*/
DXGI_SWAP_CHAIN_DESC swapChainDesc; //스왑체인 생성
::ZeroMemory(&swapChainDesc, sizeof(swapChainDesc));
//스왑 체인의 버퍼 수를 설명하는 값입니다. IDXGIFactory::CreateSwapChain을 호출하여 전체 화면 스왑 체인을 만들 때 일반적으로 이 값에 전면 버퍼를 포함합니다.
swapChainDesc.BufferCount = 1;
//버퍼의 크기는 창의 크기와 같게하는것을 권장
swapChainDesc.BufferDesc.Width = nWidth;
swapChainDesc.BufferDesc.Height = nHeight;
//비교적 표준 형식
swapChainDesc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
//주사율 (60fps)
swapChainDesc.BufferDesc.RefreshRate.Numerator = 60;
swapChainDesc.BufferDesc.RefreshRate.Denominator = 1;
swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
//출력 윈도우에 핸들을 지정
swapChainDesc.OutputWindow = (HWND)hWnd;
//샘플데스크 안티앨리어싱을 위한 것
swapChainDesc.SampleDesc.Count = 1;
swapChainDesc.SampleDesc.Quality = 0;
//윈도우 모드?
swapChainDesc.Windowed = true;
// Supported feature levels/
D3D_FEATURE_LEVEL featureLevel;
D3D_FEATURE_LEVEL featureLevels[] =
{
D3D_FEATURE_LEVEL_11_0,
D3D_FEATURE_LEVEL_10_1,
D3D_FEATURE_LEVEL_10_0
};
UINT numFeatureLevels = ARRAYSIZE(featureLevels);
// Supported driver levels
D3D_DRIVER_TYPE driverTypes[] =
{
D3D_DRIVER_TYPE_HARDWARE, D3D_DRIVER_TYPE_WARP,
D3D_DRIVER_TYPE_REFERENCE, D3D_DRIVER_TYPE_SOFTWARE
};
UINT numDriverTypes = ARRAYSIZE(driverTypes);
// Flags
UINT flags = 0;
#ifdef _DEBUG
flags = D3D11_CREATE_DEVICE_DEBUG;
#endif
https://docs.microsoft.com/en-us/windows/win32/api/dxgi/ns-dxgi-dxgi_swap_chain_desc
DXGI_SWAP_CHAIN_DESC (dxgi.h) - Win32 apps
Describes a swap chain.
docs.microsoft.com
// Create the D3D device and the swap chain
//장치와 스왑체인을 만든다
HRESULT hr = ::D3D11CreateDeviceAndSwapChain(
NULL,
D3D_DRIVER_TYPE_HARDWARE,
NULL,
flags,
featureLevels,
numFeatureLevels,
D3D11_SDK_VERSION,
&swapChainDesc,
&m_pSwapChain, //멤버 변수
&m_pD3DDevice, //멤버 변수
&featureLevel,
&m_pD3DContext //멤버 변수
);
// Check device
if (FAILED(hr)) {
MessageBox(hWnd, TEXT("A DX11 Video Card is Required"), TEXT("ERROR"), MB_OK);
return false;
}
// Get the back buffer from the swapchain
// 스왑체인으로부터 백버퍼를 받아온다.
ID3D11Texture2D *pBackBuffer;
hr = m_pSwapChain->GetBuffer( 0, //백 버퍼의 번호
__uuidof(ID3D11Texture2D), //백 버퍼에 접근하는 인터페이스
(LPVOID*)&pBackBuffer); //백 버퍼를 받아올 변수
if (FAILED(hr)) {
MessageBox(hWnd, TEXT("Unable to get back buffer"), TEXT("ERROR"), MB_OK);
return false;
}
// Create the render target view
//텍스쳐는 파이프라인으로부터 '뷰(View)'를 통해서 접근이 가능합니다.
//렌더타겟도 텍스쳐의 일종이기 때문에 역시 뷰를 이용하여 접근해야 합니다.
//렌더타겟에 접근할 때는 '렌더타겟 뷰'를 사용하여 접근할 수 있습니다.
hr = m_pD3DDevice->CreateRenderTargetView(pBackBuffer, NULL, &m_pD3DRenderTargetView);
// Release the back buffer
if (pBackBuffer != NULL)
pBackBuffer->Release();
// Check render target view
if (FAILED(hr)) {
MessageBox(hWnd, TEXT("Unable to create render target view"), TEXT("ERROR"), MB_OK);
return false;
}
// Set the render target
//렌더타겟뷰를 설정
m_pD3DContext->OMSetRenderTargets(1, &m_pD3DRenderTargetView, NULL);
// Set the viewport
//뷰포트 설정
D3D11_VIEWPORT viewPort;
viewPort.Width = (float)nWidth;
viewPort.Height = (float)nHeight;
viewPort.MinDepth = 0.0f;
viewPort.MaxDepth = 1.0f;
viewPort.TopLeftX = 0;
viewPort.TopLeftY = 0;
m_pD3DContext->RSSetViewports(1, &viewPort);
// Load content
return LoadContent();
https://vsts2010.tistory.com/517
[알콜코더의 미리 배워보는 DX11-입문편] 1.튜터리얼01:백버퍼의 설정 #1
참고 소스 : DirectX SDK – DirectX 11 Tutorial 02 위 소스를 기반으로 연재를 진행합니다. 연재외에 자세한 내용은 소스와 DX SDK 문서를 참조하시면 도움이 됩니다. 안녕하세요. 알콜코더 민군입니다. ^^
vsts2010.tistory.com
// DemoBlankWndD3D.h : Defines the CDemoBlankWndD3D class.
//
// By Geelix School of Serious Games and Edutainment.
//
#ifndef _DEMOBLANKWNDD3D_H_
#define _DEMOBLANKWNDD3D_H_
#include "Dx11Base.h"
//그리고자 하는 클래스는 CDx11Base에게서 상속받는다
class CDemoBlankWndD3D : public CDx11Base
{
// Constructors
public:
CDemoBlankWndD3D();
virtual ~CDemoBlankWndD3D();
// Overrides
public:
virtual bool LoadContent();
virtual void UnloadContent();
virtual void Update();
virtual void Render();
};
#endif // _DEMOBLANKWNDD3D_H_

상속을 받고 초기화를 디바이스 초기화를 한다. update와 render을 loop
void CDemoBlankWndD3D::Render()
{
// Check if D3D is ready
if (m_pD3DContext == NULL)
return;
// Clear back buffer
float color[4] = { 0.0f, 0.0f, 0.5f, 1.0f };
m_pD3DContext->ClearRenderTargetView(m_pD3DRenderTargetView, color);
// Present back buffer to display
m_pSwapChain->Present(0, 0);
}
Render을 오버라이딩하여 이용한다.

'기타 > directX' 카테고리의 다른 글
[DirectX11] 삼각형 그리기 (0) | 2022.02.26 |
---|---|
[DirectX11] sprite 그리기 (0) | 2022.02.26 |
[DirectX11] 텍스쳐 그리기 (0) | 2022.02.22 |