GLSL-变量和类型

基础类型

GLSL支持下面几种基本类型。

类型

解释

void

void,函数不需要返回值时用这个

bool

布尔类型,true或者false

int

有符号整数

float

有符号浮点数

vec2

包含2个float的向量

vec3

包含3个float的向量

vec4

包含4个float的向量

bvec2

包含2个bool的向量

bvec3

包含3个bool的向量

bvec4

包含4个bool的向量

ivec2

包含2个int的向量

ivec3

包含3个int的向量

ivec4

包含4个int的向量

mat2

2*2的float的矩阵

mat3

3*3的float的矩阵

mat4

4*4的float的矩阵

sampler2D

操作2D的Texture的句柄

samplerCube

操作cube的Texture的句柄

另外,GLSL不支持指针类型。

Structures 结构体

GLSL支持结构体,把一些系统定义的类型聚到一起,组成自定义的类型。例如:

struct light {
    float intensity;
    vec3 position;
} lightVar;

然后,可以通过下面的方式声明一个结构体:

light lightVar2;

和C++中的结构体差不多。结构体里最少有一个成员,而且不支持结构体的嵌套。

Arrays 数组

GLSL中的数组和C++的数组很类似,支持最基本类型,也支持结构体。例如:

float frequencies[3];
uniform vec4 lightPosition[4];
const int numLights = 2;
light lights[numLights];

GLSL的数组无法在声明的时候初始化。

存储限定符

限定符

含义

本地可读可写,或者是函数的参数

const

常量,或者是函数的只读参数

attribute

连接Vertex Shader和OpenGL ES

uniform

不会改变的常量

varying

连接Vertex Shader和Fragment Shader,提供差值

成员变量、局部变量以及函数参数只能使用const。 函数返回值和结构体内的变量不适用限定符。 成员变量没有标明限定符,或者标了const的,必须在声明的时候初始化。uniform、attribute、varying这三个不受此限制。

const 限定符

const限定符标识一个只读常量,在声明的时候就必须初始化。例如:

const vec3 zAxis = vec3 (0.0, 0.0, 1.0);

但是,结构体里的变量不能设成const,数组以及包含数组的结构体也不能设成const,因为数组无法在声明的时候初始化。

attribute 限定符

attribute是用来给Vertex Shader传递顶点数据的,只能用在Vertex Shader中。一般通过OpenGL API来初始化。

attribute 无法修饰数组和结构体。

具体:

attribute vec4 position;
attribute vec3 normal;
attribute vec2 texCoord;

Uniform 限定符

uniform是只读的,只能通过OpenGL API进行初始化。举例:

uniform vec4 lightPosition;

Varying 限定符

Varying变量是连接Vertex Shader和Fragment Shader的桥梁,Vertex Shader会为每个Vertex计算颜色、坐标等信息,写入Varying变量。然后Fragment Shader会读取这些数据进行进一步的操作。

这里比较难理解的就是差值,还是要通过实例来理解。举个例子,比如一张图片要绘制一千个Fragment(可以理解成需要绘制一千个像素点),我们不可能挨个去赋值,只能通过系统自动差值的方式实现。

Vertex Shader可以写Varying变量,也可以读,Fragment Shader只能读Varying变量,不能写。Vertex Shader中定义的Varying变量必须和Fragment Shader中的定义完全匹配。不能多定义Varying变量,也不能少定义。Fragment Shader中定义的Varying变量必须在Vertex Shader中有完全一样的定义。

关于Vertex Shader和Fragment Shader中Varying变量的定义关系,有个图:

上图中的static use是指在Shader中有明确的使用,比如读写等操作。

Varying变量声明举例:

varying vec3 normal;

Varying变量不可应用于结构体。

参数限定符

函数的参数可以使用下面的三个参数限定符。

限定符

作用

< none: default >

和 in 完全一样

in

传给函数,在函数中读取值

out

传给函数,在函数中写入值;传给函数的时候没有初始化

inout

in 和 out 作用的结合

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏小文博客

蓝桥杯 C语言省赛 习题3 移动距离

1186
来自专栏王肖的UT

GLSL-内置函数

1413
来自专栏james大数据架构

ImageView的scaletype属性

android:scaleType是控制图片如何 resized/moved来匹对ImageView的size。ImageView.ScaleType / an...

1688
来自专栏一英里广度一英寸深度的学习

三路快排算法-求中位数问题(4)

step1排列数组的时间复杂度是O(N),空间复杂度是O(1) step2 递归调用的复杂度O(logN)

882
来自专栏静默虚空的博客

字符串 模式匹配

要点 模式匹配是数据结构中字符串的一种基本运算,给定一个子串,要求在某个字符串中找出与该子串相同的所有子串,这就是模式匹配。 假设P是给定的子串,T是待查找的字...

1768
来自专栏hanlp学习笔记

hanlp中的N最短路径分词

N-最短路径 是中科院分词工具NLPIR进行分词用到的一个重要算法,张华平、刘群老师在论文《基于N-最短路径方法的中文词语粗分模型》中做了比较详细的介绍。该算法...

730
来自专栏小樱的经验随笔

HDU 1003 Max Sum【动态规划求最大子序列和详解 】

Max Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (J...

2773
来自专栏Leetcode名企之路

【Leetcode】59. 螺旋矩阵 II

给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。

610
来自专栏数据结构与算法

BZOJ4198: [Noi2015]荷马史诗(哈夫曼树)

Allison 最近迷上了文学。她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的《荷马史诗》。但是由《奥德赛》和《伊利亚特》组成的鸿篇巨制...

531
来自专栏一“技”之长

Cocos2d-x-v3动作体系 原

        cocos2d-x-v3版本v2的版本有的很大的改动,最直观的是在一些函数的改动和类名的改动上,首先以CC开头的类,都不再使用CC。在我个人的理...

551

扫码关注云+社区