Three.js中文网 Three.js中文网
首页
免费视频
系统课 (opens new window)
  • Three.js基础课程
  • Vue3+Threejs 3D可视化
  • Threejs进阶课程
  • 展厅3D预览漫游
  • Threejs Shader
  • Blender建模基础
  • Three.js基础课程(旧版本) (opens new window)
  • 文章
WebGPU教程
  • WebGL教程
  • WebGL教程(旧版本) (opens new window)
3D案例
  • 本站部署(打开快) (opens new window)
  • 原英文官网文档 (opens new window)
首页
免费视频
系统课 (opens new window)
  • Three.js基础课程
  • Vue3+Threejs 3D可视化
  • Threejs进阶课程
  • 展厅3D预览漫游
  • Threejs Shader
  • Blender建模基础
  • Three.js基础课程(旧版本) (opens new window)
  • 文章
WebGPU教程
  • WebGL教程
  • WebGL教程(旧版本) (opens new window)
3D案例
  • 本站部署(打开快) (opens new window)
  • 原英文官网文档 (opens new window)
Web3D系统课程视频
  • 1.WebGPU快速入门

  • 2. 3D几何变换数学基础

    • 1. 数学基础(平移、旋转、缩放矩阵)
    • 2. 模型矩阵
    • 3. gl-matrix数学计算库
    • 4. 顶点着色器矩阵变换
    • 5. WebGPU传递uniform数据
    • 6. gl-matrix生成顶点着色器的矩阵
    • 7. WebGPU动画(uniform旋转矩阵)
    • 8. 绕y轴旋转动画
    • 9. 片元的屏幕坐标
    • 10. 片元深度值、深度缓冲区
      • 11. WebGPU顶点数据插值计算
      • 12. 练习—顶点位置插值
      • 13. 顶点颜色数据插值计算
      • 14. 顶点位置、颜色数据共享缓冲区
      • 15. 练习-顶点颜色
      • 16. 结构体作为WGLSL函数参数
    • WebGPU教程
    • 2. 3D几何变换数学基础
    郭隆邦
    2023-05-20
    目录

    10. 片元深度值、深度缓冲区

    # 片元深度值、深度缓冲区

    接着上节课片元屏幕坐标,给大家介绍下,WebGPU片元深度值(Z坐标)和深度缓冲区的概念。

    # 片元深度值(z坐标)

    在xyz轴上分别取一个点构成构成一个三角形,然后以该三角形为例给大家讲解片元的深度值。

    // 三角形顶点坐标
    1.0, 0.0, 0.0,
    0.0, 1.0, 0.0,
    0.0, 0.0, 1.0,
    

    经过渲染管线处理后生成片元数据

    三角形里面的每个片元数据都有一个自己的对应xyz坐标数据,本节课主要给大家讨论下Z坐标,你也可以称为片元深度值。

    # 帧缓冲区简介

    经过渲染管线处理,会生成一些片元相关的数据,片元的颜色(像素)数据存储在颜色缓冲区,片元的深度值Z存储在深度缓冲区中,颜色缓冲区、深度缓冲区都是帧缓冲区的一部分。

    # 片元着色器获取片元深度值

    获取片元的屏幕坐标xy

    @fragment
    fn main(@builtin(position) fragCoord : vec4<f32>) -> @location(0) vec4<f32> {
        var x = fragCoord.x;//片元屏幕坐标x
        var y = fragCoord.y;//片元屏幕坐标y
    }
    

    获取片元深度值方式和屏幕坐标一样,也是通过@builtin(position)声明的变量获取。

    @fragment
    fn main(@builtin(position) fragCoord : vec4<f32>) -> @location(0) vec4<f32> {
        //片元深度值,也就是z坐标
        var z = fragCoord.z;
    }
    

    通过内置变量@builtin(position)可以获取片元的坐标,fragCoord.x、fragCoord.y是屏幕坐标,不过fragCoord.z是并不是屏幕坐标,在该案例中,三角形三个顶点位置对应的片元z,还是你在顶点缓冲区中三个顶点的z坐标,其余的片元z值在这三个点的z之间。

    # 根据片元深度值控制片元颜色

    @fragment
    fn main(@builtin(position) fragCoord : vec4<f32>) -> @location(0) vec4<f32> {
        // 片元深度值
        var z = fragCoord.z;
        if(z < 0.5){
            // 片元深度值小于0.5,片元设置为红色
            return vec4<f32>(1.0, 0.0, 0.0, 1.0);
        }else{
            // 片元深度值不小于250,片元设置为绿色
            return vec4<f32>(0.0, 1.0, 0.0, 1.0);
        }
    }
    

    # 片元深度可视化

    z的范围0~1,颜色范围绿色(0, 1, 0)到黄色(1, 1, 0)之间变化

    @fragment
    fn main(@builtin(position) fragCoord : vec4<f32>) -> @location(0) vec4<f32> {
        // 片元深度值
        var z = fragCoord.z;
        // 可视化片元深度
        return vec4<f32>(z, 1.0, 0.0, 1.0);
    }
    

    z的范围0~1,颜色范围蓝色(0, 0, 1)到红色(1, 0, 0)之间变化

    @fragment
    fn main(@builtin(position) fragCoord : vec4<f32>) -> @location(0) vec4<f32> {
        // 片元深度值
        var z = fragCoord.z;
        // 可视化片元深度
        return vec4<f32>(z,0.0, 1.0-z, 1.0);
    }
    
    9. 片元的屏幕坐标
    11. WebGPU顶点数据插值计算

    ← 9. 片元的屏幕坐标 11. WebGPU顶点数据插值计算→

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