공부중

[DirectX12]Hello Wolrd Sample - D3D12HelloTexture - 1 본문

Programing/DirectX

[DirectX12]Hello Wolrd Sample - D3D12HelloTexture - 1

곤란 2018. 6. 3. 15:51
반응형

 

이번 프로젝트는 위와같이 삼각형에 텍스쳐(Texture)를 입히는 프로젝트이다.

 

역시 이전 프로젝트와 겹치는 부분은 되도록 빠르게 넘어갈 예정이다.

 

이번에도 해당 프로젝트의 시작인 Main부분 부터 살펴보도록 하자..

 

#include "stdafx.h"
#include "D3D12HelloTexture.h"

_Use_decl_annotations_
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int nCmdShow)
{
	D3D12HelloTexture sample(1280, 720, L"D3D12 Hello Texture");
	return Win32Application::Run(&sample, hInstance, nCmdShow);
}

특별히 다른점이라면 프로젝트 이름의 변경에 따른 class 이름이 바뀐것 말고는 없다.

(D3D12HelloTriangle이 D3DHelloTexture로 바뀌었다.)

 

이제 D3D12HelloTexture의 생성자가 바뀐점이 있는지 확인해 보자.

 

 

D3D12HelloTexture::D3D12HelloTexture(UINT width, UINT height, std::wstring name) :
	DXSample(width, height, name),
	m_frameIndex(0),
	m_viewport(0.0f, 0.0f, static_cast<float>(width), static_cast<float>(height)),
	m_scissorRect(0, 0, static_cast<LONG>(width), static_cast<LONG>(height)),
	m_rtvDescriptorSize(0)
{
}

생성자에서도 특별히 바뀐것은 없다.

 

그러면 D3D12HelloTexture에서 헤더는 Triangle class와 비교해서 어떤점이 바뀌었는지 확인해 보자.

 

 

#pragma once

#include "DXSample.h"

using namespace DirectX;

using Microsoft::WRL::ComPtr;

class D3D12HelloTexture : public DXSample
{
public:
	D3D12HelloTexture(UINT width, UINT height, std::wstring name);

	virtual void OnInit();
	virtual void OnUpdate();
	virtual void OnRender();
	virtual void OnDestroy();

private:
	static const UINT FrameCount = 2;

	//>>>>>>>>>>>> add
	static const UINT TextureWidth = 256;
	static const UINT TextureHeight = 256;
	static const UINT TexturePixelSize = 4;	// The number of bytes used to represent a pixel in the texture.
	//<<<<<<<<<<<< add

	struct Vertex
	{
		XMFLOAT3 position;
		XMFLOAT2 uv;		// change color -> uv
	};

	// Pipeline objects.
	CD3DX12_VIEWPORT m_viewport;
	CD3DX12_RECT m_scissorRect;
	ComPtr<IDXGISwapChain3> m_swapChain;
	ComPtr<ID3D12Device> m_device;
	ComPtr<ID3D12Resource> m_renderTargets[FrameCount];
	ComPtr<ID3D12CommandAllocator> m_commandAllocator;
	ComPtr<ID3D12CommandQueue> m_commandQueue;
	ComPtr<ID3D12RootSignature> m_rootSignature;
	ComPtr<ID3D12DescriptorHeap> m_rtvHeap;

	//>>>>>>>>>>>> add
	ComPtr<ID3D12DescriptorHeap> m_srvHeap;
	//<<<<<<<<<<<< add

	ComPtr<ID3D12PipelineState> m_pipelineState;
	ComPtr<ID3D12GraphicsCommandList> m_commandList;
	UINT m_rtvDescriptorSize;

	// App resources.
	ComPtr<ID3D12Resource> m_vertexBuffer;
	D3D12_VERTEX_BUFFER_VIEW m_vertexBufferView;

	//>>>>>>>>>>>> add
	ComPtr<ID3D12Resource> m_texture;
	//<<<<<<<<<<<< add

	// Synchronization objects.
	UINT m_frameIndex;
	HANDLE m_fenceEvent;
	ComPtr<ID3D12Fence> m_fence;
	UINT64 m_fenceValue;

	void LoadPipeline();
	void LoadAssets();

	//>>>>>>>>>>>> add
	std::vector<UINT8> GenerateTextureData();
	//<<<<<<<<<<<< add

	void PopulateCommandList();
	void WaitForPreviousFrame();
};

 

추가된 부분과 수정된 부분은 주석으로 따로 표시를 해두었다.

일단 그냥 color값을 줘서 출력하던 저번 프로젝트와는 다르게 이번 프로젝트의 컬러값은 모두 텍스쳐에 저장되어 있으므로 그에 관한 멤버와 메소드가 추가되었다.

(근데 나중에 코드를 보면 알겠지만... 텍스쳐 파일을 로드하는게 아닌... 값을 준다 -_-... 아니!?)

 

헤더와 생성자에서 변경된점을 확인하였으므로...

다음 코드로 넘어가보자.

 

다음 코드는 Win32Application::Run(&sample, hInstance, nCmdShow); 으로 Run 함수도 딱히 겉으로는 변할것이 없어보일꺼 같다..

중요한 Init부분은 전달받은 sample->Init( ) 의 안쪽에 있을꺼니까....

 

 

int Win32Application::Run(DXSample* pSample, HINSTANCE hInstance, int nCmdShow)
{
	// Parse the command line parameters
	int argc;
	LPWSTR* argv = CommandLineToArgvW(GetCommandLineW(), &argc);
	pSample->ParseCommandLineArgs(argv, argc);
	LocalFree(argv);

	// Initialize the window class.
	WNDCLASSEX windowClass = { 0 };
	windowClass.cbSize = sizeof(WNDCLASSEX);
	windowClass.style = CS_HREDRAW | CS_VREDRAW;
	windowClass.lpfnWndProc = WindowProc;
	windowClass.hInstance = hInstance;
	windowClass.hCursor = LoadCursor(NULL, IDC_ARROW);
	windowClass.lpszClassName = L"DXSampleClass";
	RegisterClassEx(&windowClass);

	RECT windowRect = { 0, 0, static_cast(pSample->GetWidth()), static_cast(pSample->GetHeight()) };
	AdjustWindowRect(&windowRect, WS_OVERLAPPEDWINDOW, FALSE);

	// Create the window and store a handle to it.
	m_hwnd = CreateWindow(
		windowClass.lpszClassName,
		pSample->GetTitle(),
		WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		windowRect.right - windowRect.left,
		windowRect.bottom - windowRect.top,
		nullptr,		// We have no parent window.
		nullptr,		// We aren't using menus.
		hInstance,
		pSample);

	// Initialize the sample. OnInit is defined in each child-implementation of DXSample.
	pSample->OnInit();

	ShowWindow(m_hwnd, nCmdShow);

	// Main sample loop.
	MSG msg = {};
	while (msg.message != WM_QUIT)
	{
		// Process any messages in the queue.
		if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
	}

	pSample->OnDestroy();

	// Return this part of the WM_QUIT message to Windows.
	return static_cast(msg.wParam);
}

역시 바뀐점은 없다...

 

저번 프로젝트에서도 봤다싶이

	// Initialize the sample. OnInit is defined in each child-implementation of DXSample.
	pSample->OnInit();

 

이 부분에서 많은점이 달라질것 같다.

 

pSample->OnInit( ) 메소드부터 다음글에서 살펴보자.

 

반응형