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

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.mfbz.cn/a/766071.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

山东访老友 | 同成建材数字化转型两年前后的巨大变化

山东省济宁市同成建材有限公司(简称“同成建材”)成立于2013年,目前共建有混凝土生产线2条、砂浆生产线1条,是济宁市最早建成的预拌混凝土搅拌站之一。 2020年,同成建材产量增长,市场环境变化,…

Redis的使用(二)redis的命令总结

1.概述 这一小节,我们主要来研究一下redis的五大类型的基本使用,数据类型如下: redis我们接下来看一看这八种类型的基本使用。我们可以在redis的官网查询这些命令:Commands | Docs,同时我们也可以用help 数据类型查看命令的帮助文档。 2. 常…

【漏洞复现】D-Link NAS 未授权RCE漏洞(CVE-2024-3273)

0x01 产品简介 D-Link 网络存储 (NAS)是中国友讯(D-link)公司的一款统一服务路由器。 0x02 漏洞概述 D-Link NAS nas_sharing.cgi接口存在命令执行漏洞,该漏洞存在于“/cgi-bin/nas_sharing.cgi”脚本中,影响其 HTTP GET 请求处…

STM32F1+HAL库+FreeTOTS学习3——任务创建(动态和静态两种)

STM32F1HAL库FreeTOTS学习3——任务创建(动态和静态两种) 任务创建API函数任务创建流程代码实现1. 动态任务创建和删除2. 静态任务创建和删除 上期我们学习了STM32移植FreeRTOS搭建基准工程,现在我们来学习任务创建 任务创建API函数 前面我们…

大数据可视化实验(八):大数据可视化综合实训

目录 一、实验目的... 1 二、实验环境... 1 三、实验内容... 1 1)Python纵向柱状图实训... 1 2)Python水平柱状图实训... 3 3)Python多数据并列柱状图实训.. 3 4)Python折线图实训... 4 5)Python直方图实训...…

Redis---保证主从节点一致性问题 +与数据库数据保持一致性问题

保证主从节点一致性问题 Redis的同步方式默认是异步的,这种异步的同步方式导致了主从之间的数据存在一定的延迟,因此Redis默认是弱一致性的。 解决: 1.使用Redisson这样的工具,它提供了分布式锁的实现,确保在分布式环…

搭贝这个低代码开发平台靠谱吗?

在应用开发领域,低代码开发平台因其拖拽式的操作给用户带来了极大的便利和灵活性。根据相关调查数据,2022年国内低代码开发平台已超过100家。搭贝在众多低代码平台中也享有一定的知名度。那么,搭贝究竟怎么样,是否值得信赖&#x…

Dify入门指南

一.Dify介绍 生成式 AI 应用创新引擎,开源的 LLM 应用开发平台。提供从 Agent 构建到 AI workflow 编排、RAG 检索、模型管理等能力,轻松构建和运营生成式 AI 原生应用,比 LangChain 更易用。一个平台,接入全球大型语言模型。不同…

IDEA Debug 断点

今天在工作发现有些新入职的小伙伴们,在调试程序时不是很会正确使用IDEA所提供Breakpoints(断点),这里就简单的介绍下比较常用的功能。 快捷键: 切换行断点:Ctrl F8 编辑断点属性:Ctrl Shift F8 断点的类型 行断点&am…

Google地图获取位置的前端代码与测试

test.html <script src"http://maps.google.com/maps/api/js?sensorfalse"></script> <script > if (navigator.geolocation) {  console.log(Geolocation is supported!);// var startPos;var geoSuccess function(position) {startPos p…

Codeforces Round 954 (Div. 3)(A~E)

目录 A. X Axis B. Matrix Stabilization C. Update Queries D. Mathematical Problem A. X Axis Problem - A - Codeforces 直接找到第二大的数&#xff0c;答案就是这个数与其他两个数的差值的和。 void solve() {vector<ll>a;for (int i 1; i < 3; i){int x;…

【C++知识点总结全系列 (02)】:C++中的语句、运算符和表达式详细总结

文章目录 1、语句(1)简单语句A.空语句B.复合语句 (2)条件语句(3)迭代语句A.常规for循环B.范围for循环C.while和do...while (4)跳转语句A.break语句B.continue语句C.goto语句 (5)异常处理语句A.标准异常B.throw抛出异常 (6)try语句 2、运算符(1)算术运算符(2)关系运算符(3)逻辑运…

Java Character类

Character是char的包装类 转义序列 Character类的方法

SpringSecurity中文文档(Servlet Persisting Authentication)

Persisting Authentication 用户第一次请求受保护的资源时&#xff0c;系统会提示他们输入凭据。提示凭据的最常见方法之一是将用户重定向到登录页。对于请求受保护资源的未经身份验证的用户&#xff0c;总结的 HTTP 交换可能如下所示: Example 1. Unauthenticated User Requ…

机器人控制系列教程之Simulink中模型搭建(1)

机器人模型获取 接上期&#xff1a;机器人控制系列教程之控制理论概述&#xff0c;文中详细讲解了如何通过Solidworks软件导出URDF格式的文件。文末提到了若需要将其导入到Simulink中可在命令行中输入smimport(urdf/S_Robot_urdf.urdf)&#xff0c;MATLAB将自动打开Simulink以…

【揭秘】国内十大顶尖AI大模型,引领智能科技新纪元

大模型大模型通常指的是参数量非常大、数据量也非常大的深度学习模型。这些模型由数百万到数十亿甚至更多的参数组成&#xff0c;需要海量的数据和强大的计算资源进行训练和推理学习的模型。大模型设计的目的在于提高模型的表示能力和性能、应对复杂数据集和任务、提升泛化能力…

65.WEB渗透测试-信息收集- WAF、框架组件识别(5)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;64.WEB渗透测试-信息收集- WAF、框架组件识别&#xff08;4&#xff09;-CSDN博客 waf绕…

c语言的烫烫烫烫烫??

当初学习C语言时&#xff0c;对于一些特殊的打印输出可能会感到困惑&#xff0c;比如会出现一堆乱码烫烫烫的情况。其实这是因为在C语言中&#xff0c;对于字符类型和数字类型之间的隐式转换可能会导致打印输出的结果不符合预期。这并不意味着程序员"烫"&#xff0c;…

详解归一化、标准化、正则化以及batch normalization

文章目录 what(是什么)where&#xff08;用在哪&#xff09;How&#xff08;如何用&&原理&#xff09;归一化实现方式原理示例说明 标准化实现方式原理示例说明 正则化实现方式原理作用 Batch Normalizationpytorch中的batch normalization原理BN的作用 归一化、标准化…

EXCEL怎么一模一样复制粘贴?

第一步 鼠标选中复制子表 右击建立副本 第二步 建立好副本表格 第三步 将选定工作表移动至新表格 第四步 成功完成移动