GLSL版本的区别和对比
之前尝试将一个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两个意思有时候不一样,前一个指定点、端点,后一个指“单纯的一个”点。
参考资料
最新文章
- MyBatis使用总结+整合Spring
- eclipse 条件断点的使用
- leetcode 153. Find Minimum in Rotated Sorted Array --------- java
- Unity3D知识点
- Nim游戏(组合游戏Combinatorial Games)
- Win10安卓模拟器Visual Studio Emulator for Android使用简介(转)
- OnWndMsg处理功能
- MPICH3.2 单机编译、安装及测试
- ural 1353. Milliard Vasya&#39;s Function(dp)
- [NOIp 2012]同余方程
- CF-551-D-树dp/思维
- C#:获取视频某一帧的缩略图
- docker常用命令(自用)
- A1114. Family Property
- nginx访问问题
- Java第三阶段学习(九、类加载器、反射)
- Unity弹出MessageBox
- PL/SQL 的一些用法
- C#基础入门 六
- sougoupinyin for linux 安装步骤(精简版)
热门文章
- js 基本包装类型 String
- servlet 表单加上multipart/form-data后request.getParameter获取NULL(已解决)
- Codeforces Round #443 (Div. 1) A. Short Program
- keras用vgg16做图像分类
- py3 pymysql
- 轻量对象存储服务——minio
- MySQL监控全部执行过的sql语句
- SSE图像算法优化系列六:OpenCv关于灰度积分图的SSE代码学习和改进。
- Docker 安装和基础用法
- Android设置屏幕旋转后保存数据