시작하기 앞서

위의 사진이 오늘 알아볼 래스터라이저와
프래그먼트 셰이더 과정을 통한 결과물이다.
래스터라이저
이전까지 배운 내용으로는 버텍스 셰이더로부터 클립 공간(NDC)에 맞춰진
다양한 정점 정보들을 구상하는 데까지 알아보았다.
이렇게 구상된 정점들의 정보를 래스터라이저에 넘기게 되면
래스터라이저 내부에서는 해당 정점 정보를 바탕으로
프리미티브(삼각형)를 구상하고 삼각형 내부에 채워질
픽셀들을 위해 프래그먼트를 생성하게 된다,
여기서 프래그먼트란, 픽셀의 후보를 뜻한다.
나중에 출력 병합 과정에서 말하겠지만
z버퍼, 알파 값에 따라 출력 여부가 결정되기 때문이다.
기본적인 설명은 이러하고 지금부터 제대로
래스터라이저가 하는 일을 알아보도록 하겠다.
- 뷰포트 변환 : 클립 공간(NDC) -> 스크린 공간
- 스캔 변환 : 삼각형을 이루는 프래그먼트 생성
- 정점 정보들을 보간
이렇게 3가지로 이루어진다

뷰포트 변환
래스터라이저 과정 이전의 픽셀들은
클립 공간(NDC)이라는 곳에 위치해 있는데
이를 우리가 모니터로 바라보는
Window 창에 맞춰서
다시 2x2x1 사이즈를 해상도에 맞춰
늘이는 과정을 뷰포트 변환을 통해 실행하게 된다.
스캔 변환
이제 정점에 대응하는 삼각형이 화면에 출력되어
제대로 보이기 위해 삼각형 내부를 채워주어야 하는데
우선 내부의 삼각형들을 채우기 직전
초반에 설명하였던 프래그먼트(픽셀 후보)라는 단어를 기억하는가?
그렇다. 스캔 변환 과정에서는 픽셀들을 직접 만들어 화면에 보이게끔
하지는 않지만 나중에 걸러질 픽셀들을 위해 미리 프래그먼트를
생성하는 과정을 하게 된다.
보간
프래그먼트들을 모두 생성하였다면 정점의 색상 정보를
바탕으로 프래그먼트에 채워질 색상들을 아래 사진처럼
보간 하게 되는데,
아직 현재 과정에서는 픽셀이 되지 않았기 때문에
아래 사진처럼 출력되진 않을 것이다.
다만 각 프래그먼트 마다 보간 된 정보들을 지니고 있을 뿐이다.

프래그먼트 셰이더
그래픽 파이프라인에서 가장 성능에 민감한 부분인
프래그먼트 셰이더는 앞 과정들을 거쳐 나온
수많은 프래그먼트들과 그에 해당하는 정보들을 가지고
프래그먼트 셰이더를 작동하게 한다.
만약 삼각형에 프래그먼트 개수가 1000개 있다고 가정하면
프래그먼트 셰이더는 1000번 실행되게 된다.
출력 병합
알파 값과 깊이 값을 통해
실제 픽셀이 화면에 그려질지, 또는 혼합될지
탈락될지를 이 과정에서 결정하게 된다
이 과정을 통해 출력이 결정되면 픽셀 후보에서
픽셀로 결정된다.
아래 사진의 큰 삼각형을 보면
깊이 버퍼에 의해 작은 삼각형 부분이
출력이 안된 것을 확인할 수 있다.


이상으로 래스터라이저와 프래그먼트 셰이더를 알아보며, 렌더링 파이프라인에 대한
모든 설명을 마치도록 하겠다. 셰이더를 다루는 데 있어 렌더링 파이프라인의 과정을
아는 것은 큰 도움이 될 테니, 이 블로그를 통해 도움을 얻었으면 좋을 바람이다.
레퍼런스 사이트
http://beyondthegeek.com/2019/04/08/opengl-rendering-pipeline/
OpenGL Rendering Pipeline | Chang Min Park
beyondthegeek.com
'필수 지식 > 셰이더' 카테고리의 다른 글
| [Shader] 렌더링 파이프라인(2) 정점 조립과 버텍스 셰이더 (0) | 2022.01.22 |
|---|---|
| [Shader] 렌더링 파이프라인(1) 그래픽스 API 초기화 과정 (0) | 2022.01.16 |