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
    目录

    16. 数组

    # 数组

    WebGL着色器和javascript语言、C语言一样 可以声明数组类型变量,不过WebGL着色器的数据仅仅支持一维数组,不支持多维数组。

    声明语法结构

    数组元素的数据类型 数组变量名[数组元素个数]
    
    // 声明一个数组变量fArr,数组变量fArr有100个元素,元素的数据类型是浮点数
    float arr[100];
    // 声明一个长度20的三维向量数组变量v3Arr
    vec3 v3Arr[20];
    

    访问数组变量元素,直接通过数组下标就可以,比如arr[0]表示数组第一个元素,arr[1]表示数组第二个元素。

    gl_Position =vec4(arr[1],0.0,0.0,1.0)
    

    # 数组变量数据传递

    WebGL顶点或片元着色器的数组变量需要传递数据,声明数组变量的时候,需要使用关键词uniform。

    uniform float arr[12];
    

    调用WebGL API给数据变量传递数据

    uniform float arr[12];
    
    // 传递数组的某个元素  一次传递一个
    var arr0 = gl.getUniformLocation(program, "arr[0]")
    // 传递数组第1个元素的值
    gl.uniform1f(arr0, 0.3);
    var arr1 = gl.getUniformLocation(program, "arr[1]")
    // 传递数组第2个元素的值
    gl.uniform1f(arr1, -0.3);
    
    // 批量传递数组元素值
    var arr =gl.getUniformLocation(program, "arr")
    var typeArr = new Float32Array([
      0.6,-0.3,0.6,0.4,
      -0.8,-0.3,0.6,0.4,
      0.7,0.7,0.6,0.99,
    ])
    gl.uniform1fv(, typeArr);
    

    # 结构体声明数组元素

    自定义结构体用来声明数组元素的数据类型。

    // 自定义一个方向光结构体
    struct DirectionalLight {
      vec3 direction;//光的方向
      vec4 color;//光的颜色
    };
    // 声明一个数组变量dirLight,可以存入3个方向光元素
    // DirectionalLight声明数组元素的数据类型
    uniform DirectionalLight dirLight[3];
    
    // 通过WebGL API给数组中第二个方向光的颜色成员传递值
    var lightColor = gl.getUniformLocation(program,'dirLight[1].color');
    gl.uniform4f(lightColor, 1.0, 0.0, 1.0,0.7);
    
    15. discard舍弃片元
    17. 预处理

    ← 15. discard舍弃片元 17. 预处理→

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