728x90
반응형
01. 셰이더(Shader)의 간단 정의
- 셰이더는 모니터 화면에 그려지는 픽셀의 색을 결정하는 프로그램이고, GPU 내부에서 실행된다.
02. CPU vs GPU
- 위의 영상은 CPU와 GPU의 차이를 재미 있게 설명하는 NVIDIA의 영상이다.
- CPU - 복잡하고 다양한 연산을 수행하지만 순차적으로 하나씩 처리한다.
- GPU - 단순하고 정해진 연산을 수행하지만 동시에 병렬 처리한다.
- 셰이더란 위의 영상과 같이 모나리자를 구성하는 여러 픽셀들 하나마다 수행되는 작은 프로그램이라고 생각하면 되며, GPU에서 실행되기 때문에 여러 픽셀에 대해서 동일한 셰이더가 동시에 실행된다.
- 1~2번은 그래픽 리소스를 준비하는 단계
- 3~8번은 렌더링(Rendering) 과정이다.
- 5번과 7번이 셰이더이다.
04. 렌더링과 셰이더
- 셰이더가 픽셀의 색을 결정하는데 필요한 정보는 다음과 같다.
- 폴리곤을 비추는 빛의 방향(각도) - 노란 화살표
- 픽셀이 위치한 3D 폴리곤 표면의 방향(각도) - 초록 화살표
- 폴리곤 주변 환경의 밝기 - Ambient
- 픽셀이 위치한 3D 폴리곤 표면의 재질 정보 - Smoothness, metallic
06. 버텍스 셰이더와 프래그먼트 셰이더
버텍스 셰이더(Vertex Shader)
- 버텍스 셰이더는 픽셀 셰이더보다 앞서 실행된다.
- 버텍스 셰이더의 역할은 3D 폴리곤의 정점(Vertex) 위치가 2D 모니터 화면의 어디인지 2D 위치를 계산한다.
- 계산된 위치는 래스터라이저(Rasterizer)에 전달되어서 어느 픽셀이 폴리곤 내부의 픽셀인지 자동 계산해서 프래그먼트 셰이더에 픽셀들을 전달한다.
- 버텍스 셰이더는 아웃라인(Outline) 셰이더, 파도치는 바다 표면이나 바람에 흔들리는 나무의 표현에도 사용된다.
- 버텍스 셰이더와 픽셀 셰이더의 중요한 차이 중 하나는 실행되는 횟수이다.
- 화면 해상도가 고해상도여서 픽셀 수가 많아져도 버텍스 셰이더의 실행횟수는 일정하다. 하지만, 프래그먼트 셰이더는 늘어난 픽셀 수만큼 더 많이 실행된다.
- 대부분의 경우 3D 화면 안에는 버텍스보다 픽셀이 더 많기 때문에 최적화를 목적으로 UV 연산이나 간단한 라이팅 등을 버텍스 셰이더에서 처리하는 경우도 있다.
- 버텍스 기준으로 계산된 값들은 래스터라이저의 보간기(Interpolator)에 의해 모든 픽셀에 적절한 값으로 보간(Interpolation)되어서 전달된다.
- 보간된 값은 부정확하므로 주의해서 사용해야한다.
- 가장 일반적으로 보간되는 값들은 UV, 버텍스 컬러, 노멀 벡터 등이다.
- 자세한 내용은 [OpenGL ES를 이용한 3차원 컴퓨터 그래픽스 입문] 챕터 7 - 래스터라이저 참고
[OpenGL ES를 이용한 3차원 컴퓨터 그래픽스 입문] 챕터 7 - 래스터라이저
정점 쉐이더가 출력한 정점들은 프리미티브로 다시 조립된다. 스크린에 그려질 형태로 변환된 후 프래그먼트로 분해되는데 이를 래스터화(rasterization)라고 부른다. (GPU 파이프라인의 래스터라이
j1y00h4.tistory.com
08. 픽셀 셰이더 vs 프래그먼트 셰이더
- 픽셀
- 최종적으로 모니터에 보이는 점
- 프래그먼트
- 래스터라이저에서 생성한 점
- 래스터라이저에서 만들어진 이 파편(프래그먼트)은 아직 최종적으로 모니터에 픽셀이 되기 전의 조각들
- 픽셀이 되기 위해 다른 조각에 의해 가려졌는지 비교도 해야 하고 스텐실 검사도 통과하고 안티 앨리어싱(Anti-Aliasing)처리도 해야 최종적으로 픽셀이 될 자격을 갖추게 된다.
09. 셰이더는 시뮬레이션이 아닌 단순화 연산
- 대부분의 실시간 렌더링. 특히 게임 그래픽 렌더링은 높은 프레임 래이트를 유지하기 위해 복잡한 셰이더 연산을 최대한 자제한다.
- 다소 부정확하더라도 빠르고 가벼운 셰이더 연산을 사용한다.
- <아티스트를 위한 유니티 URP 셰이더 입문>을 읽고 정리한 내용입니다.
728x90