OpenGL 着色器语言基础

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/github_34402358/article/details/79452035

数据类型概述:

  • 标量 :也被称为“无向量”其值只有大小,并不具有方向。
  • 向量:有方向的量叫做向量。OpenGLES着色语言中,向量可以看做是用同样类型的标量组成,其基本类型也分为bool、int和float三种。 每个 向量可以由2个、3个、4个相同的标量组成。

    1.其基本类型也分为bool、int和float三种。 每个向量可以由2个、3个、4个相同的标量组成 
    2.向量在着色器中的作用可以很方便的存储以及操作颜色、位置、纹理坐标等不仅包含一个组成部分的量。
     开发中,有时可能需要单独访问向量中的某个分量,基本的语法为 “<向量名>.<分量名>”。
    

    这里写图片描述

  • 矩阵:
    1.矩阵在3D开发中的作用:做位移变换
    2.矩阵类型

    3.矩阵初始化
    mat4*4 是什么意思:第一个值表示列,第二个表示行
    初始化矩阵
    mat3 m=mat3(1.0 , 2.0 ,3.0 , 4.0, 5.0, 6.0, 7.0 ,8.0 , 9.0);
    vec3 column1=vec3(1.0 , 2.0 ,3.0 );
    vec3 column2=vec3(4.0, 5.0, 6.0 );
    mat3 m=mat3(column1,column2 ,column3);
    vec2 column1=vec2(1.0 , 2.0 );
    vec2 column3=vec2( 7.0 ,8.0 );
    mat3 m=mat3(column1 ,3.0 ,column2 ,6.0 ,column3 ,9.0);
  • 采样器
    采样器是着色语言中不同于C语言的一种特殊的基本数据类型,其专门用来进行纹理采样的相关操作。一般情况下,一个采样器变量代表一幅或一套纹理贴图
    这里写图片描述
  • 结构体
    OpenGL ES着色语言还提供了类似C语言中的用户自定义结构体,同样也是使用struct关键字进行声明。

    struct info{ //声明一个结构体 info
    vec3 color; //颜色成员
    vec3 position; //位置成员
    vec2 texturecoor; //纹理坐标成员
    }

  • 数组:声明数组的方式主要有两种:

    1.在声明数组的同时,指定数组的大小。
    vec3 position[10];//声明 一个包含10个vec3的数组
    2.引用数组之前,要再次使用第一种声明方式来生命该数组。
    vec3 position[];//声明 一个大小不定的vec3整型数组
    vec3 position[5];//再次声明该数组 并指定大小

代码中访问数组的下标都是编译时常量,这时编译器会自动创建适当大小的数组,使得数组尺寸足够存储编译器看到的最大索引值对应的元素。

  • 代码如下:
  • vec3 position[];//声明了一个大小不定的vec3数组
    position[3] = vec3(3.0); //position需要一个大小为4的数组
    position[20] = vec3(6.0); //position需要一个大小为21的数组

  • 空类型:空类型使用void表示,仅用来声明不返回任何值得函数。例如在顶点着色器以及片元着色器中必须存在的main函数就是一个返回值为空的函数,代码如下:

    void main() {//声明一个空返回值类型的main方法
     }
     
     

  • 类型修饰符
    1.attribute 一般用于每个顶点都各不相同的数据,例如:颜色,顶点。。。

    • 只有顶点着色器中会有这哥们(attribute )
    • 是属性限定符
    • 只能用来修饰 浮点数的标量 ,浮点数的向量 , 浮点数的矩阵变量,不能用于修饰其他类型

    2.uinfrom 一致变量限定符

    (一致变量:对同一组顶点组成的单个3D物体中所有的顶点都相同的量)

    • 主要出现在顶点和片元 着色器
    • 可以修饰所有的基本数据类型

    3.verying 用来传递顶点着色器中的数据到片元着色器中

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

    4.const 加了这哥们变量值不可变,常量,编译时常量 (编译时常量:在声明的时候要进行初始化,编译器在编译的时候不需要给他分配任何运行时资源。)
    例如:
    const float PI=3.14;

    5.in 和out 用in修饰的变量代表的是输入变量,用out修饰的表示输出变量
    6.inout 用来修饰参数为输入输出参数,同时具有两种功能!

  • GLSL操作符与优先级

    这里写图片描述

  • 操作符重载
    例如:向量和矩阵之间的乘法 vec3 v;
    mat3 m;
    vec3 r=v*m;注意:矩阵和向量的维度必须匹配!

  • 控制流

if(){
}else{
}
switch(){
    case : brake; 
    default:break;
 }
  • 循环语句
for(int i=0 ;i<10;i++){}
while(){}
do{
}while()
  • 流控制语句
    brake;
    return;
    continue;
    discard:丢弃当前片元,终止片元着色器执行( 只能在片元着色器中使用,只要运行到该语句,那片元着色器就 会立刻终止)
  • 函数声明
    1.函数声明,变量名需要添加访问修饰符
    2.GLSL支持用户自定义函数,同时它定义了一些内置函数
    3.函数名称可以是任何字符、数字、下划线,但是不能使用数字,连续下划线或者gl_作为函数的开始
    4.返回值可以是任何内置的GLSL类型,或者用户定义的结构体和数组类型。
    5.返回值是数组时,必须现实的指定大小。函数返回类型是void则没有返回值
    6.函数的参数也可以是任何类型的函数,包括数组(这里数组必须设置大小)
    7.在使用一个函数前必须声明他的原型或者直接给出函数体。
    8.GLSL的编译器在使用函数前必须找到函数的声明,否则会产生错误
    9.函数原型只是给出了函数的形式,但是并没有给出具体的实现内容

  • 内置变量

    介绍:着色器代码的开发中会用到很多变量,其中大部分可能是由开发人员根据需求自定义的,但着色器中也提供了一些用来满足特性需求的内建变量
    

    特点:

     1.内建变量不需要声明就可以使用。 
     2.一般用来实现 管线渲染固定功能部分 与 自定义顶点 或者 片元着色器 之间的信息交互。
    

    分类(两类):

     1、输入变量: 输入变量负责将渲染管线中固定部分产生 的信息传递进着色器
     2、输出变量: 输出变量负责将着色器产生的信息传递给渲染管线中固定功 能
    
名称 类型 描述
gl_Color vec4 输入属性-表示顶点的主颜色
gl_SecondaryColor vec4 输入属性-表示顶点的辅助颜色
gl_Normal vec3 输入属性-表示顶点的法线值
gl_Vertex vec4 输入属性-表示物体空间的顶点位置
gl_MultiTexCoordn vec4 输入属性-表示顶点的第n个纹理的坐标
gl_FogCoord float 输入属性-表示顶点的雾坐标
gl_Position vec4 输出属性-变换后的顶点的位置,用于后面的固定的裁剪等操作。所 有的顶点着色器都必须写这个值。
gl_ClipVertex vec4 输出坐标,用于用户裁剪平面的裁剪
gl_PointSize float 点的大小
gl_FrontColor vec4 正面的主颜色的varying输出
gl_BackColor vec4 背面主颜色的varying输出
gl_FrontSecondaryColor vec4 正面的辅助颜色的varying输出
gl_BackSecondaryColor vec4 背面的辅助颜色的varying输出
gl_TexCoord[] vec4 纹理坐标的数组varying输出
gl_FogFragCoord float 雾坐标的varying输出
  • 片段着色器的内置变量
名称 类型 描述
gl_Color vec4 包含主颜色的插值只读输入
gl_SecondaryColor vec4 包含主颜色的插值只读输入
gl_TexCoord[] vec4 包含纹理坐标数组的插值只读输入
gl_FogFragCoord float 包含雾坐标的插值只读输入
gl_FogCoord vec4 只读输入,窗口的x,y,z和1/w
gl_FrontFacing bool 只读输入,如果是窗口正面图元的一部分,则这个值为true
gl_PointCoord vec2 点精灵的二维空间坐标范围在(0.0, 0.0)到(1.0, 1.0)之间,仅用于点图元和 点精灵开启的情况下。
gl_FragData[] vec4 使用glDrawBuffers输出的数据数组。不能与gl_FragColor结合使用
gl_FragColor vec4 输出的颜色用于随后的像素操作
gl_FragDepth float 输出的深度用于随后的像素操作,如果这个值没有被写,则使用固定功能管线的深度值代替

猜你喜欢

转载自blog.csdn.net/github_34402358/article/details/79452035
今日推荐