持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第5天,点击查看活动详情
GLSL是什么
glsl (GL Shading Language) ,通过类似C语言的语法告诉GPU在一个像素点上要如何渲染颜色和顶点,本文基于GLSL中文手册,做了精简。
基本类型:
| 类型 | 说明 |
|---|---|
| void | 空类型,即不返回任何值 |
| bool | 布尔类型 true,false |
| int | 带符号的整数 signed integer |
| float | 带符号的浮点数 floating scalar |
| vec2, vec3, vec4 | n维浮点数向量 n-component floating point vector |
| bvec2, bvec3, bvec4 | n维布尔向量 Boolean vector |
| ivec2, ivec3, ivec4 | n维整数向量 signed integer vector |
结构体和数组:
| 类型 | 说明 |
|---|---|
| 结构 | struct type-name{} 类似c语言中的 结构体 |
| 数组 | float foo[3] glsl只支持1维数组,数组可以是结构体的成员 |
特殊的访问方式:
由于面向GPU,所以glsl提供了和图形有关的向量访问方式。
vector.xyzw vector.rgba
vec4 v=vec4(1.0,2.0,3.0,1.0);
v.x; // 1.0
v.y; // 2.0
v.ra; //(1.0,1.0)
基础类型间的运算:
有一点要非常注意,glsl没有所谓的隐式转换,因此对于变量或直接数的操作要保证类型一致。
vec3 a = vec3(1.0, 2.0, 3.0) * 2;//错误
vec3 a = vec3(1.0, 2.0, 3.0) * 2.0;//正确
运算
- int、float的运算和其他语言意义
- vec或mat和float的运算则为逐个分量的运算
- vec和同阶vec、vec与mat、mat与mat则是线性代数运算
变量限定符:
| 修饰符 | 说明 |
|---|---|
| none | (默认的可省略)本地变量,可读可写 |
| const | 只读类型 |
| attribute | 存在于vertex shader中,一般用于保存顶点或法线数据,它可以在数据缓冲区中读取数据 |
| uniform | 在运行时shader无法改变uniform变量, 一般用来放置程序传递给shader的变换矩阵,材质,光照参数等等. |
| varying | 在vertex 和 fragment 之间传递变量 |
attrubute和uniform一般用于外界调用像shader中传入数据
函数参数限定符:
这里的语法类似matlab,使用in、out、output规定函数参数
| 限定符 | 说明 |
|---|---|
| < none: default > | 默认使用 in 限定符 |
| in | 复制到函数中在函数中可读写 |
| out | 返回时从函数中复制出来 |
| inout | 复制到函数中并在返回时复制出来 |
glsl的函数:
glsl允许在程序的最外部声明函数.函数不能嵌套,不能递归调用,且必须声明返回值类型(无返回值时声明为void) 在其他方面glsl函数与c函数非常类似.
vec4 getPosition(){
vec4 v4 = vec4(0.,0.,0.,1.);
return v4;
}
void doubleSize(inout float size){
size= size*2.0 ;
}
void main() {
float psize= 10.0;
doubleSize(psize);
gl_Position = getPosition();
gl_PointSize = psize;
}
构造函数:
glsl中的复合类型需要用类似C++的构造函数来创建
vec4 color = vec4(0.0, 1.0, 0.0, 1.0);
vec4 color1;
color1 =vec4(0.0, 1.0, 0.0, 1.0);
...
//结构
struct light {
float intensity;
vec3 position;
};
light lightVar = light(3.0, vec3(1.0, 2.0, 3.0));
//数组
const float c[3] = float[3](5.0, 7.2, 1.1);
下一篇文章将会介绍预编译指令和一些特殊变量、常量以及内置函数。