셰이더
3D 공의 모형은 수백 개의 삼각형으로 이루어져 있다.
정점 : 각 삼각형들의 꼭짓점
공을 표현하기 위해 모든 정점을 "정점 버퍼(Vertex Buffer)"라고 부르는 특별한 데이터 배열에 넣어줘야 한다.
셰이더 : 화면에 출력할 픽셀의 위치와 색상을 계산하는 함수
셰이딩 : 컴퓨터에 입력된 모델에 입체감을 부여하기 위해 각 명의 광원으로 부터 거리, 각도, 색채, 명암등을 계산하여 입체 표면에 음영 처리하는 기법
1. 인덱스 버퍼 (IB, Index Buffers)
정점 버퍼와 관련 O
정점 버퍼에 있는 각 정점들이 연결되는 순서를 기록 -> GPU는 인덱스 버퍼를 이용하여 빠르게 정점 버퍼에서 필요한 몇몇 정점들을 찾아낸다.
인덱스 버퍼는 원하는 것을 빠르게 찾게 도와준다는 점에서 책의 목차와 같다고 본다.
DirectX SDK 문서에서는 인덱스 버퍼의 사용이 비디오 메모리에서의 정점 데이터의 캐싱의 가능성을 높여준다고 하여 성능적인 측면에서도 인덱스 버퍼의 사용은 권장
2. 정점 셰이더 (VS, Vertex Shaers)
정점 버퍼의 정점들을 3D공간으로 변환시켜 주는 작은 프로그램
정점 셰이더 프로그램은 GPU에서 계산이 필요하다고 판단될 때 호출된다.
ex) 5000개의 폴리곤을 가진 모델을 표시한다면, 이 모델은 매 프레임마다 15,000개의 정점 셰이더 프로그램이 실행된다.
60 fps의 프로그램에서는 5,000개의 삼각형을 그리기 위해 매초 900,000번의 정점 셰이더를 호출하게 된다.
효율적인 정점셰이더를 작성하는 것이 중요
3. 픽셀 셰이더 (PS, Pixel Shaders)
그리고자 하는 도형에 색상을 입힐 때를 위한 작은 프로그램
모든 픽셀들에 대해 GPU에서 연산
색 입히고(coloring), 텍스쳐 입히고(texturing), 광원효과(lighting), 그 외 다른 많은 도형 채색 효과를 주는 것을 픽셀 셰이더 프로그램에서 제어
GPU에 의해 수없이 호출되기에 효율적으로 작성
4. HLSL(High Level Shader Language) - 셰이더 언어
DirectX 11에서 사용하는 작은 정점 및 픽셀 셰이더 프로그램등 셰이더를 작성할 때 사용하는 언어
미리 정의된 타입이 있다는 것을 제외하면 C언어와 거의 동일
전역변수, 타입 정의,. 정점 셰이더, 픽셀 셰이더, 기하 셰이더(Geometry Shader, Direct3D 10에서 추)로 구성
HLSL 장점
- 고수준의 언어이기에 가독성이 좋고 관리에도 이점이 있다.
- 다른 셰이더 버전에서도 통용되는 코드를 만들 수 있다.
- C와 C++과 유사한 문법을 가지고 있기에 배우기 쉬운 편이다.
5. GLSL (OpenGL Shading Language) - 셰이더 언어
OpenGl의 표준 셰이딩 언어
C언어를 기초로 하는 셰이딩 언어이며, 개발자가 그래픽스 파이프라인을 직접 제어할 수 있는 언어
GLSL 장점
- 매킨토시, 윈도, 리눅스 등 여러 운영체제 간의 호환성을 지원
- GLSL을 지원하는 어떤 제조사의 그래픽카드에서도 셰이더 사용 가능
- 그래픽 카드 장치 드라이버에 GLSL 컴파일러가 포함되어 있다면 그래픽 카드의 처리장치에 최적화된 코드 만들 수 있음
6. Cg (C for Graphics) - 셰이더 언어
NVIDIA에서 2002년에 발표한 상위 레벨의 셰이딩 언어
Direct3D / OpenGL에서 사용할 수 있으며, C언어와 유사한 문법으로 프로그래밍 가능