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하게 그려진 것이 아니라 병렬적으로 그려졌다는 것을 의미한다.
더 자세한 내용이 궁금하시다면 직접 들어보시는 걸 추천드립니다!
'Game Dev > DirectX' 카테고리의 다른 글
DirectX 11 2D 게임 프로그래밍 - 10. 행렬을 이용한 공간 생성(view, projection) (0) | 2021.10.28 |
---|---|
DirectX 11 2D 게임 프로그래밍 - 9. Index Buffer & 공간 변환 (0) | 2021.10.27 |
DirectX 11 2D 게임 프로그래밍 - 7. Vertex Shader Stage (0) | 2021.10.25 |
DirectX 11 2D 게임 프로그래밍 - 6. Input Assembler Stage 세팅하기 (0) | 2021.10.24 |
DirectX 11 2D 게임 프로그래밍 - 5. Window 창에 DirectX 연결(연동)하기 (0) | 2021.10.24 |
Comments