初识GLSL(学习中,随时更新)

概述

        GLSL是专门为徒刑开发设计的编程语言(OpenGL着色器语言)。

常用名词解释

      1、图元

                用来组成图像的最基本元素,所有的图像都由且仅由图元组成。图元包含  点、 线段、 三角形。

      2、OpenGL渲染管线 

                显示芯片内部处理图形信号互相独立的并行处理单元,即一系列有序的处理阶段的序列,用于把应用汇总的中的数据转
        化到OpenGL中中生成一个最终的图像的一个过程。

      3、可编程管线的编程阶段

  
初识GLSL(学习中,随时更新)

      4、最基本语法

                a、注释
                      单行:"//"
                      多行:"/*.........*/"
                b、main函数没有返回值
                c、每条语句的结尾必须带分号

变量初识

      1、基本数据类型    

                 
类型 描述
float IEEE 32位浮点数(float必须包含小数点
int 有符号32位整数
uint 无符号32位整数
bool 布尔值

      2、变量命名规范

                a、变量名由数字字母下划线组成,首字符只能是字母。
                b、变量名中不能包含连续下划线。
                c、系统内建变量都是以"gl"开头,不允许自定义以"gl"开头的变量名、类型、常量名、函数名。
                d、见名知意。

向量

     1、向量在着色器中的作用

                向量可以很方便的存储以及操作颜色、位置、纹理等不仅包含一个组成部分的量。

     2、向量的操作

                基本语法为"<向量名>.<分量名>"。
                
基本类型
2D向量
3D向量
4D向量
float
vec2
vec3
vec4
int
ivec2
ivec3
ivec4
bool
bvec2
bvec3
bvec4
                a、初始化
                        vec3 xyz = vec3(0.0, 0.1, 0.2);
                        vec4 rgba = vec4(0.0, 0.1, 0.2, 0.3);
                        vec3 xyz = vec3(0.1);    等价于    vec3 xyz = vec3(0.1, 0.1, 0.1);
                b、加长
                        vec3 xyz = vec3(0.0, 0.1, 0.2);
                        vec4 rgba = vec4(xyz, 0.3);
                c、取短
                        vec4 rgba= vec4(0.0, 0.1, 0.2, 0.3);
                        vec3 xyz= rgba.rgb;

                d、元素操作
                        vec4 rgba= vec4(0.0, 0.1, 0.2, 0.3);
                        float r = rgba.r;

     3、分量

                分量是聚合类型(向量、矩阵)中的一个元素
                
分量访问符
符号描述
(r, g, b, a)
颜色数据
(x, y, z, w)
位置坐标
(s, t, p, q)
纹理坐标

                rgba : 红,绿,蓝,透明度;
                xyzw : 空间坐标,齐次坐标(把n维的向量,运用n + 1维来表示,一般填1)
                stpq  : 纹理还没学,留个坑,以后补,标红提示我自己; 

矩阵

     1、矩阵在3D开发中的作用

                位移变换

     2、矩阵的操作       

基本类型
2阶矩阵
3阶矩阵
4阶矩阵
float
mat2
mat3
mat4

                 

                 a、初始化
                        初始化顺序为先填充列,再填充行。
                        mat3 m = mat3(1.0, 4.0, 7.0, 2.0, 5.0, 8.0, 3.0, 6.0, 9.0);
                        等同于
                        vec3 col0 = vec3(1.0, 4.0, 7.0);
                        vec3 col1 = vec3(2.0, 5.0, 8.0);
                        vec3 col2 = vec3(3.0, 6.0, 9.0);
                        mat3 m = mat3(col0, col1, col2);
                b、元素操作
                        mat3 m = mat3(1.0, 4.0, 7.0, 2.0, 5.0, 8.0, 3.0, 6.0, 9.0);
                        float f = m[2][1];    //取第2列第1行的数2.0
                        float f = m[2].x;      //结果同上
初识GLSL(学习中,随时更新)
                        vec3 xyz = m[1];    //取第1列向量。

结构体和采样器

     1、结构体

                与C语言中结构体相同

     2、采样器

                
采样器类型
说明
sampler2D
用来访问二维贴图
sampler3D
同来访问三维贴图
samplerCube
用来访问立体贴图

数组

       数组的索引是从0开始,注意和矩阵的操作区分开,矩阵的操作写法和二维数组类似,记住,矩阵不是数组,操作是先列后行,索引从1开始。

类型修饰符

     1、attribute

                一般用于修饰每隔顶点都各不相同的数据,例如:颜色,顶点等。
                a、只用于顶点着色器中
                b、是属性限定符
                c、只能修饰以浮点数为基本类型的数据类型(向量,矩阵等);

     2、uniform

                一致变量限定符
                一直变量:对同一组顶点组成的单个3D物体中所有的顶点都相同的量。
                a、主要用于顶点和片元着色器中
                b、可以修饰所有数据类型(对应attribute的只能修饰浮点型)

     3、varying

                用来传递顶点着色器中的数据到片元着色器中        
                注:顶点着色器中和片元着色器中变量名和定义必须一模一样。

                例:
                        顶点着色器:varying vec2 texture;
                        片元着色器:varying vec2 texture;

     4、const

                常量

     5、in和out

                in:修饰输入变量
                out:修饰输出变量

     6、inout

                修饰的变量既可以输入也可以输出。

语句

     1、控制流

                if()else{}
                switch()

     2、循环语句

                for、while

     3、流控制语句

                break、return、continue、discard
                discard:丢弃当前片元,终止片元着色器执行。只出现在片元着色器中。

     4、函数定义

                函数要定义在main函数之前。函数定义时,必须加访问修饰符。
                访问修饰符:private、protected、public

内建变量

     1、输入变量

                负责将着色器管线中固定的部分产生的信息传递进着色器。
                        片元输入:gl_FragCoord、gl_FrontFacing
                        gl_FragCoord:窗口信息
                        gl_FrontFacing:布尔值,判断片元处于光栅化阶段时生产此片元的正面(true)或反面(false)。

     2、输出变量

                负责将着色器产生的信息传递给渲染管线中的固定功能
                        顶点输出:gl_Position,gl_Pointsize
                            gl_Position:接收顶点数据
                            gl_Pointsize:计算点大小、单位像素
                        片元输出:gl_FragColor,gl_FragData
                            gl_FragColor:上色
                            gl_FragData:渲染管线后续操作