• glsl语法之变量限定符


    |修饰符|说明|

    |---|---|

    |__none__|(默认的可省略)本地变量,可读可写,函数的输入参数既是这种类型|

    |__const__|声明变量或函数的参数为只读类型|

    |__attribute__|只能存在于vertex shader中,一般用于保存顶点或法线数据,它可以在数据缓冲区中读取数据|

    |__uniform__|在运行时shader无法改变uniform变量, 一般用来放置程序传递给shader的变换矩阵,材质,光照参数等等.|

    |__varying__|主要负责在vertex 和 fragment 之间传递变量 |

    __const__:

    和C语言类似,被const限定符修饰的变量初始化后不可变,除了局部变量,函数参数也可以使用const修饰符.但要注意的是结构变量可以用const修饰,

    但结构中的字段不行.

    const变量必须在声明时就初始化 `const vec3 v3 = vec3(0.,0.,0.)`

    局部变量只能使用const限定符.

    函数参数只能使用const限定符.

    ```cpp

    struct light {

            vec4 color;

            vec3 pos;

            //const vec3 pos1; //结构中的字段不可用const修饰会报错.

        };

    const light lgt = light(vec4(1.0), vec3(0.0)); //结构变量可以用const修饰

    ```

    __attribute__:

    attribute变量是`全局`且`只读`的,它只能在vertex shader中使用,只能与浮点数,向量或矩阵变量组合,

    一般attribute变量用来放置程序传递来的模型顶点,法线,颜色,纹理等数据它可以访问数据缓冲区

    (还记得__gl.vertexAttribPointer__这个函数吧)

    ```cpp

    attribute vec4 a_Position;

    ```

    __uniform__:

    uniform变量是`全局`且`只读`的,在整个shader执行完毕前其值不会改变,他可以和任意基本类型变量组合,

    一般我们使用uniform变量来放置外部程序传递来的环境数据(如点光源位置,模型的变换矩阵等等)

    这些数据在运行中显然是不需要被改变的.

    ```cpp

    uniform vec4 lightPosition;

    ```

    __varying__:

    varying类型变量是 vertex shader 与 fragment shader 之间的信使,一般我们在 vertex shader 中修改它然后在fragment shader使用它,但不能在

    fragment shader中修改它.

    ```cpp

    //顶点着色器

    varying vec4 v_Color;

    void main(){

        ...

        v_Color = vec4(1.,1.,1.,1);

    }

    //片元着色器

    varying vec4 v_Color;

    void main() {

      gl_FragColor = v_Color;

    }

    要注意全局变量限制符只能为 const、attribute、uniform和varying中的一个.不可复合.

    总结比较:__uniform__与__attribute__都是全局只读,attribute只能在vertex shader中使用,只能与浮点数,向量或矩阵变量组合,uniform可以用在vertex和fragment Shader中,可以和任意基本类型变量组合.

  • 相关阅读:
    安装DevEco Studio 3.0 Beta2
    【淘宝API】商品详情+搜索商品列表接口
    关于jQuery_事件对象的属性,方法介绍和使用
    Python实用技术二:数据分析和可视化(2)
    这 4 款电脑记事本软件,得试试
    基于keras 卷积神经外网络搭建的手写数字识别 完整代码+数据可直接运行
    nginx中将指定文件夹设置为虚拟目录
    centos8安装cobbler3.2
    【数据库系统概论】期中作业
    JDBC学习篇(一)
  • 原文地址:https://blog.csdn.net/u012861978/article/details/126511843