Three.js深度冲突(模型闪烁)与解决方案

这篇具有很好参考价值的文章主要介绍了Three.js深度冲突(模型闪烁)与解决方案。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Mesh面重合渲染测试 

下面代码创建两个重合的矩形平面Mesh,通过浏览器预览,当你旋转三维场景的时候,你会发现模型渲染的时候产生闪烁。

这种现象,主要是两个Mesh重合,电脑GPU分不清谁在前谁在后,这种现象,可以称为深度冲突Z-fighting

// 两个矩形平面Mesh重合,产生闪烁
// 闪烁原因:两个矩形面位置重合,GPU无法分清谁在前谁在后
const geometry = new THREE.PlaneGeometry(250, 250);
const material = new THREE.MeshLambertMaterial({
    color: 0x00ffff,
    side: THREE.DoubleSide,
});
const mesh = new THREE.Mesh(geometry, material);


const geometry2 = new THREE.PlaneGeometry(300, 300); 
const material2 = new THREE.MeshLambertMaterial({
    color: 0xff6666,
    side: THREE.DoubleSide,
});
const mesh2 = new THREE.Mesh(geometry2, material2);

look

threejs模型闪烁,Three.js,前端,webgl,材质,着色器,javascript

两个矩形Mesh拉开距离

适当偏移,解决深度冲突,偏移尺寸相对模型尺寸比较小,视觉上两个平面近似还是重合效果。

mesh2.position.z = 1;

 threejs模型闪烁,Three.js,前端,webgl,材质,着色器,javascriptthreejs模型闪烁,Three.js,前端,webgl,材质,着色器,javascript

间隙很小,深度冲突

当两个面间隙很小,也可能出现深度冲突。从纯理论的角度,你能分清0和0.0000...0000001的大小,但是实际上,电脑GPU精度是有限的

// 当两个面间隙很小,也可能出现深度冲突。
mesh2.position.z = 0.0000000000000000000001;

 同样会有问题 

 threejs模型闪烁,Three.js,前端,webgl,材质,着色器,javascript

透视投影相机对距离影响(深度冲突)

  • 第1步:设置两个Mesh平面的距离相差0.1,没有深度冲突导致的模型闪烁问题
mesh2.position.z = 0;
mesh2.position.z = 0.1;
camera.position.set(292, 223, 185);
  • 第2步:改变相机.position属性,你会发现当相机距离三维模型较远的时候,两个面也可能出现深度冲突,当然也可以通过相机控件OrbitControls缩放功能,改变相机与模型的距离,进行观察。
camera.position.set(292*5, 223*5, 185*5)

看效果

threejs模型闪烁,Three.js,前端,webgl,材质,着色器,javascript

透视投影相机的投影规律是远小近大,和人眼观察世界一样,模型距离相机越远,模型渲染的效果越小,两个mesh之间的间距同样也会变小。当两个Mesh和相机距离远到一定程度,两个模型的距离也会无限接近0。

webgl渲染器设置对数深度缓冲区

两个矩形平面距离比较近,相差0.1

mesh2.position.z = 0;
mesh2.position.z = 0.1;
camera.position.set(292*5, 223*5, 185*5);

当一个三维场景中有一些面距离比较近,有深度冲突,可以尝试设置webgl渲染器设置对数深度缓冲区logarithmicDepthBuffer: true来优化或解决。logarithmicDepthBuffer: true作用简单来说,就是两个面间距比较小的时候,让threejs更容易区分两个面,谁在前,谁在后。

// WebGL渲染器设置
const renderer = new THREE.WebGLRenderer({
    // 设置对数深度缓冲区,优化深度冲突问题
    logarithmicDepthBuffer: true
});

 有一点要注意,当两个面间隙过小,或者重合,你设置webgl渲染器对数深度缓冲区也是无效的。

mesh2.position.z = 0;
//当两个面重合,logarithmicDepthBuffer: true无效
mesh2.position.z = 0;
//当两个面间隙过小,logarithmicDepthBuffer: true无效
mesh2.position.z = 0.00001;
camera.position.set(292*5, 223*5, 185*5);

 文章来源地址https://www.toymoban.com/news/detail-583547.html

到了这里,关于Three.js深度冲突(模型闪烁)与解决方案的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • jar包冲突解决方案

    使用背景 在构建工程中,不可避免的引入多方依赖。从jar包冲突产生结果可大致分为两类: 1.同一个jar包出现了多个不同的版本。应用选择了错误的版本导致jvm加载不到需要的类或者加载了错误版本的类。 2.不同的jar包出现了类路径一致的类,同样的类出现在多个不同的依赖

    2024年02月09日
    浏览(48)
  • 【多线程】| 线程冲突解决方案

    同一进程内的线程是共享同一内存空间的,所以在多个线程的进程里,线程是可以同时操作这个进程空间的数据的,这样就容易造成线程冲突的情况。 举个小李子:一个房子里(代表一个进程),只有一个厕所(代表一个资源)。屋子里面有两个人A和B(代表两个线程),共

    2024年02月05日
    浏览(52)
  • Win系统 - 罗技 G604 鼠标蓝灯闪烁、失灵解决方案

    问题信息 今天突然鼠标用着用着就失灵了,以为是没电池了,换新后还是失灵,然后发现鼠标上面的蓝灯一直在闪烁,估计是蓝牙连接问题了(如图所示)这里如果蓝灯一直闪烁,说明蓝牙出问题了 解决方案 很简单,简单粗暴的方式,蓝牙重置;点击箭头的按钮(长按)直

    2024年02月12日
    浏览(50)
  • Elasticsearch并发写入版本冲突解决方案

    搜索公众号, AmCoder 干货及时送达👇  众所周知,es经常被用于存储日志数据,其中在某些场景下,日志产生的时机不同,并且需要将多类具备关联关系的日志写入同一个document,就会带来同一个文档可能会被其它文档覆盖,或者missing等问题。 大家都知道es是不支持事务的,

    2023年04月19日
    浏览(53)
  • EIP-6963: 多钱包冲突的解决方案

    最近提出的 EIP-6963 旨在提供一个解决方案,以解决当用户试图在一个单一的网络浏览器中使用多个钱包供应商时出现的冲突问题。在这种情况下,这些冲突的钱包会导致用户体验下降,阻碍用户对其以太坊界面的控制,并使与 dApp 互动的过程变得复杂。 原始提案文档地址:

    2024年03月10日
    浏览(52)
  • Git_常用命令+代码冲突解决方案

    –local: 配置对当前仓库有效 –global: 配置对当前用户(指的是当前用于登录系统的用户)的所有仓库有效 设置用户名及邮箱 注意:由于此处设置的用户名中间有空格所以要使用双引号,正常设置时无需使用双引号 设置仓库的认证方式 credentail.helper后的参数可选: cache: 在第

    2024年04月14日
    浏览(56)
  • git请求合并时出现冲突的解决方案

    请求合并时出现冲突,一般是有多人修改了同一个地方导致的,我们一般在本地解决好冲突后再上传到远端仓库,然后再次发起合并。 本流程适合无主分支权限的情况 在出现冲突的开发分支上解决流程: 1、先拉取主干分支 main到本地开发分支dev git pull origin main 2、借助工具

    2024年02月11日
    浏览(53)
  • mysql‘逻辑删除‘和‘唯一索引‘冲突的解决方案

    在user表中将name字段设置唯一索引,添加逻辑删除字段del_flag(1为删除,0为未删除)之后,将name=张四的字段删除,再添加一个name=张四的记录则会出现冲突 删除的时候将del_flag设置为null,未删除时候为0,冲突解决 在配置文件中这样配置:

    2024年02月10日
    浏览(39)
  • 解决Hash(哈希表)冲突的四种方案

    参考鸣谢 解决哈希冲突必须知道的几种方法 小僵鱼 你还应该知道的哈希冲突解决策略 vivo互联网技术 解决哈希冲突的三种方法 kaleidoscopic 每日一题(哈希表及哈希冲突解决办法) 和笙 哈希是一种通过对数据进行压缩, 从而提高效率的一种解决方法 ,但由于哈希函数有限,数据

    2024年02月14日
    浏览(45)
  • Elasticsearch深入理解 并发写入导致版本冲突解决方案【实战】

         数据同步中,在使用阿里云Elasticsearch7.10.0版本的集群作为目标数据源时,在连续写入同一文档(document)出现版本冲突问题。 注意:以下所述均以阿里云7.10.0版本的Elasticsearch集群为前提(不同版本可能会稍有不同)       以生产环境的错误日志信息为例: ElasticsearchSta

    2023年04月18日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包