응애맘마조
220105 강의 본문
IA의 마지막 3일차입니다.
오늘은 Shader(셰이더)에 대해서 했었습니다.
어제에 이어서 hlsl에 대해서 좀 더 배웠습니다.
이 hlsl에서는 중단점을 찍으면 중단점 자체에 오류가 생깁니다.
하지만 컴파일 대상이 되지 않아서 할 수가 없는데 렌더링 파이프라인을 거쳐 모니터에 출력이 되려면 반드시 컴파일을 해야 됩니다.
컴파일 대상이 아니지만 바인딩을 하는 방법이 있습니다. 셰이더 클래스가 있는데 그 안에 있는 자원들이 하게 됩니다.
cpp파일을 보면 char, wchar_t, string, wstring이 있습니다.
char은 아스키코드에 있는 문자 하나를 출력합니다. (그 이외의 문자는 출력할 수 없습니다.)
wchar_t는 2바이트로 된 문자도 출력이 가능합니다.
string은 아스키코드에 있는 2개 이상의 문자열을 출력합니다. (그 이외의 문자는 출력할 수 없습니다.)
wstring은 2바이트로도 된 문자열도 출력이 가능합니다.
w가 붙고 안 붙고의 차이점을 잘 모르고 있었는데 이제야 알게 되었습니다.
위의 파일들을 컴파일하기 위해서는 wstring으로 경로를 적어서 조합하여 작성합니다.
wstring path = L"../Shaders/" + file + L".hlsl";
위의 코드처럼 작성하면 됩니다.
cpp파일을 살펴보면
ID3D10Blob* VsBlob;
ID3D10Blob* PsBlob;
Blob이라고 적혀 있습니다. Binary Large OBject의 줄임말로 2진법으로 된 데이터를 저장합니다.
작성하고 컴파일하기 위해서는
D3DCompileFromFile(path.c_str(), nullptr, D3D_COMPILE_STANDARD_FILE_INCLUDE,
"VS", "vs_5_0", flags, 0, &VsBlob, nullptr);
위의 코드를 작성합니다.
D3DCompileFromFile은 파일을 컴파일한다는 뜻으로
path.c_str()은 경로를 C언어 스타일로 작성했다는 뜻이고
VS는 VertexShader의 함수 이름을 적었습니다.
&VsBlob은 기계어로 컴파일된 내용을 &VsBlob안에 저장한다는 의미입니다.
D3D->GetDevice()->CreateVertexShader(VsBlob->GetBufferPointer(), VsBlob->GetBufferSize(),
nullptr, &vertexShader);
그 후에 위의 코드를 작성합니다.
버퍼를 생성해서 Create로 생성합니다.
GetBufferPointer()는 위의 VsBlob에 저장된 값의 시작점부터
GetBufferSize()를 통해 내용의 끝까지 넣는다는 의미입니다.
그 후에 &vertexShader에 이 내용을 저장합니다.
VsBlob->Release();
끝났으면 Release()를 통해 더 이상 사용되지 않는 VsBlob의 메모리를 해제하고 PS(픽셀 셰이더)로 넘어갑니다.
D3DCompileFromFile(path.c_str(), nullptr, D3D_COMPILE_STANDARD_FILE_INCLUDE,
"PS", "ps_5_0", flags, 0, &PsBlob, nullptr);
D3D->GetDevice()->CreatePixelShader(PsBlob->GetBufferPointer(), PsBlob->GetBufferSize(),
nullptr, &pixelShader);
PsBlob->Release();
PS도 VS랑 코드는 글자만 다르고 똑같습니다. 따로 설명하지는 않겠습니다.
D3D->GetDC()->VSSetShader(vertexShader, 0, 0);
D3D->GetDC()->PSSetShader(pixelShader, 0, 0);
D3D->GetDC()->IASetInputLayout(vertexLayout);
그다음 VS와 PS를 IA에 바인딩합니다.
vertexShader->Release();
pixelShader->Release();
vertexLayout->Release();
바인딩이 끝나면 마지막으로 Release()를 통해 메모리를 해제합니다.
이로써 IA에 대한 모든 설명이 끝났습니다. 내일부터는 VS에 대해서 배웁니다.
읽어주셔서 감사합니다.