이제 본격적으로 Dx11을 이용하여 메쉬(mesh)를 만들고 화면에 그려보자.

제일 처음 해줘야 할건 정정정보를 생성해줘야 한다.

  1. 삼각형을 그리기위한 정점 값들을 세팅해보자

  	renderer::vertexes[0].pos = Vector3(0.f, 0.5f, 0.0f);
		renderer::vertexes[0].color = Vector4(0.0f, 1.0f, 0.0f, 1.0f);

		renderer::vertexes[1].pos = Vector3(0.5f, -0.5f, 0.0f);
		renderer::vertexes[1].color = Vector4(1.0f, 0.0f, 0.0f, 1.0f);

		renderer::vertexes[2].pos = Vector3(-0.5f, -0.5f, 0.0f);
		renderer::vertexes[2].color = Vector4(0.0f, 0.0f, 1.0f, 1.0f);
  1. 셰이더를 생성해준다. ( 정점셰이더, 픽셀셰이더 )
DWORD shaderFlags = D3DCOMPILE_ENABLE_STRICTNESS;
		shaderFlags |= D3DCOMPILE_DEBUG;
		shaderFlags |= D3DCOMPILE_SKIP_OPTIMIZATION;

		//vertex shader
		{
			ID3DBlob* errorBlob = nullptr;
			D3DCompileFromFile(L"..\\\\Shaders_SOURCE\\\\TriangleVS.hlsl", nullptr, D3D_COMPILE_STANDARD_FILE_INCLUDE
				, "main", "vs_5_0", shaderFlags, 0, &renderer::vsBlob, &errorBlob);

			mDevice->CreateVertexShader(renderer::vsBlob->GetBufferPointer()
				, renderer::vsBlob->GetBufferSize(), nullptr, &renderer::vsShader);
		}

		//pixel shader
		{
			ID3DBlob* errorBlob = nullptr;
			D3DCompileFromFile(L"..\\\\Shaders_SOURCE\\\\TrianglePS.hlsl", nullptr, D3D_COMPILE_STANDARD_FILE_INCLUDE
				, "main", "ps_5_0", shaderFlags, 0, &renderer::psBlob, &errorBlob);

			mDevice->CreatePixelShader(renderer::psBlob->GetBufferPointer()
				, renderer::psBlob->GetBufferSize(), nullptr, &renderer::psShader);
		}

셰이더 오브젝트

셰이더 코드를 바이트 코드로 컴파일 하고서 바이트 코드를 가지고 셰이더 오브젝트 인터페이스를 만든다. 각 셰이더 오브젝트를 생성하는건 위와 같다.

셰이더를 생성하는 각 함수의 인자는 순서대로 바이트 코드의 포인터, 해당 사이즈, ClassLinkage 포인터 등 3가지 셰이더 포인터이다.

Untitled

위의 그림처럼 컴파일된 HLSL의 바이트코드는 임의의 길이를 가지는 데이터를 리턴하기 위해 사용되는 ID3DBlob 인터페이스를 사용한다

( ID3DBlob 가 컴파일된 바이트코드를 담아두는 역할을 하며 번거롭더라도 ID3DBlob 를 경유해야 함)

//셰이더 컴파일 옵션

#if defined(DEBUG) || defined(_DEBUG)
UINT g_flagCompile = D3D10_SHADER_DEBUG | D3D10_SHADER_SKIP_OPTIMIZATION
                    | D3D10_SHADER_ENABLE_STRICTNESS | D3D10_SHADER_PACK_MATRIX_COLUMN_MAJOR;
#else
UINT g_flagCompile = D3D10_SHADER_ENABLE_STRICTNESS | D3D10_SHADER_PACK_MATRIX_COLUMN_MAJOR;
#endif

    // 버텍스 셰이더 코드 컴파일
    ID3DBlob* pBlobVS = NULL;
    hr = D3DX11CompileFromFile(
            L" Tutorial02.fx ",  // 파일명
            NULL,          // 매크로정의(없음)
            NULL,          // 인클루드 파일 정의(없음)
            "VS",          //  해당 셰이더의 메인 함수 이름
            "vs_4_0",      // 버텍스 셰이더로 컴파일 (버전 4.0)
            g_flagCompile, // 컴파일 옵션
            0,             // 이펙트 컴파일 옵션(없음)
            NULL,          // 바로 컴파일하고 나서 함수를 뺀다。
            &pBlobVS,      // 컴파일된 바이트 코드
            NULL,          // 에러 메시지는 필요없음
            NULL);         // 반환값

D3D10_SHADER_DEBUG  : 디버그 정보 포함

D3D10_SHADER_SKIP_OPTIMIZATION :최적화를 수행하지 않는다

D3D10_SHADER_ENABLE_STRICTNESS :구식문법을 엄밀히 체크해서 금지한다(디폴트는 체크하지 않음)