3.js - 深度测试、深度写入、深度函数

news2024/10/6 15:29:06

md,艹,这玩意得理解,只看代码不管事

效果图

在这里插入图片描述

代码


// @ts-nocheck

// 引入three.js
import * as THREE from 'three'

// 导入轨道控制器
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls'

// 导入lil.gui
import { GUI } from 'three/examples/jsm/libs/lil-gui.module.min.js'

// 导入tween
import * as TWEEN from 'three/examples/jsm/libs/tween.module.js'

// 导入exrloader
import { EXRLoader } from 'three/addons/loaders/EXRLoader.js'

// 导入tif
import { LogLuvLoader } from 'three/addons/loaders/LogLuvLoader.js'

// 导入rgbmloader
import { RGBMLoader } from 'three/addons/loaders/RGBMLoader.js'

//#region
const scence = new THREE.Scene()

const camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000)
camera.position.set(2, 2, 5) // 设置相机位置
camera.lookAt(0, 0, 0)

const renderer = new THREE.WebGLRenderer({
  antialias: true // 开启抗锯齿
})
renderer.setSize(window.innerWidth, window.innerHeight)
document.body.appendChild(renderer.domElement)
//#endregion

//#region
// 添加世界坐标辅助器,红色-X轴; 绿色-Y轴; 蓝色-Z轴
const axesHelper = new THREE.AxesHelper(5)
scence.add(axesHelper)

const controls = new OrbitControls(camera, renderer.domElement)
// 设置带阻尼的惯性
// controls.enableDamping = true
// 设置阻尼系数
controls.dampingFactor = 0.05

// 每一帧根据控制器更新画面
function animate() {
  // 如果,需要控制器带有阻尼效果,或者自动旋转等效果,就需要加入`controls.update()`
  controls.update()
  // `requestAnimationFrame`:在屏幕渲染下一帧画面时,触发回调函数来执行画面的渲染
  requestAnimationFrame(animate)
  // 渲染
  renderer.render(scence, camera)
  // 更新tween
  TWEEN.update()
}
animate()
//#endregion

// --------------------------------------------------------------
// --------------------------------------------------------------

// 平面-1
const planeGeometry = new THREE.PlaneGeometry(2, 2)
const planeMaterial = new THREE.MeshBasicMaterial({
  map: new THREE.TextureLoader().load('../public/assets/texture/sprite0.png'),
  side: THREE.DoubleSide,
  transparent: true
})
const plane = new THREE.Mesh(planeGeometry, planeMaterial)
// 渲染顺序,小的先渲染
plane.renderOrder = 0
scence.add(plane)

// 平面-2
const planeGeometry_1 = new THREE.PlaneGeometry(2, 2)
const planeMaterial_1 = new THREE.MeshBasicMaterial({
  map: new THREE.TextureLoader().load('../public/assets/texture/lensflare0_alpha.png'),
  side: THREE.DoubleSide,
  transparent: true
})
const plane_1 = new THREE.Mesh(planeGeometry_1, planeMaterial_1)
plane_1.position.z = 2
plane_1.renderOrder = 1
scence.add(plane_1)

/*
depthTest:布尔值,是否开启深度测试

  true:WebGL渲染器会检查每个像素的深度值,以确定它是否应该被绘制,
        即:它是否比当前深度缓冲区中存储的像素更接近相机。
  
  false:深度测试被忽略,
          所有物体都将按照它们在场景中的顺序绘制,而不管它们的实际深度如何,
          这通常用于创建特定的视觉效果,比如,粒子系统、某些类型的后处理效果。
*/
plane.material.depthTest = true

/*
depthWrite:布尔值,绘制当前材质时,控制当前材质,是否将深度信息,写入深度缓冲区
  
  true:渲染的物体(可以理解为,每个物体都有一个深度信息,只是你看不见而已),将更新深度缓冲区中的相应像素,以反映其深度

  false:渲染的物体将不会更新深度缓冲区,
          可以用于创建叠加效果,或确保某些物体(如:玻璃或水)不会遮挡其后的物体,
          即使它们在几何上应该这样做。
*/
plane.material.depthWrite = true

/*
depthFunc:函数,用于定义深度测试的具体行为(就是设置深度模式)
  
  `THREE.LessEqualDepth`:默认值,
      只有当,当前像素的深度值,小于或等于,深度缓冲区中的值时,该像素才会被绘制。
      这是最常见的设置,用于确保离相机较近的物体遮挡离相机较远的物体。

  `THREE.NeverDepth`:从不通过深度测试
  
  `THREE.AlwaysDepth`:总是通过深度测试

  `THREE.GreaterDepth`:仅当深度值大于缓冲区中的值时,通过测试
*/
plane.material.depthFunc = THREE.LessEqualDepth

plane_1.material.depthTest = true
plane_1.material.depthWrite = true
plane_1.material.depthFunc = THREE.LessEqualDepth

const gui = new GUI()

let gui_0 = gui.addFolder('plane')
gui_0.add(plane.material, 'depthTest').name('深度测试').onChange(() => {
  plane.material.needsUpdate = true
})

gui_0.add(plane.material, 'depthWrite').name('深度写入').onChange(() => {
  plane.material.needsUpdate = true
})

gui_0.add(plane.material, 'depthFunc', {
  'THREE.LessEqualDepth': THREE.LessEqualDepth, // 默认值
  'THREE.NeverDepth': THREE.NeverDepth,
  'THREE.AlwaysDepth': THREE.AlwaysDepth,
  'THREE.GreaterDepth': THREE.GreaterDepth, // 仅当深度值大于缓冲区中的值时,通过测试 
})



let gui_1 = gui.addFolder('plane_1')
gui_1.add(plane_1.material, 'depthTest').name('深度测试').onChange(() => {
  plane_1.material.needsUpdate = true
})

gui_1.add(plane_1.material, 'depthWrite').name('深度写入').onChange(() => {
  plane_1.material.needsUpdate = true
})

gui_1.add(plane_1.material, 'depthFunc', {
  'THREE.LessEqualDepth': THREE.LessEqualDepth, // 默认值
  'THREE.NeverDepth': THREE.NeverDepth,
  'THREE.AlwaysDepth': THREE.AlwaysDepth,
  'THREE.GreaterDepth': THREE.GreaterDepth, // 仅当深度值大于缓冲区中的值时,通过测试 
})






本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1886056.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Git新仓库创建流程

平时需要创建新仓库,老要去查代码特别烦,在此写下流程方便备用. 1.创建新的云仓库 无论使用GitHub还是Gitee,首先要创建一个云仓库,这里就直接用国内的gitee做演示了,githup老挂加速器太烦,偷个懒. 我这里创建的是一个空仓库&…

DLS-42/5-5双位置继电器 DC220V 板后接线 约瑟JOSEF

DLS-40系列双位置继电器型号: DLS-41/10-2双位置继电器; DLS-41/9-3双位置继电器 DLS-41/8-4双位置继电器; DLS-41/6-6双位置继电器; DLS-42/9-1双位置继电器; DLS-42/8-2双位置继电器; DLS-42/7-3双位…

教师工作经历轻松管理,智慧校园人事系统助您事半功倍

智慧校园人事系统中的教师工作经历管理模块,是一个集记录、跟踪、分析于一体的综合平台,专注于教师职业生涯的全貌管理,从初次入职到每一次岗位变动、学术成就及专业发展轨迹,旨在为学校提供一个全面了解教师专业成长、优化师资配…

能自动铲屎的养猫救星?带你了解热门爆款智能猫砂盆的真实体验!

在谈论猫咪的日常生活时,我和朋友最经常聊的话题就是在各种各样的紧急情况下如何狼狈地赶回去给猫咪铲屎,毕竟猫砂盆里的屎但凡停留那么几小时,就要开始发臭了,一下班回去实在受不了那个味道,每次下班在家门口都想带个…

mac有什么解压软件 mac怎么解压7z软件 苹果电脑好用的压缩软件有哪些

众所周知,macOS集成解压缩软件归档实用工具,可直接解压zip格式的压缩包。但对于其他比较常见的格式,诸如RAR、7z、TAR等,则无能为力,不过,我们可以选择大量第三方解压缩软件,帮助我们更好地完成…

为什么 [] == ![] 为 true?

🧑‍💻 写在开头 点赞 收藏 学会🤣🤣🤣 前言 面试官问我,[] ![] 的结果是啥,我:蒙一个true; 面试官:你是对的;我:内心非常高兴&a…

一文了解什么是车载Tbox

目录 前言一、Tbox是什么呢?二、Tbox架构三、App——TSP——Tbox交互时序图四、汽车混合网关拓扑结构示例五、Tbox功能 前言 强烈建议提前阅读一下这篇文章:车机Tbox介绍 一、Tbox是什么呢? Tbox是汽车上的一个盒子,指的是Telematics BOX&#xff0c…

企业化运维(5)_mysql数据库

###1.源码编译mysql### 对压缩包进行解压,并对mysql进行源码编译,其中需要下载依赖才能编译成功。 官网: www.mysql.com解压并进入目录 [rootserver1 ~]# tar xf mysql-boost-5.7.40.tar.gz [rootserver1 ~]# cd mysql-5.7.40/安装依赖性…

vue3引入本地静态资源图片

一、单张图片引入 import imgXX from /assets/images/xx.png二、多张图片引入 说明:import.meta.url 是一个 ESM 的原生功能,会暴露当前模块的 URL。将它与原生的 URL 构造器 组合使用 注意:填写自己项目图片存放的路径 /** vite的特殊性…

校园卡手机卡怎么注销?

校园手机卡的注销流程可以根据不同的运营商和具体情况有所不同,但一般来说,以下是注销校园手机卡的几种常见方式,我将以分点的方式详细解释: 一、线上注销(通过手机APP或官方网站) 下载并打开对应运营商的…

为什么这几年参加PMP考试的人越来越多

参加PMP认证的人越来越多的原因我认为和社会发展、职场竞争、个人提升等等方面有着不小的关系。国际认证与国内认证的性质、发展途径会有一些区别,PMP引进到中国二十余年,报考人数持增长状态也是正常的。 具体可以从下面这几个点来展开论述。 市场竞争…

【Linux】—Xshell、Xftp安装

文章目录 前言一、下载Xshell、Xftp二、安装Xshell三、使用XShell连接Linux服务器四、修改windows的主机映射文件(hosts文件)五、远程连接hadoop102/hadoop103/hadoop104服务器六、安装Xftp 前言 XShell远程管理工具,可以在Windows界面下来访…

安卓Framework开发快速分析日志及定位源码

文章目录 如何区分源码中 main system events 日志查看 Activity 生命周期日志分析 events 日志在源码中位置应用进程ID助分析具体应用ProtoLog 动态开关日志如何快速定位相关流程的代码位置 本文首发地址 https://h89.cn/archives/285.html 最新更新地址 https://gitee.com/ch…

BMA550 运动传感器

型号简介 BMA550是博世(bosch-sensortec)的一款用于可听设备的传感器。可产生强大的波来抵抗不需要的声波。创新的加速度计可用作体声传感器,用于感应骨传导语音。智能“语音增强”功能可在通话期间过滤干扰噪音并放大您自己的声音。这意味着…

RK3568驱动指南|第十五篇 I2C-第180章 I2C Tools工具讲解

瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工…

13 Redis-- 数据一致性模型、MySQL 和 Redis 的数据一致性

数据一致性模型 根据一致性的强弱分类,可以将一致性模型按以下顺序排列: 强一致性 > 最终一致性 > 弱一致性 数据一致性模型一般用于分布式系统中,目的是定义多个节点间的同步规范。 在这里,我们将其引入数据库和缓存组…

生命在于学习——Python人工智能原理(3.1.2)

一、概率基本知识 1.3 常见概型 1.3.1 古典概型 定义1 古典概型 若随机事件E满足如下两个条件: (1)样本空间S中只有有限个样本点。 (2)样本空间S中每个样本点发生都是等可能的。 这样的随机试验称为古典概型。 P(A)…

深入剖析高并发服务架构设计的探索与性能分析(1)

深入剖析多线程、协程与事件驱动IO模型的探索与性能分析 Web并发应用场景网站(Website)并发处理场景特点复杂业务逻辑功能点与页面处理高效应对IO并发需求缓存优化处理控制 大浏览量系统的静态改造静态系统通常有如下几方面的特征几种静态化方案的设计及…

人工智能 (AI) 基本概念 入门篇【C#】版

1. 什么是人工智能? 人工智能(Artificial Intelligence, AI)是指计算机系统能够执行通常需要人类智能的任务,如视觉识别、语音识别、决策和语言翻译等。AI的核心是通过算法和数据进行学习和推理,以实现智能行为。 2.…

前端修改audio背景色

1.查看浏览器设置Show user agent shadow DOM是否打开 2.打开可以查看audio Dom /** 去掉默认的背景颜色 */ audio::-webkit-media-controls-enclosure{background-color:unset; } 3.效果图