shader는 GPU에 위치한 작은 프로그램이며, 그래픽 파이프라인의 각 특정 섹션에 대해 실행된다.
기본적으로 Input -> Output으로 변환하는 프로그램에 불과하다.
또한 서로 통신할 수 없는 매우 격리된 프로그램으로, 유일한 소통 수단이라면 Input과 Output밖에 없다.
1. GLSL
- shader는 C와 유사한 언어인 GLSL로 작성된다. GLSL은 그래픽과 함께 사용하기 만들어진 언어로,
벡터 및 행렬 조작에 특화된 유용한 기능을 포함한다.
- shader는 항상 버전 선언으로 시작하며, 입출력 변수, 유니폼 목록 그리고 주 함수가 따른다. 각 shader의 진입점은 main 함수이며, 여기에서 입력 변수를 처리하고 결과를 출력 변수에 저장한다.
- shader는 일반적으로 다음과 같은 구조를 가진다:
#version version_number
in type in_variable_name;
in type in_variable_name;
out type out_variable_name;
uniform type uniform_name;
void main()
{
// 입력을 처리하고 특정한 그래픽 작업을 수행
//...
// 처리된 내용을 출력 변수에 출력
out_variable_name = weird_stuff_
}
- vertex shader에서 각 입력 변수는 vertex attribute라고도 한다.
- 하드웨어에 의해 제한되는 vertex attribute를 선언할 수 있는 최대값이 있다. OpenGL은 항상 적어도 16개의 구성 요소 vertex attribute를 사용할 수 있도록 보장하지만, 일부 하드웨어는 더 많은 속성을 사용할 수 있도록 GL_MAX_VERTEX_ATTRIBS를 쿼리하여 얻을 수 있다.
int nrAttributes;
glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &nrAttributes);
cout << "MAximum nr of vertex attributes supported:" << nrAttributes << "\n";
- 이는 보통 16의 최솟값을 반환하며, 이는 대부분의 용도에 충분해야 한다.
2. Types
- GLSL은 어떤 종류의 변수를 사용할지 지정하는 데이터 유형을 갖고 있다.
- GLSL에는 int, float, double, uint 및 bool 등의 기본 유형이 있다.
- GLSL에는 우리가 자주 사용할 두 가지 컨테이너 유형인 벡터와 행렬이 있다.
2.1 Vectors
- GLSL에서 벡터는 이전에 언급한 기본 유형 중 어떤 것이든 1, 2, 3, 구성 요소를 가진 컨테이너다. 다음 형식을 취할 수 있다. (n은 구성 요소 수를 나타냄) :
- vecn: n개의 부동 소수점을 가진 기본 벡터
- bvecn: n개의 부울 값을 가진 벡터
- ivecn: n개의 정수 값을 가진 벡터
- uvecn: n개의 부호 없는 정수 값을 가진 벡터
- dvecn: n개의 더블 구성 요소를 가진 벡터
- 대부분의 경우 대부분의 목적에는 부동 소수점이 충분하기 때문에 기본 vecn을 사용한다.
- 벡터의 구성 요소는 vec.x와 같이 vec의 첫 번째 구성 요소를 통해 접근할 수 있다.
- 추후 수정 예정