...    
    
    // 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
bonnate