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 详解(基础篇)

GLSL 详解(高级篇)

原文地址:https://www.cnblogs.com/OctoptusLian/p/9909170.html

时间: 2024-08-30 02:30:44

GLSL版本的区别和对比的相关文章

Struts1和Struts2的区别和对比(完整版)

Struts2其实并不是一个陌生的Web框架,Struts2是以Webwork的设计思想为核心,吸收了Struts1的优点,因此,可以认为Struts2是Struts1和Webwork结合的产物. 简单来说二者的区别是: 一个是Stuts1 ,一个是Stuts2,这是最大的区别,技术方面,Stuts1有个核心控制器,但是只提供了一个接口,也就是execute,还要配置actionform之类的,很麻烦,所以依赖性比较强:而Stuts2是针对拦截器开发的,也就是所谓的AOP思想,可以配置多个act

MVC2 ,MVC3 ,MVC4,MVC5的区别,EF的各个版本的区别;LocalDB是个啥

EF6 在 code first的模式下,codefrist不支持的数据库更多,比如access,sqlite,sql compact 3.5,mysql,oracle 关于LocalDB的介绍 类似于sqlite (但是sqlite是不支持存储过程的,而LocalDB则支持存储过程) 导读:LocalDB是SQL Server 2012带来的新特性,它是一个专门为开发人员量身定制的轻量级数据库.本文将为您讲解LocalDB的开发背景,展示其核心特性,并看看它与微软的其它轻量级数据库到底有何不同

Struts1和Struts2的区别和对比(完整版)(转)

Struts1和Struts2的区别和对比: Action 类: • Struts1要求Action类继承一个抽象基类.Struts1的一个普遍问题是使用抽象类编程而不是接口,而struts2的Action是接口. • Struts 2 Action类可以实现一个Action接口,也可实现其他接口,使可选和定制的服务成为可能.Struts2提供一个ActionSupport基类去 实现 常用的接口.Action接口不是必须的,任何有execute标识的POJO对象都可以用作Struts2的Act

Struts1和Struts2的区别和对比

Struts1和Struts2的区别和对比: Action 类: • Struts1要求Action类继承一个抽象基类.Struts1的一个普遍问题是使用抽象类编程而不是接口. • Struts 2 Action类可以实现一个Action接口,也可实现其他接口,使可选和定制的服务成为可能.Struts2提供一个ActionSupport基类去 实现 常用的接口.Action接口不是必须的,任何有execute标识的POJO对象都可以用作Struts2的Action对象. 线程模式: • Stru

Python3和以前版本的区别

Python3.0和以前版本的区别 (1)print .3.1版本之后要用括号括起来(print("abs"),类似于java)而2.0版本不用. (2)input代替了2.0版本的raw_input: (3)3.0版本没有file函数了,要打开文件要用open:f = open(shoplistfile,'wb'); (4)没有了Cpickle模块了,使用pickle模块: (5)使用pickle.dump()方法时,打开文件的读操作要是"wb",使用load方法

debug版本和release版本的区别?

好久没有做web项目了,这项目完成了要发布网站,不好忘了 以前操作过的? 还好脑子还是有点印象 现还是 写个文档吧记录吧 免得 以后作别的了又忘了 那可不妙啊 网站发布步骤:1.先将debug改为Release编译 2.点击web网站点击发布将发布的文件保存在一个文件中 3.将修改过的的编译文件发布到测试服务器或上线服务器 注意:若出现一些问题重新加载一下web.config重新运行一下(对其文件做修改如打空格即可) 再刷新页面即可 今天主要是来讲debug版本和release版本的区别呢? 为

php5 NTS和TS版本的区别

php5 non-thread-safe和thread-safe这两个版本的区别 从PHP5.2.10版本开始(现在有PHP5.2.10和5.3两个版本),有None-Thread Safe与Thread Safe两种版本的可供选择,这两种版本有何不同,作为使用者来说又应该如何选择呢?下面聚友将为您讲述. 先从字面意思上理解,None-Thread Safe就是非线程安全,在执行时不进行线程(thread)安全检查:Thread Safe就是线程安全,执行时会进行线程(thread)安全检查,以

opencv-3.0.0-beta的windows环境下的配置及与opencv2版本的区别

我的机器:64位系统 第一步: opencv官网下载opencv3.0.0-beta版本,解压到自己的目录,我的目录是E:\,解压后在E盘出现名为opencv的文件夹,该文件夹下有两个子文件夹 第二步:配置环境变量: 右击 ,选择"属性"->"高级系统设置"->"高级"->"环境变量"->"系统变量Path"->添加 E:\opencv\build\x64\vc10\bin,然

VS中 Debug和Release版本的区别

VS Debug和Release版本的区别 1. 变量.大家都知道,debug跟release在初始化变量时所做的操作是不同的,debug是将每个字节位都赋成0xcc(注1),而release的赋值近似于随机(我想是直接从内存中分配的,没有初始化过).这样就明确了,如果你的程序中的某个变量没被初始化就被引用,就很有可能出现异常:用作控制变量将导致流程导向不一致:用作数组下标将会使程序崩溃:更加可能是造成其他变量的不准确而引起其他的错误.所以在声明变量后马上对其初始化一个默认的值是最简单有效的办法