셰이더 언어란? |
셰이더를 조작하는 셰이더언어란 모니터에 출력을 도와주는 그래픽 처리 장치(GPU)의 프로그래밍이 가능한 렌더링 파이프라인을 조작할 수 있는 프로그래밍 언어이다.
렌더링 파이프라인은 크게 Fixed Pipeline과 Programmable Pipeline이 존재하는에 이중에 Shader가 반영화된 파이프라인이 Programmable Pipeline이다.
렌더링 파이프라인의 최종 목표는 컴퓨터 데이터를 모니터의 픽셀까지 뽑아내기 위한 것이다. 해당 파이프라인 안에서 데이터를 조작 할 수 있다.
▷ Shader의 분류
- Vertex Shader
버텍스 파이프 라인에서 동작하는 쉐이더로 버텍스 쉐이더의 주 프로그래밍 요소는 각 정점의 공간을 변환하는 것이다.
- Pixel Shader
픽셀 파이프 라인에서 동작하는 쉐이더로 픽셀 쉐이더는 화면에 출력할 최종 색상을 계산하는 것이다.
화면에 출력되는 순서는 다음과 같습니다.
정점 데이터 -> 정점 셰이더 -> 래스터라이저 -> 픽셀 위치로 변환 -> 픽셀셰이더 -> 색상으로변환 -> 화면
랜더링 파이프라인 |
일반적인 파이프랑니 순서
01. 오브젝트 데이터 받아오기
버텍스(점)로 이루어진 물체의 데이터 값을 받아오고(인덱스 넘버, 포지션, 노멀, 컬러, UV, 등등)
02. 정점(Vertext)쉐이더
오브젝트연산 -> 월드좌표계(오브젝트 x 월드 변환행렬) -> 카메라 좌표계(월드 좌표계 x 카메라 행렬)
->원근 좌표계 (카메라 좌표계 x 프로젝션 행렬)
03. 래스터라이져(Rasterizer)
오브젝트가 모니터에서 표현될 때 어느 픽셀로 표현될 것인지 나타냄.
04 픽셀쉐이더(Pixel Shader) /프레그먼트 쉐이더(Fragment Shader)
배치된 픽셀에 색상이 들어감.
쉐이더 언어의 종류 |
▷ 유니티 쉐이더(ShaderLab)
- 유니티 자체적으로 작동함.
- 제약이 많아서 디테일한것 들어가면 잘 안쓴다고 함.
- 유니티는 멀티플렛폼을 지원함으로서 다양한 쉐이더분기를 자동으로작성해 줌.
▷ CG
- 엔비디아 제작. (이제 업뎃x)
- HLSL과 거의 유사하다고 함.
▷HLSL
- DirectX Microsoft꺼
- 바이트코드로 빌딩된것을 GLSL로 변환할 수도있다고함...(확인필요)
▷ GLSL
- OpenGL꺼
- 가볍다고 함.
유니티 쉐이더 |
유니티는 셰이더는 세가지 방업중 하나로 작성할 수 있습니다.
▷ 표면 셰이더(Surface Shader)
- 빛과 그림자의 영향을 받는 쉐이더입니다.
- 유니티 라이팅 파이프라인과 상호작용하는, 높은 추상화 레벨이 적용된 쉐이더 입니다.
- 복잡한 표면 셰이더를 간결한 방식으로 쉽게 작성할 수 있습니다.
- 조명을 받지 않는다면 표면 셰이더를 사용하지 않는게 낫습니다.
- 사용언어 : ShaderLab + Cg / HLSL
▷ 정점 및 조각 셰이더(Vertex and Fragment Shaders)
- 셰이더가 조명과 상호 작용할 필요가 없거나 표면 셰이더가 처리할 수 없는 경우 사용합니다.
- 필요한 효과를 만드는 가장 유연한 방법이지만 많은 비용이 발생합니다.
- 수동으로 완전 제어가 가능하여 최적화 고급기법.. 어렵습니다.
- 사용언어 Cg / HLSL
▷ 고정 함수 셰이더(Fixed Fuction Shaders)
- 매우 간단한 효과를 위한 레거시 셰이더 구문입니다.
- 가볍고 하드웨어 호환성이 좋지만 기능이 상당히 부족함.
- 거의 지원중단
- Shader Lab
공간좌표 |
▷ 3D 공간개념
물체공간 : 특정 물체의 중심점이 기준(컵의 중심)
월드공간 : 특정 공간의 중심점이 기준(방의 입구) 세계공간이라고도 함.
뷰 공간 : 내 눈에 비치는 영상이 기준 (내눈의 초점)
투영 공간 : 내 눈에 비치는 영상을 2D 이미지에 투영
▷ 엔진의 랜더링 순서.
물체공간 -> X월드 행렬 -> 월드공간 -> X뷰 행렬 -> 뷰 공간 -> X투영행렬 -> 투영공간
참조
- 흑기사님 블로그
- 셰이더 프로그래밍 입문(도서)
- 유니티 DOC1
- 유니티 DOC2
- 셰이더프로그래밍 기초 58P
- 쉐이더의종류