GLSL 语法简介(到构造函数)

302 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第5天,点击查看活动详情

GLSL是什么

glsl (GL Shading Language) ,通过类似C语言的语法告诉GPU在一个像素点上要如何渲染颜色和顶点,本文基于GLSL中文手册,做了精简。

基本类型:

类型说明
void空类型,即不返回任何值
bool布尔类型 true,false
int带符号的整数 signed integer
float带符号的浮点数 floating scalar
vec2, vec3, vec4n维浮点数向量 n-component floating point vector
bvec2, bvec3, bvec4n维布尔向量 Boolean vector
ivec2, ivec3, ivec4n维整数向量 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);

下一篇文章将会介绍预编译指令和一些特殊变量、常量以及内置函数。