[아티스트를 위한 유니티 URP 셰이더 입문]2. 셰이더란 무엇인가? (2/2)
2. 셰이더란 무엇인가? - 5 ~ 9
1. 셰이더의 간단 정의
2. CPU vs GPU
3. 3D 폴리곤이 화면에 그려지는 과정
4. 렌더링과 셰이더
5. Grapics API
6. 버텍스 셰이더와 픽셀 셰이더
7. 보간기(Interpolator)
8. 픽셀 셰이더 vs 프래그먼트 셰이더
9. 셰이더는 시뮬레이션이 아닌 단순화 연산
5. Graphics API
* 셰이더 : Graphics API의 파이프라인 중 일부
1) API : Application Programming Interface
- 다양한 하드웨어, 운영체제에서 Graphics 렌더링을 쉽게 제어할 수 있도록 개발된 프로그래밍 인터페이스
-> 유니티 : 셰이더 언어(ShaderLab)와 HLSL 문법만 알면, API나 멀티 플랫폼에 관한 문제는 엔진이 알아서 해결해줌
- 종류 : DirectX, Direct3D - Microsoft / OpenGL, Vulkan : 크로노스 그룹 / Metal : Apple
2) Direct3D의 그래픽 파이프라인
- 직사각형 : 프로그래밍 x (하드웨어 처리)
- 라운드 사각형 : 프로그래밍 o (버텍스 셰이더, 픽셀 셰이더, ...)
1) Input-Assembler (입력 어셈블러)
2) 버텍스 셰이더 (꼭짓점 셰이더)
3) Hull Shader (헐 셰이더)
4) Tessellation(분할기)
5) Domain Shader (도메인 셰이더)
6) Geometry Shader (기하 도형 셰이더)
7) Rasterizer (래스터라이저)
8) Pixel Shader (픽셀 셰이더)
9) Output Merger (출력 병합기)
6. 버텍스 셰이더와 픽셀 셰이더
1) 버텍스 셰이더 : 3D 폴리곤의 버텍스(정점) 위치가 2D 모니터 화면의 어디인지 2D 위치를 계산
-> 이렇게 계산된 위치 : 래스터라이저에 전달돼서, 어느 픽셀이 폴리곤 내부의 픽셀인지 자동 계산해서 픽셀 셰이더에 픽셀들을 전달
* 2D 모니터 화면의 위치 계산, 그 외 역할
- 아웃라인 셰이더 : 아웃라인을 위해 한 번 더 그리는데, 폴리곤이 조금 두껍게 보이도록 버텍스를 조금 이동해서 그리는 방식 (이동 방향 : 버텍스의 노멀 방향)
https://youtu.be/d89qqVGUHtA?si=hHp-J0LNFBT8EsC0
- 파도 치는 바다 표면, 바람에 흔들리는 나무 표현
https://youtu.be/ANYw27KHIo8?si=t6g4_TBe3KIiNoro
2) 픽셀 셰이더 : 픽셀의 색 결정
* 버텍스 셰이더, 픽셀 셰이더 중요한 차이 : 실행되는 횟수
- 화면 고해상도 : 픽셀 수 증가
-> 버텍스 셰이더 실행 횟수 : 일정
-> 픽셀 셰이더 실행횟수 : 늘어난 픽셀 수만큼 더 많이 실행
7. 보간기(Interpolator)
* 보간 (Interpolation)
ex. Gradient 도구 : 시작과 끝 컬러 지정 -> 중간 컬러 자동으로 완성
중간 값들 : 보간되는 값
* 보간기
- 래스터라이저 스테이지에서 수행
- 버텍스와 버텍스 사이에 있는 픽셀들에 대해서 버텍스의 값을 보간해서 적용
- 일반적으로 보간되는 값들 : UV, 버텍스 컬러, 노멀 벡터 등
ex) 버텍스 컬러가 보간되어, 픽셀 셰이더로 전달되는 과정
세 버텍스에 빨강, 파랑, 초록의 버텍스 컬러 적용
-> 버텍스 사이를 채우는 픽셀들 : 버텍스의 거리 비율만큼 보간된 색 적용
+) 삼각형 내부의 보간 : 무게 중심 좌표(Barycentric Coordinates) 사용
+) 참고 링크
Raterization - Perspective Correct Interpolation and Vertex Attributes
Rasterization
As mentioned in the previous chapter, barycentric coordinates can be used to interpolate any variables at the triangle vertex positions. So far, we have used them to find the z-coordinate of the point on the 2D triangle that projects to the pixel center. H
www.scratchapixel.com
8. 픽셀 셰이더 vs 프래그먼트 셰이더
픽셀 셰이더, 프래그먼트 셰이더 : 혼용되어 사용
-> 문맥과 정황을 생각해서 이해 !
픽셀 : 최종적으로 모니터에 보이는 점
프래그먼트 : 래스터라이저에서 생성한 점
파편, 조각, 단편 -> 래스터라이저에서 만들어진 이 파편은, 아직 최종적으로 모니터에 픽셀이 되기 전의 조각들
* 파편(프래그먼트)들이 픽셀이 되기 위한 과정
- 다른 조각에 의해 가려졌는지 비교
- 스텐실 검사 통과
- 안티 앨리어싱(Anti-Aliasing) 처리
-> 정확한 표현 : 프래그먼트 셰이더
* 픽셀 셰이더라고 표현한 이유 : 셰이더 익숙하지 않은 아티스트에게, 프래그먼트보다 픽셀이 더 익숙하기 때문
-> 프래그먼트 셰이더 명칭 사용할 것 !
+) 참고
- Pixel vs Fragment Shader
https://community.khronos.org/t/pixel-vs-fragment-shader/52838/2
Pixel vs. Fragment Shader
What exactly is the difference between a Fragment Shader and a Pixel Shader, or are they just different names for the same thing? Fragment shaders are a more accurate name for the same functionality as Pixel shaders. They aren’t pixels yet, since the out
community.khronos.org
- Fragment Shader
https://www.khronos.org/opengl/wiki/Fragment_Shader
Fragment Shader - OpenGL Wiki
A Fragment Shader is the Shader stage that will process a Fragment generated by the Rasterization into a set of colors and a single depth value. The fragment shader is the OpenGL pipeline stage after a primitive is rasterized. For each sample of the pixels
www.khronos.org
9. 셰이더는 시뮬레이션이 아닌 단순화 연산
대부분의 실시간 렌더링(게임 그래픽 렌더링) : 높은 프레임 레이트 유지를 위해, 복잡한 셰이더 연산을 최대한 자제
현실적이고 물리적으로 정확한 렌더링을 추구하지만, 다소 부정확하더라도 빠르고 가벼운 셰이더 연산을 사용
만약, 원칙대로 정직하게 시뮬레이션을 한다면 하나의 프레임을 완성하는데 몇 시간이 걸리기도 할 것
= 1초에 60프레임을 완성해야 하는 실시간 렌더링에서는 시도할 수 없는 방식
-> 이런 제약은 HW, SW 발달로 점차 개선되겠지만 한동안은 계속될 것