Three.js中文网 Three.js中文网
首页
免费视频
系统课 (opens new window)
  • Three.js基础课程
  • Vue3+Threejs 3D可视化
  • Threejs进阶课程
  • 展厅3D预览漫游
  • Threejs Shader
  • Blender建模基础
  • 文章
WebGPU教程
  • WebGL教程
  • ES GLSL着色器语言
  • WebGL教程(旧版本)
3D案例
  • 本站部署(打开快) (opens new window)
  • 原官网文档 (opens new window)
首页
免费视频
系统课 (opens new window)
  • Three.js基础课程
  • Vue3+Threejs 3D可视化
  • Threejs进阶课程
  • 展厅3D预览漫游
  • Threejs Shader
  • Blender建模基础
  • 文章
WebGPU教程
  • WebGL教程
  • ES GLSL着色器语言
  • WebGL教程(旧版本)
3D案例
  • 本站部署(打开快) (opens new window)
  • 原官网文档 (opens new window)
Web3D系统课程视频
  • 1. 声明一个变量
  • 2. 声明一个常量const
  • 3. 数据类型—基本类型
  • 4. 数据类型-向量
  • 5. 数据类型-矩阵
  • 6. if-else语句和for语句
  • 7. 内置变量
  • 8. attribute、uniform、varying
  • 9. 顶点和片元着色器
  • 10. 取样器sampler2D
  • 11. 内置函数
  • 12. 着色器计算精度precision
  • 13. 函数
  • 14. 结构体
  • 15. discard舍弃片元
  • 16. 数组
  • 17. 预处理
    • ES GLSL着色器语言
    郭隆邦
    2026-05-22
    目录

    17. 预处理

    # 预处理

    WebGL着色器语言和C语言一样提供了一些用于预处理的命令#define、#include、#if等以#号开头的命令。

    # 宏定义#define

    注意宏定义和着色器声明的变量不同,着色器程序执行前需要进行编译处理,着色器程序编译处理之后程序才会在GPU上执行,宏定义主要是在编译处理阶段起作用。比如宏定义#define PI 3.14,PI符号表示圆周率3.14,如果在代码return float f = PI*100.0;中使用PI符号,编译预处理的时候把自动把PI替换成浮点数3.14。

    #define PI 3.14//圆周率
    #define RECIPROCAL_PI 0.318//圆周率倒数
    float add(){
      float f = PI*100.0;//预处理的时候会把PI符号自动替换为3.14
      return f;
    }
    

    预处理之后代码

    float add(){
      float f = 3.14*100.0;//预处理的时候会把PI符号自动替换为3.14
      return f;
    }
    

    # #ifdef

    #ifdef的作用是判断一个宏定义是否存在,如果存在,在编译预处理的时候,代码vColor.xyz = color.xyz;会保留,否则就不保留。

    通过#ifdef和#endif两个关键字约束作用代码范围。

    #define USE_COLOR 1.0;
    // 判断宏定义是否存在
    #ifdef USE_COLOR
    // 顶点颜色进行插值计算
    	vColor.xyz = color.xyz;
    #endif
    

    上面代码预处理后最终结果就是vColor.xyz = color.xyz;,在GPU着色器中执行的是下面代码,而不是上面代码。

    vColor.xyz = color.xyz;
    

    # #if

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

    #if 10 > 0
    vec3 v3 = vec3(1.0,1.0,0.0);
    #endif
    

    # 引入文件#include

    在编写WebGL着色器代码的时候,比如代码比较多可能会拆分为多个文件,比如某一段逻辑代码会在多个着色器文件中使用,也可以抽离出来单独作为一个文件。WebGL着色器提供因此提供了一个预处理命令#include关键字可在一个着色器文件中引入另一个着色器文件。

    着色器文件common.glsl

    float a = 0.5;
    

    着色器文件color.glsl

    uniform vec3 color;
    

    frag.glgl文件的代码中引入了color.glsl和common.glsl两个着色器文件。

    #include <common>
    #include <color>
    void main(){
      gl_FragColor = vec4(color,a);
    }
    

    上面代码等价于下面代码

    float a = 0.5;
    uniform vec3 color;
    void main(){
      gl_FragColor = vec4(color,a);
    }
    
    16. 数组

    ← 16. 数组

    Theme by Vdoing | Copyright © 2016-2026 豫ICP备16004767号-2
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式