이제 본격적으로 Dx11을 이용하여 메쉬(mesh)를 만들고 화면에 그려보자.
제일 처음 해줘야 할건 정정정보를 생성해줘야 한다.
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);
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가지 셰이더 포인터이다.
위의 그림처럼 컴파일된 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 :구식문법을 엄밀히 체크해서 금지한다(디폴트는 체크하지 않음)