之前尝试将一个GLSL version 110的版本写成GLSL version 330的,在此将学习过程和收获记录下来。
参考链接 GLSL Versions
介绍
你可以使用#version命令作为着色器的第一行来指定GLSL版本:
#version 120
void main() {
gl_FragColor = vec4(1.0);
}
GLSL版本与GL版本一起发布。 请参阅以下图表以确定要定位的版本。
GLSL版本
OpenGL 版本 |
GLSL 版本 |
2.0 | 110 |
2.1 | 120 |
3.0 | 130 |
3.1 | 140 |
3.2 | 150 |
3.3 | 330 |
4.0 | 400 |
4.1 | 410 |
4.2 | 420 |
4.3 | 430 |
GLSL ES版本 (Android, iOS, WebGL)
OpenGL ES有自己的着色语言,而且版本开始变得新鲜。它是基于OpenGL着色语言版本1.10。
OpenGL ES 版本 | GLSL ES 版本 |
2.0 | 100 |
3.0 | 300 |
所以,例如,如果GLSL 120中有一个功能,它可能在GLSL ES 100中不可用,除非ES编译器特别允许它。
一些差异
(桌面)GLSL版本之间的差异。
版本 100
定点着色器:
uniform mat4 projTrans;
attribute vec2 Position;
attribute vec2 TexCoord;
varying vec2 vTexCoord;
void main() {
vTexCoord = TexCoord;
gl_Position = u_projView * vec4(Position, 0.0, 1.0);
}
片段(片元)着色器:
uniform sampler2D tex0;
varying vec2 vTexCoord;
void main() {
vec4 color = texture2D(tex0, vTexCoord);
gl_FragColor = color;
}
版本 330
从GLSL 130+开始,使用in和out代替属性和变化。 GLSL 330+包括其他功能,如布局限定符和将texture2D更改为纹理。
顶点着色器
#version 330
uniform mat4 projTrans;
layout(location = 0) in vec2 Position;
layout(location = 1) in vec2 TexCoord;
out vec2 vTexCoord;
void main() {
vTexCoord = TexCoord;
gl_Position = u_projView * vec4(Position, 0, 1);
}
片段(片元)着色器:
#version 330
uniform sampler2D tex0;
in vec2 vTexCoord;
//使用你自己的输出从而替代 gl_FragColor
out vec4 fragColor;
void main() {
//'texture' 替代 'texture2D'
fragColor = texture(tex0, vTexCoord);
}
其他重大的变化
GLSL 120 增加
1,你可以在着色器中初始化数组,如下所示:
float a[5] = float[5](3.4, 4.2, 5.0, 5.2, 1.1);
float b[5] = float[](3.4, 4.2, 5.0, 5.2, 1.1);
然而,即使使用GLSL 120,Mac OSX Snow Leopard也不支持上述功能。
2,你可以在着色器中初始化全局变量,并且值将在链接时设置:
uniform float val = 1.0;
3,在设置const值时,可以使用像sin()这样的内置函数;
4,必要时,整数会隐式转换为浮点数,例如:
float f = 1.0; <-- valid
float g = 1; <-- only supported in GLSL 120
vec2 v = vec2(1, 2.0); <-- only supported in GLSL 120
5,你可以用f来定义一个浮点数:float f = 2.5f。
GLSL 130 增加
1,支持int和uint(以及它们的按位操作);
2,支持switch语句;
3,新的内置函数:trunc(),round(),roundEven(),isnan(),isinf(),modf();
4,片段输出可以是用户定义的;
5,输入和输出用in和out语法声明,替代属性和变化。
GLSL 150 增加
1,现在应该使用texture(),替代texture2D()。
GLSL330 增加
1,布局限定符可以声明顶点着色器输入和片段着色器输出的位置,例如:
layout(location = 2) in vec3 values[4];
形式上这只能通过ARB_explicit_attrib_location扩展来实现。
注意
1,uniform在图形学中可以理解为全局变量(或者理解为全局统一量),如果varying修饰的跟cg一样都是函数参数,会很好理解;
2,片段和片元其实都指的是一个fragment;
3,vertex和point两个意思有时候不一样,前一个指定点、端点,后一个指“单纯的一个”点。
参考资料
GLSL 详解(基础篇)
GLSL 详解(高级篇)