[DirectX11] 4. 삼각형 그리기

유기태·2023년 12월 5일
0

DirectX강의 필기

목록 보기
5/14

#ifndef (정의자)
#define (정의자)
(본문)
#endif

-> 이 문법 같은 경우 C문법 스타일이며, ifndef에 정의자가 선언되어 있지 않을 경우에 해당 본문을 정의해달라는 말이다.

shader 코드는 프로그램이 실행중에 해당 주소로부터 shader 파일을 사용하기 때문에 winapi 당시에 사용하던 resource와 같은 맥락을 가진다.

Blob객체 생성

// 버텍스 쉐이더
// HLSL 버텍스 쉐이더 함수 컴파일
// parameter
// 1. 쉐이더 파일 경로
// 2. nullptr
// 3. D3D_COMPILE_STANDARD_INCLUDE
// 4. entryPoint
// 5. hlsl 파일 버전
// 6. debug msg(D3DCOMPILE_DEBUG)
// 7. 0
// 8. 생성된 Blob 객체 반환
// 9. error 용도 blob 객체 반환
// D3DCompileFromFile();

버텍스 쉐이더 및 픽셀 쉐이더 생성

bufferpointer , size, nullptr, 버텍스 정보
DEVICE->CreateVertexShader()
DEVICE->CreatePixelShader()

해당 함수들은 setting 함수들이기때문에 셋팅 순서는 상관없음 결국
DrawCall 형태로 rendering pipeline을 거치기 때문

layout 위상 도형

-> layout은 buffer 넘겨준 정점의 구조를 알려주는 객체
-> 위상 도형은 그 정점을 토대로 만들 도형의 구조를 알려주는 객체
-> Semantic name 일치
-> semantic name이 동일할 경우 index로 구분(그래서 POSITION 시멘틱은 사실 뒤에 0이 생략되어 있는거라 보면 된다.)

InputLayOutSetting with float3 pos float4 Color float2uv

// 정점 구조정보(Layout) 생성
	D3D11_INPUT_ELEMENT_DESC arrElement[3] = {};

	arrElement[0].InputSlot = 0;
	arrElement[0].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA;
	arrElement[0].SemanticName = "POSITION";
	arrElement[0].SemanticIndex = 0;
	arrElement[0].AlignedByteOffset = 0;
	arrElement[0].InstanceDataStepRate = 0;
	arrElement[0].Format = DXGI_FORMAT_R32G32B32_FLOAT;

	arrElement[1].InputSlot = 0;
	arrElement[1].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA;
	arrElement[1].SemanticName = "COLOR";
	arrElement[1].SemanticIndex = 0;
	arrElement[1].AlignedByteOffset = 12;
	arrElement[1].InstanceDataStepRate = 0;
	arrElement[1].Format = DXGI_FORMAT_R32G32B32A32_FLOAT;

	arrElement[2].InputSlot = 0;
	arrElement[2].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA;
	arrElement[2].SemanticName = "TEXCOORD";
	arrElement[2].SemanticIndex = 0;
	arrElement[2].AlignedByteOffset = 28;
	arrElement[2].InstanceDataStepRate = 0;
	arrElement[2].Format = DXGI_FORMAT_R32G32_FLOAT;
    
    DEVICE->CreateInputLayout(arrElement, 3, g_VSBlob->GetBufferPointer(), g_VSBlob->GetBufferSize(), g_Layout.GetAddressOf());
DEVICECONTEXT->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY::D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
DEVICECONTEXT->IASetInputLayout(g_Layout.Get());

※레스터라이제이션 단계에서

정점 안의 픽셀 정보들을 생성함과 동시에 색깔은 해당 정점들의 거리를 비율로 100%안에서 나눠서 색깔을 표현하는 선형보간을 한다. 이는 픽셀 쉐이더전에 일어나는 일이다.

DirecX 기준 UV좌표계는 좌상단 (0,0)을 기준으로 한다. 텍스쳐를 UV 좌표에 적용하여 해당 좌표에 색깔을 가져오는 방법으로 텍스쳐를 표현한다.

profile
게임프로그래머 지망!

0개의 댓글