공부중

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

Programing/DirectX

[DirectX12]Hello Wolrd Sample - D3D12HelloTexture - 4

곤란 2018. 6. 5. 15:59
반응형
	// Create the pipeline state, which includes compiling and loading shaders.
	{
		ComPtr<id3dblob> vertexShader;
		ComPtr<id3dblob> pixelShader;

#if defined(_DEBUG)
		// Enable better shader debugging with the graphics debugging tools.
		UINT compileFlags = D3DCOMPILE_DEBUG | D3DCOMPILE_SKIP_OPTIMIZATION;
#else
		UINT compileFlags = 0;
#endif

		ThrowIfFailed(D3DCompileFromFile(GetAssetFullPath(L"shaders.hlsl").c_str(), 
						 nullptr, 
						 nullptr, 
						 "VSMain", 
						 "vs_5_0", 
						 compileFlags, 
						 0, 
						 &vertexShader, 
						 nullptr));
		ThrowIfFailed(D3DCompileFromFile(GetAssetFullPath(L"shaders.hlsl").c_str(), 
						 nullptr, 
						 nullptr, 
						 "PSMain", 
						 "ps_5_0", 
						 compileFlags, 
						 0, 
						 &pixelShader, 
						 nullptr));

		// Define the vertex input layout.
		D3D12_INPUT_ELEMENT_DESC inputElementDescs[] =
		{
			{ "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 },
			{ "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 12, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 }
		};

		// Describe and create the graphics pipeline state object (PSO).
		D3D12_GRAPHICS_PIPELINE_STATE_DESC psoDesc = {};
		psoDesc.InputLayout = { inputElementDescs, _countof(inputElementDescs) };
		psoDesc.pRootSignature = m_rootSignature.Get();
		psoDesc.VS = CD3DX12_SHADER_BYTECODE(vertexShader.Get());
		psoDesc.PS = CD3DX12_SHADER_BYTECODE(pixelShader.Get());
		psoDesc.RasterizerState = CD3DX12_RASTERIZER_DESC(D3D12_DEFAULT);
		psoDesc.BlendState = CD3DX12_BLEND_DESC(D3D12_DEFAULT);
		psoDesc.DepthStencilState.DepthEnable = FALSE;
		psoDesc.DepthStencilState.StencilEnable = FALSE;
		psoDesc.SampleMask = UINT_MAX;
		psoDesc.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE;
		psoDesc.NumRenderTargets = 1;
		psoDesc.RTVFormats[0] = DXGI_FORMAT_R8G8B8A8_UNORM;
		psoDesc.SampleDesc.Count = 1;
		ThrowIfFailed(m_device->CreateGraphicsPipelineState(&psoDesc, IID_PPV_ARGS(&m_pipelineState)));
	}

 

이번 글에서 볼 코드는 위와 같다.

주석에적힌대로 파이프라인 상태를 생성하고 셰이더를 컴파일하고 불러오는 내용 이다.

 

여기서는 이전 프로젝트와 달라진 코드가 이전 글처럼 엄청나게 많지 않다.

위에서부터 차근차근 살펴보자.

 

먼저 vertexShader와 pixelShader를 저장할 공간을 ID3DBlob 형으로 만들어두고

 

디버그 모드일때만

디버그 파일 / 행 / 형식 / 기호 정보를 출력 코드에 삽입하도록 컴파일러에 지시 하는 플래그(D3DCOMPILE_DEBUG)와 

코드 생성시 최적화 단계를 건너뛰는 플래그(D3DCOMPILE_SKIP_OPTIMIATION)를 넣어주었다.

이 플래그들은 바로 하단의 D3DCompileFromFile에서 셰이더를 컴파일할때 사용되며

플래그의 종류와 자세한것은 D3DCOMPILE Constants - MSDN 을 참조 하도록 하자.

 

다음은 D3D12_INPUT_ELEMENT_DESC 형으로 inputElementDecs라는 배열을 만들어 주었는데

저번글에도 설명했지만

D3DHelloTexture.h 에서 선언된 Vertex 구조체를 정의한것에 대한 각각의 성분이 어떤것인지 알려주기 위한 내용이다.

여기서 알려준 내용은 셰이더에서 입력받는 부분(?)과 매칭이 된다.

 

2018/05/22 - [Programing/DirectX] - [DirectX12]Hello Wolrd Sample - D3D12HelloTriangle - 3

이것에 관한 설명은 이전 글로 대체해야겠다.

 

여기서는 저번 프로젝트와 다른점이라면 COLOR이 TEXCOORD로 바뀌었고 ( 컬러값을 주던것이 텍스쳐에서 불러오게되었으므로 )

포맷 방식도 DXGI_FORMAT_R32G32B32A32_FLOAT에서 DXGI_FORMAT_R32G32_FLOAT로 바뀌었다.

 

음... 왜 저런 포맷을 줬는지는 모르겠지만 추후에 다시 생각해 보도록 해야겠다.

(RGB도 아니고 RG...? 출력은 검흰검흰 바둑판인데... 하단에서 왜 그런지 살펴봐야겠다...)

 

다음 라인은 이전 프로젝트와 다를것이 없다.

파이프라인 상태 오브젝트(PSO - pipeline state object)를 서술하고

디바이스에서 CreateGraphicsPipelineState를 통해서 PSO를 만들어 주었다.

 

이전 코드에 비해서 바뀐점이 얼마 없어서 글이 짧게 끝이 났다.

 

다음글에서는 Vertex Buffer 생성에 대해서 적을 예정이다.

 

다음글에서....

 

 

 

 

 

 

반응형