OpenGL Shading Language
GLSL(OpenGL Shading Language, OpenGL 셰이딩 언어)는 C 언어를 기초로 한, 상위 레벨 셰이딩 언어이다. GLslang로도 알려져 있다. HLSL과 유사한 이 언어는 어셈블리 언어나 하드웨어에 의존한 언어를 사용하지 않고, 개발자가 그래픽스 파이프라인을 직접 제어할 수 있도록 OpenGL ARB(Architecture Review Board)가 책정하였다.
GLSL은 프로파일이 있어서 개발자는 Cg로 개발한 코드를 바로 변환할 수도 있다.
Vertex Shader
Vertex Shader 는 3차원 좌표로 이루어진 vertex 들이 2차원 화면에서 그려질 위치를 정의합니다. gl_Position 이란 변수는 미리 정의되어 있는 변수이며 스크린상의 점의 위치를 가리키는 값을 저장하고 있습니다.
void main(void) {
const vec4 vertices[3] =
vec4[3](vec4( 0.25, -0.25, 0.5, 1.0),
vec4(-0.25, -0.25, 0.5, 1.0),
vec4( 0.25, 0.25, 0.5, 1.0));
// 화면에 3개의 점을 그린다.
gl_Position = vertices[gl_VertexID];
}
Geometry Shader
Vertex shader와 fragment shader 사이에 geometry shader라고 불리는 선택적인 shader 단계가 존재합니다. Geometry shader는 입력으로 예를 들어 점이나 삼각형같은 하나의 기본 도형을 이루는 vertex들의 모음을 받습니다. 이 geometry shader는 이 vertex들을 다음 shader 단계에 이들을 보내기 전에 적절한 형태로 변환시킬 수 있습니다. 하지만 geometry shader가 만드는 흥미로운 점은 vertex들을 원래 주어진 vertex들보다 더 많은 vertex들을 생성하는 완전히 다른 기본 타입 도형으로 변환시킬 수 있다는 점입니다.
Example:
#version 330 core
layout (points) in;
layout (line_strip, max_vertices = 2) out;
void main() {
gl_Position = gl_in[0].gl_Position + vec4(-0.1, 0.0, 0.0, 0.0);
EmitVertex();
gl_Position = gl_in[0].gl_Position + vec4( 0.1, 0.0, 0.0, 0.0);
EmitVertex();
EndPrimitive();
}
Fragment Shader
Fragment Shader 는 각각의 픽셀들이 어떤 색상으로 그려질지를 정의합니다. 반환값으로 색상버퍼를 반환하며 색상버퍼에 표현되지 않는 오브젝트들은 전부 검정색으로 표현됩니다. gl_FragColor 는 함수의 반환값으로 사용되는 변수이며 화면에 나타낼 색을 정의합니다.
#ifdef GL_ES
precision mediump float;
#endif
void main() {
// Vertex Shader 에 의해 정의된 영역을 빨간색으로 칠한다.
gl_FragColor = vec4(1.0,0.0,0.0,1.0);
}
Versions
GLSL versions have evolved alongside specific versions of the OpenGL API. It is only with OpenGL versions 3.3 and above that the GLSL and OpenGL major and minor version numbers match. These versions for GLSL and OpenGL are related in the following table:
GLSL Version | OpenGL Version | Date | Shader Preprocessor |
1.10.59 1 | 2.0 | April 2004 | #version 110 |
1.20.82 | 2.1 | September 2006 | #version 120 |
1.30.103 | 3.0 | August 2008 | #version 130 |
1.40.084 | 3.1 | March 2009 | #version 140 |
1.50.115 | 3.2 | August 2009 | #version 150 |
3.30.66 | 3.3 | February 2010 | #version 330 |
4.00.97 | 4.0 | March 2010 | #version 400 |
4.10.68 | 4.1 | July 2010 | #version 410 |
4.20.119 | 4.2 | August 2011 | #version 420 |
4.30.810 | 4.3 | August 2012 | #version 430 |
4.4011 | 4.4 | July 2013 | #version 440 |
Favorite site
- OpenGL Shading Language
- Wikipedia (en) GLSL
- Wikipedia (en) OpenGL Shading Language
- OpenGL 셰이더 생성 함수들 정리
- Stackoverflow: Finding supported GLSL version
- OpenGL ES 2.0 셰이더 파이프라인과 Direct3D 비교
- OpenGL Shader 개념 | 현우의 개발노트