응애맘마조

220105 강의 본문

공부/2D강의

220105 강의

TH.Wert 2023. 1. 5. 23:55

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에 대해서 배웁니다.

읽어주셔서 감사합니다.

'공부 > 2D강의' 카테고리의 다른 글

230109 강의  (0) 2023.01.09
220106 강의  (0) 2023.01.07
230104 강의  (0) 2023.01.05
230103 강의  (0) 2023.01.03
230102 강의  (0) 2023.01.02
Comments