之前在做后台渲染引擎的编译时,尝试将一个GLSL version 110的版本写成GLSL version 330的,在此将学习过程和收获记录下来。
介绍
你可以使用#version命令作为着色器的第一行来指定GLSL版本:
version120
voidmain(){
gl_FragColor=vec4(1.0);
}
GLSL版本与GL版本一起发布。 请参阅以下图表以确定要定位的版本。
GLSL版本
GLSL ES版本 (Android, iOS, WebGL)
OpenGL ES有自己的着色语言,而且版本开始变得新鲜。它是基于OpenGL着色语言版本1.10。
所以,例如,如果GLSL 120中有一个功能,它可能在GLSL ES 100中不可用,除非ES编译器特别允许它。
一些差异
(桌面)GLSL版本之间的差异。
版本 100
定点着色器:
uniform mat4 projTrans;
attribute vec2Position;
attribute vec2TexCoord;
varying vec2 vTexCoord;
voidmain(){
vTexCoord=TexCoord;
gl_Position=u_projView*vec4(Position,0.0,1.0);
}
片段(片元)着色器:
uniform sampler2D tex0;
varying vec2 vTexCoord;
voidmain(){
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 vec2Position;
layout(location=1)in vec2TexCoord;
out vec2 vTexCoord;
voidmain(){
vTexCoord=TexCoord;
gl_Position=u_projView*vec4(Position,0,1);
}
片段(片元)着色器:
#version 330
uniform sampler2D tex0;
in vec2 vTexCoord;
//使用你自己的输出从而替代 gl_FragColor
out vec4 fragColor;
voidmain(){
//'texture' 替代 'texture2D'
fragColor=texture(tex0,vTexCoord);
}
其他重大的变化
GLSL 120 增加
1,你可以在着色器中初始化数组,如下所示:
floata[5]=float[5](3.4,4.2,5.0,5.2,1.1);
floatb[5]=float[](3.4,4.2,5.0,5.2,1.1);
然而,即使使用GLSL 120,Mac OSX Snow Leopard也不支持上述功能。
2,你可以在着色器中初始化全局变量,并且值将在链接时设置:
uniformfloatval=1.0;
3,在设置const值时,可以使用像sin()这样的内置函数;
4,必要时,整数会隐式转换为浮点数,例如:
floatf=1.0;
floatg=1;
vec2 v=vec2(1,2.0);
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两个意思有时候不一样,前一个指定点、端点,后一个指“单纯的一个”点。
上传的附件