美文网首页
OpenGL着色器基本语法收集整理

OpenGL着色器基本语法收集整理

作者: HuiRan | 来源:发表于2019-06-02 11:30 被阅读0次

    一、简介

    OpenGL着色语言(OpenGL Shading Language)又叫GLSL,是用来在OpenGL中着色编程的语言,是一种面向过程的语言,基本的语法和C/C++基本相同,他们是在图形卡的GPU (Graphic Processor Unit图形处理单元)上执行的,代替了固定的渲染管线的一部分,使渲染管线中不同层次具有可编程性。比如:视图转换、投影转换等。GLSL(GL Shading Language)的着色器代码分成2个部分:Vertex Shader(顶点着色器)和Fragment(片断着色器)。

    二、基本数据类型

    数据类型主要分为标量、向量、矩阵、采样器、结构体、数组、空类型七种类型:

    1.标量:

    标量表示的是只有大小没有方向的量,在GLSL中标量只有bool、int和float三种。对于int,和Java一样,可以写为十进制(16)、八进制(020)或者十六进制(0x10)。对于标量的运算,我们最需要注意的是精度,防止溢出问题。

    2. 向量:

    向量我们可以看做是数组,在GLSL通常用于储存颜色、坐标等数据,针对维数,可分为二维、三维和四位向量。针对存储的标量类型,可以分为bool、int和float。共有vec2、vec3、vec4,ivec2、ivec3、ivec4、bvec2、bvec3和bvec4九种类型,数组代表维数、i表示int类型、b表示bool类型。需要注意的是,GLSL中的向量表示竖向量,所以与矩阵相乘进行变换时,矩阵在前,向量在后(与DirectX正好相反)。向量在GPU中由硬件支持运算,比CPU快的多。

    作为颜色向量时,用rgba表示分量,就如同取数组的中具体数据的索引值。三维颜色向量就用rgb表示分量。比如对于颜色向量vec4 color,color[0]和color.r都表示color向量的第一个值,也就是红色的分量。其他相同。

    作为位置向量时,用xyzw表示分量,xyz分别表示xyz坐标,w表示向量的模。三维坐标向量为xyz表示分量,二维向量为xy表示分量。

    作为纹理向量时,用stpq表示分量,三维用stp表示分量,二维用st表示分量。

    3. 矩阵:

    在GLSL中矩阵拥有22、33、4*4三种类型的矩阵,分别用mat2、mat3、mat4表示。我们可以把矩阵看做是一个二维数组,也可以用二维数组下表的方式取里面具体位置的值。

    4.采样器:

    采样器是专门用来对纹理进行采样工作的,一个采样器变量表示一副或者一套纹理贴图。所谓的纹理贴图可以理解为我们看到的物体上的皮肤。

    5.结构体:

    和C语言中的结构体相同,用struct来定义结构体,关于结构体参考C语言中的结构体。

    6.数组:

    数组知识也和Java中类似。

    7.空类型:

    空类型用void表示,仅用来声明不返回任何值得函数。

    三、运算符

    运算符有(越靠前,运算优先级越高):

    1.索引:[]

    2.前缀自加和自减:++,–

    3.一元非和逻辑非:~,!

    4.加法和减法:+,-

    5.等于和不等于:==,!=

    6.逻辑异或:^^

    7.三元运算符号,选择:?:

    8.成员选择与混合:.

    9.后缀自加和自减:++,–

    10.乘法和除法:*,/

    11.关系运算符:>,<,=,>=,<=,<>

    12.逻辑与:&&

    13.逻辑或:||

    14.赋值预算:=,+=,-=,*=,/=

    四、类型转化

    比如float a=1;就是一种错误的写法,必须严格的写成float a=1.0,也不可以强制转换,即float a=(float)1;也是错误的写法,但是可以用内置函数来进行转换,如float a=float(1);还有float a=float(true);(true为1.0,false为0.0)等,值得注意的是,低精度的int不能转换为低精度的float。

    五、限定符

    GLSL中的限定符号主要有:

    attribute:一般用于各个顶点各不相同的量。如顶点颜色、坐标等。

    uniform:一般用于对于3D物体中所有顶点都相同的量。比如光源位置,统一变换矩阵等。

    varying:表示易变量,一般用于顶点着色器传递到片元着色器的量。

    const:常量。

    限定符与java限定符类似,放在变量类型之前,并且只能用于全局变量。在GLSL中,没有默认限定符一说。

    五、流程控制

    GLSL中的流程控制与Jave中基本相同,主要有:

    if(){}、if(){}else{}、if(){}else if(){}else{}

    while(){}和do{}while()

    for(;;){}

    break和continue

    相关文章

      网友评论

          本文标题:OpenGL着色器基本语法收集整理

          本文链接:https://www.haomeiwen.com/subject/mmxxxctx.html