KoreanFoodie's Study

DirectX 11 2D 게임 프로그래밍 - 8. Pixel Shader Stage & 도형 그리기 본문

Game Dev/DirectX

DirectX 11 2D 게임 프로그래밍 - 8. Pixel Shader Stage & 도형 그리기

GoldGiver 2021. 10. 27. 21:58


DirectX 11 2D 게임 프로그래밍 - 8. Pixel Shader Stage & 도형 그리기

Rasterizer : 3D 데이터를 2D 데이터로 바꿔주는 것. VS 단계에서 정규화한 공간을 다시 보여줄 영역만큼 다시 늘려준다. 또한 Pixel Shader 단계로 넘어갈 픽셀들을 지정해준다.

 

PixelShader 생성과 연결 : SV_Target 시멘틱을 사용하여 현재 세팅된 메인렌더 타깃을 사용하라고 알려주어야 한다. 화면에 픽셀 단위로 생상을 출력하는데, Pixel Shader는 Rasterizer가 지정한 픽셀 개수만큼 호출된다.

 

사각형 만들기 : 사각형을 만들기 위해서는 정점 6개가 필요하다. 왜냐하면 삼각형 2개를 붙여 만드는 형태이기 때문!

 

여러 줄 동시에 편집하기 : Shift + Alt 키를 이용해 여러 줄을 한 번에 편집할 수 있다.

 

참고 :

1. NDC(Normalized Device Coordinate)

2. 오각형, 육각형, 별 그리기를 통해 Vertex 사용 감각을 익혀보자

 

Color.hlsl

Color.hlsl에 Pixel Shader 진입점 함수를 추가한다.

// shader는 진입점을 기준으로 컴파일 하기에 하나의 파일에 PixelShaer, VertexShader 모두 작성해도 괜찮음

// 진입점 함수
// Pixel Shader : Rasterizer가 지정한 픽셀 개수만큼 호출
float4 PS(PixelInput input) : SV_Target // SV_Target[n] 시멘틱으로 현재 세팅된 메인 렌더러 타겟을 사용하라고 알려준다.
{
	return input.color;
	
}

 

Execute.cpp

Execute.cpp 에 Pixel Shader 블록을 만들어서 관련 정보를 추가한다. 이때 D3DX11CompileFromFileA에서 A는 아스키를 의미한다. W를 쓰면? wchar(WideChar) 형!

	// Pixel Shader
	{
		auto hr = D3DX11CompileFromFileA
		(
			"Color.hlsl",
			nullptr,
			nullptr,
			"PS",
			"ps_5_0",
			0,
			0,
			nullptr,
			&ps_blob,
			nullptr,
			nullptr
		);

		assert(SUCCEEDED(hr));

		hr = graphics->GetDevice()->CreatePixelShader(ps_blob->GetBufferPointer(), ps_blob->GetBufferSize(), nullptr, &pixel_shader);

		assert(SUCCEEDED(hr));

	}

잘 설정했다면, 실제 vertex를 그리는 부분만 수정해주면 된다. 아래 코드에서는 사각형을 구현한다.

	// Vertex Data
	{
		vertices = new VertexColor[6];

		vertices[0].position = D3DXVECTOR3(-0.5f, -0.5f, 0.0f);			//0
		vertices[0].clear_color = D3DXCOLOR(1.0f, 0.0f, 0.0f, 1.0f);

		vertices[1].position = D3DXVECTOR3(-0.5f, +0.5f, 0.0f);			// 1
		vertices[1].clear_color = D3DXCOLOR(0.0f, 1.0f, 0.0f, 1.0f);

		vertices[2].position = D3DXVECTOR3(+0.5f, -0.5f, 0.0f);			// 2
		vertices[2].clear_color = D3DXCOLOR(0.0f, 0.0f, 1.0f, 1.0f);

		vertices[3].position = D3DXVECTOR3(+0.5f, -0.5f, 0.0f);			// 2
		vertices[3].clear_color = D3DXCOLOR(1.0f, 0.0f, 0.0f, 1.0f);

		vertices[4].position = D3DXVECTOR3(-0.5f, +0.5f, 0.0f);			// 1
		vertices[4].clear_color = D3DXCOLOR(0.0f, 1.0f, 0.0f, 1.0f);

		vertices[5].position = D3DXVECTOR3(+0.5f, +0.5f, 0.0f);			// 3
		vertices[5].clear_color = D3DXCOLOR(0.0f, 0.0f, 1.0f, 1.0f);
	}

색깔이 그라데이션 방식으로 겹쳐서 나온 것은, vertex가 serial하게 그려진 것이 아니라 병렬적으로 그려졌다는 것을 의미한다. 

 

 


더 자세한 내용이 궁금하시다면 직접 들어보시는 걸 추천드립니다!

 
Comments