공부중

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

Programing/DirectX

[DirectX12]Hello Wolrd Sample - D3D12HelloTexture - 5

곤란 2018. 6. 5. 17:31
반응형
	// Create the command list.
	ThrowIfFailed(m_device->CreateCommandList(0, 
						  D3D12_COMMAND_LIST_TYPE_DIRECT, 
						  m_commandAllocator.Get(), 
						  m_pipelineState.Get(), 
						  IID_PPV_ARGS(&m_commandList)));

	// Create the vertex buffer.
	{
		// Define the geometry for a triangle.
		Vertex triangleVertices[] =
		{
			{ { 0.0f, 0.25f * m_aspectRatio, 0.0f }, { 0.5f, 0.0f } },
			{ { 0.25f, -0.25f * m_aspectRatio, 0.0f }, { 1.0f, 1.0f } },
			{ { -0.25f, -0.25f * m_aspectRatio, 0.0f }, { 0.0f, 1.0f } }
		};

		const UINT vertexBufferSize = sizeof(triangleVertices);

		// Note: using upload heaps to transfer static data like vert buffers is not 
		// recommended. Every time the GPU needs it, the upload heap will be marshalled 
		// over. Please read up on Default Heap usage. An upload heap is used here for 
		// code simplicity and because there are very few verts to actually transfer.
		ThrowIfFailed(m_device->CreateCommittedResource(
			&CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_UPLOAD),
			D3D12_HEAP_FLAG_NONE,
			&CD3DX12_RESOURCE_DESC::Buffer(vertexBufferSize),
			D3D12_RESOURCE_STATE_GENERIC_READ,
			nullptr,
			IID_PPV_ARGS(&m_vertexBuffer)));

		// Copy the triangle data to the vertex buffer.
		UINT8* pVertexDataBegin;
		CD3DX12_RANGE readRange(0, 0);		// We do not intend to read from this resource on the CPU.
		ThrowIfFailed(m_vertexBuffer->Map(0, &readRange, reinterpret_cast<void**>(&pVertexDataBegin)));
		memcpy(pVertexDataBegin, triangleVertices, sizeof(triangleVertices));
		m_vertexBuffer->Unmap(0, nullptr);

		// Initialize the vertex buffer view.
		m_vertexBufferView.BufferLocation = m_vertexBuffer->GetGPUVirtualAddress();
		m_vertexBufferView.StrideInBytes = sizeof(Vertex);
		m_vertexBufferView.SizeInBytes = vertexBufferSize;
	}

이번글에 적을 내용의 코드는 위와 같다.

 

	// Create the command list.
	ThrowIfFailed(m_device->CreateCommandList(0, 
						  D3D12_COMMAND_LIST_TYPE_DIRECT, 
						  m_commandAllocator.Get(), 
						  m_pipelineState.Get(), 
						  IID_PPV_ARGS(&m_commandList)));

먼저 디바이스에서 commandList를 생성해 주는 코드가 한줄 보인다.

위에서 만들었던 commandAllocator와 pipelineState를 넘겨주고 commandList를 생성하는 모습이다.

 

그리고 다음 블럭에서는 VertexBuffer 생성에 관한 내용이다.

 

		// Define the geometry for a triangle.
		Vertex triangleVertices[] =
		{
			{ { 0.0f, 0.25f * m_aspectRatio, 0.0f }, { 0.5f, 0.0f } },
			{ { 0.25f, -0.25f * m_aspectRatio, 0.0f }, { 1.0f, 1.0f } },
			{ { -0.25f, -0.25f * m_aspectRatio, 0.0f }, { 0.0f, 1.0f } }
		};

맨 먼저 D3D12HelloTexture.h 에 선언된 Vertex 구조체 형으로 삼각형의 기하학을 정의하고 있다.

첫번째는 삼각형을 이루는데 필요한 점의 위치 두번째는 UV좌표가 된다.

 

UV좌표관련해서는 텍스쳐 불러오는 부분이 있는데 이때 어떻게 텍스쳐 정보가 저장되어있는지부터 보고 설명을 들어가야 할것 같다.

(이 튜토리얼이 텍스쳐 불러오는게 아니라 나중에 보면 알겠지만 값을 그냥 넣어버렸다 -_-...)

 

나머지 부분은 이전 프로젝트와 다른 코드가 없다.

 

		const UINT vertexBufferSize = sizeof(triangleVertices);

		// Note: using upload heaps to transfer static data like vert buffers is not 
		// recommended. Every time the GPU needs it, the upload heap will be marshalled 
		// over. Please read up on Default Heap usage. An upload heap is used here for 
		// code simplicity and because there are very few verts to actually transfer.
		ThrowIfFailed(m_device->CreateCommittedResource(
			&CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_UPLOAD),
			D3D12_HEAP_FLAG_NONE,
			&CD3DX12_RESOURCE_DESC::Buffer(vertexBufferSize),
			D3D12_RESOURCE_STATE_GENERIC_READ,
			nullptr,
			IID_PPV_ARGS(&m_vertexBuffer)));

위에서 만들어둔 삼각형 vertex정보를 저장한 배열의 크기를 저장하고 

CreateCommitedResource라는 메소드를 통해서 ID3D12Resource형인 m_vertexBuffer를 생성 했다.

 

 

		// Copy the triangle data to the vertex buffer.
		UINT8* pVertexDataBegin;
		CD3DX12_RANGE readRange(0, 0);		// We do not intend to read from this resource on the CPU.
		ThrowIfFailed(m_vertexBuffer->Map(0, &readRange, reinterpret_cast<void**>(&pVertexDataBegin)));
		memcpy(pVertexDataBegin, triangleVertices, sizeof(triangleVertices));
		m_vertexBuffer->Unmap(0, nullptr);

Map과 Unmap 사이에 memcpy를 통해서 삼각형 데이터를 Vertex Buffer에 복사를 한다.

 

 

		// Initialize the vertex buffer view.
		m_vertexBufferView.BufferLocation = m_vertexBuffer->GetGPUVirtualAddress();
		m_vertexBufferView.StrideInBytes = sizeof(Vertex);
		m_vertexBufferView.SizeInBytes = vertexBufferSize;

그리고 정점 버퍼 뷰를 초기화 하는 코드로 이번글의 코드 내용이 끝이 났다.

 

다음 글은 텍스쳐 생성에 관한 글이 될 예정이다.

 

여기서는 이전 프로젝트에 없던 코드이므로 글이 길어질 예정이다 ㅠㅠ(윽)

 

 

다음글에서 ...

 

 

반응형