1. shader

1.1. glsl 语法

1.1.1. 三种限定符(uniform,attribute 和 varying)

  • uniform(一致变量):外部程序传递给(vertex 和 fragment)shader 的变量,不能被 shader 程序修改。

  • attribute(属性变量):只能在vertex shader中使用的变量,一般用attribute变量来表示一些顶点的数据,如:顶点坐标,法线,纹理坐标,顶点颜色等。

  • varying(易变变量):vertex和fragment shader之间做数据传递用的。一般vertex shader修改varying变量的值,然后fragment shader使用该varying变量的值。因此varying变量在vertex和fragment shader二者之间的声明必须是一致的。

1.1.2. 预处理命令

  • #define:宏定义,在编译处理阶段起作用。

  • #ifdef:判断一个宏定义是否存在,如果存在,在编译预处理的时候,保留 #ifdef 和 #endif 两个关键字之间的代码。

  • #if:判断条件是否成立,如果成立,在编译预处理后会保留通过 #if 和 #endif 两个关键字之间的代码,否在不保留。

  • #include:引入另一个着色器文件,在编译预处理后替换。

1.1.3. 变量类型

  • 标量

    • float: 浮点数
    • int: 整数
    • unit: 无符号整数
    • bool: 布尔值
  • 矢量

    • vec3: 包含3个浮点数的矢量
    • ivec3: 包含3个整数的矢量
    • uvec3: 包含3个无符号整数的矢量
    • bvec3: 包含3个布尔值的矢量
  • 矩阵

    • mat2: 2*2 的浮点数矩阵
    • mat3: 3*3 的浮点数矩阵
    • mat4: 4*4 的浮点数矩阵
  • 取样器

    纹理查找需要指定一个纹理或者纹理单元,GLSL不关心纹理单元的底层实现,因此它提供了 一个简单而不透明的句柄来封装需要查找的对象。这些句柄被称为"取样器(SAMPLERS)"。

    • sampler3D:访问三维纹理
    • samplerCube:访问立方贴图纹理
    • sampler2DRect:访问二维矩形纹理
    • sampler2DRectShadow:访问带对比的二维矩形深度纹理
    • sampler2DArrayShadow:访问二维深度纹理数组
    • samplerBuffer:访问纹理缓存
    • isampler3D:访问整型三维纹理
    • usampler3D:访问无符号整型三维纹理
  • 结构

    GLSL提供了类似于C 的用户定义结构。

    struct light {
      vec3 position;
      vec3 color;
    }
    
  • 数组

    GLSL可以创建任何类型的数组。

    • 创建的是一个包含 10 个 vec4 类型的数组:vec4 points[10];

    • 创建的是一个位置大小的 int 类型的数组:int num[];

Copyright © tomgou 2022 all right reserved,powered by Gitbook该文章修订时间: 2023-02-15 10:36:59

results matching ""

    No results matching ""