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两个意思有时候不一样,前一个指定点、端点,后一个指“单纯的一个”点。
参考资料
GLSL版本的区别和对比的更多相关文章
- Struts1和Struts2的区别和对比(完整版)
Struts2其实并不是一个陌生的Web框架,Struts2是以Webwork的设计思想为核心,吸收了Struts1的优点,因此,可以认为Struts2是Struts1和Webwork结合的产物. 简 ...
- debug版本和release版本的区别?
好久没有做web项目了,这项目完成了要发布网站,不好忘了 以前操作过的? 还好脑子还是有点印象 现还是 写个文档吧记录吧 免得 以后作别的了又忘了 那可不妙啊 网站发布步骤:1.先将
- paip.sql2k,sql2005,sql2008,sql2008 r2,SQL2012以及EXPRESS版本的区别
paip.sql2k,sql2005,sql2008,sql2008 r2,SQL2012以及EXPRESS版本的区别 作者Attilax , EMAIL:1466519819@qq.com 来源 ...
- PHP版本的区别
原文:PHP版本的区别 以为这个已经写过了,发现没有,赶紧补充下. PHP的版本,自从进入5以后,发布新版本速度明显提升很多,从PHP5.2开始,5.3 .5.4 .5.5,就快要6.0了. 注:ec ...
- Struts1和Struts2的区别和对比
Struts1和Struts2的区别和对比: Action 类: • Struts1要求Action类继承一个抽象基类.Struts1的一个普遍问题是使用抽象类编程而不是接口. • Struts 2 ...
- Data Base mongodb高版本与低版本的区别
mongodb高版本与低版本的区别 一.mongodb引擎: Mongodb 3.0支持用户自定义存储引擎,用户可配置使用mmapv1或者wiredTiger存储引擎. 3.2版本以后默认的开启的是w ...
- vivado各版本的区别
vivado各版本的区别 Vivado HL Design Edition: Vivado HL System Edition: 区别在于System Edition包含有system generat ...
- h5 和之前版本的区别
html5和之前版本的区别就是:以前版本多采用<tr><td>等标签,对于webapp的开发不是很好把控.H5采用<div>等标签直接进行布局(且多了许多标签功能很 ...
- [51CTO]给您介绍Windows10各大版本之间区别
给您介绍Windows10各大版本之间区别 随着win10的不断普及和推广,越来越多的朋友想安装win10系统了,但是很多朋友不知道win10哪个版本好用,为了让大家能够更好的选择win10系统版本, ...
随机推荐
- SS+FinalSpeed终极教程[转]
亲测,晚高峰看YOUTUBE的720P完全不卡. 推荐使用virwire buget VPS,性价比较高,128M内存,每月500G超大流量:http://www.cnblogs.com/tuzhuk ...
- [leetcode] 329. Longest Increasing Path in a Matrix My Submissions Question
在递归调用的函数中使用了max = INT_MIN,结果报超时错误,改为max=0就对了,虽然在这题中最小就为0, 看来在之后最小为0的时候,就不要使用INT_MIN了.
- linux上安装mysql,亲试成功
安装mysql参考 网址https://blog.csdn.net/a774630093/article/details/79270080 本文更加详细. 1.先检查系统是否装有mysql rpm - ...
- Flask对象配置
Flask的配置就是在 app.config 中添加一个键值对,但是你存进去的键必须是config中应该存在的,如果不再存在的话,它会默认无用,就这么放着 config中有用的key { 'DEBUG ...
- Node_初步了解(4)小爬虫
var http=require('http'); var cheerio=require('cheerio'); var url='http://www.cnblogs.com/Lwd-linux/ ...
- lettcode笔记--Valid Parentheses
20.Valid Parentheses Given a string containing just the characters '(', ')', '{', '}', '[' and ']', ...
- JS膏集05
JS膏集05 1.复习 闭包内的函数也可以使用参数 闭包的建议写法 ) 2.浅拷贝 相当于把一个对象中的所有的内容复制一份给另一个对象.直接复制. 或者说,就是把一个对象的地址给了另一个对象,它们指向 ...
- Aizu2249 Road Construction(dijkstra优化+思路 好题)
https://vjudge.net/problem/Aizu-2249 感觉这题和2017女生赛的Deleting Edge思路很像,都是先找最短路,然后替换边的. 但是这题用最朴素的dijkstr ...
- IPAddress.Any 解决本地ip和服务器ip切换问题
IPAddress.Any表示本机ip,换言之,如果服务器绑定此地址,则表示侦听本机所有ip对应的那个端口(本机可能有多个ip或只有一个ip)IPAddress.Any微软给出的解释是:Provide ...
- DroneCI启用privileged
https://www.aliyun.com/jiaocheng/123155.html?spm=5176.100033.2.5.EIV4p6 drone的服务需要配置DRONE_ADMIN环境变量, ...