用BSP优化3D渲染

3D渲染引擎设计者面临的最大问题之一是可见性计算:只必须绘制可见的墙壁和物体,并且必须以正确的顺序绘制它们(应该在远处的墙壁前面绘制近墙) 。 更重要的是,对于游戏等应用程序来说,开发能够快速渲染场景的算法非常重要。 因此,现在存在多种解决可见性计算问题的方法。

二进制空间分区 (BSP) 是一种可用于大大加快 3D 渲染中可见性计算速度的技术。 它已被多款著名游戏使用,例如《Doom》和《Quake》。

  • Map — 这是指正在渲染的区域:在游戏中,这是游戏地图或关卡。
  • Viewpoint——我们渲染的视角
  • Field of View — 视野,从视点的位置和角度可见的地图区域

使用 Doom 使用的二维地图示例来解释该系统。 然而,BSP 可以轻松扩展到 3 维(或更多?)——代替 2 维线,可以使用 3 维平面等。

1、预先计算

在渲染地图之前,我们必须对其执行大量计算。 然而,一旦执行这些计算,其结果就可以多次使用。 这是 BSP 的优点之一——一旦执行了计算,就不需要再次执行,除非地图发生更改。 BSP 只允许“静态”地图,或者不移动的地图。 如果地图有任何移动部分,那么它们必须单独渲染。

必须做的是将地图划分为凸多边形。 凸多边形是所有内角都小于或等于180度的多边形。 例如,以下形状是凸多边形:

然而,以下形状不是凸形的:

如果地图被认为是一个非凸多边形,我们可以通过在其上画一条分界线将其分成两个子多边形。 例如,考虑以下地图:

将这个多边形一分为二时,我们创建了两个“子多边形”。 这种划分可以用一个简单的树来表示:

现在可以递归地划分两个子多边形中的每一个。 每个分支都会为树产生一个新的“分支”。 递归一直持续到地图被划分为凸多边形,即树的“叶子”。

出于显而易见的原因,如果可能的话,希望保持树“平衡”:也就是说,保持树两侧的高度大致相等。

2、渲染

使用 BSP 树的渲染也是使用递归算法完成的。 最常见的方法是从根节点(树的顶部)开始并递归地向下工作。 这就是为什么需要保持树平衡:这减少了递归的数量。 递归到大深度可能会显着减慢渲染速度。

可见性排序系统的核心在于渲染函数递归的顺序。 也就是说,给定节点的左子树还是右子树是否先渲染。 对于任何特定节点,都有一条分界线,将其分为两个子节点。 如果这条线延伸到无穷远,我们渲染的视点可以被认为是在“左”或“右”侧。 视点所在的一侧决定首先渲染哪个子节点。

请注意,实际上有两种执行渲染的方式:

  • 从后到前

在从后到前的渲染器中,首先渲染远处的墙壁,并被较近的墙壁遮挡。 这是上图中使用的系统。 从后到前渲染的缺点之一是过度绘制 - 绘制的部分墙壁被较近的墙壁遮挡而看不到。 这是不必要的开销。

  • 从前到后

从前到后渲染器以相反的方式工作:首先渲染较近的墙壁,然后将较远的墙壁剪裁到已绘制的墙壁上。 因为它没有过度绘制,所以几乎所有实用的 BSP 渲染器都使用从前到后的方法。

因此,简单的从后到前渲染器的一些示例伪代码将是:

function render(node)
{if this node is a leaf{draw this node to the screen}else{determine which side of the dividing line the viewpoint isif it is on the left side{render(right subnode)render(left subnode)}else{render(left subnode)render(right subnode)}}
}

bsp 树的主要缺点是整个地图必须是静态的(不可移动)——如果其中一部分移动,则必须重建整个树。 克服这个问题的一种方法是将静态和移动部分分开,并分别渲染它们。

3、BSP 树的其他用途

除了可见性排序之外,BSP 树还有许多其他用途。 其中之一是,以分层方式划分地图(例如这样)允许将地图的大部分排除在渲染过程之外 - 如果所有特定节点都在视点的视野之外,则该节点可以从渲染中丢弃。 这是加速渲染引擎的快速有效的方法。

这棵树还可以用于许多其他效果,例如阴影。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【python】Jupyter Notebook 修改默认路径

文章目录 一、修改前(一)问题(二)修改前的默认路径 二、修改配置文件、更改路径(一)找到配置文件并打开(二)创建目标文件夹、得到新的路径(三)修改配置文件 三…

Android15功能和 API 概览

Android 15 面向开发者引入了一些出色的新功能和 API。以下部分总结了这些功能,以帮助您开始使用相关 API。 如需查看新增、修改和移除的 API 的详细列表,请参阅 API 差异报告。如需详细了解新的 API,请访问 Android API 参考文档&#xff0…

【Redis】数据类型、事务执行、内存淘汰策略

目录 数据类型 Redis事务执行步骤 步骤: redis内存淘汰策略 设置内存淘汰策略 1.设置配置文件 2.通过命令设置 数据类型 官网解释 Understand Redis data types | Redis 首先,Redis 的所有键都是字符串,常用的数据类型有 5 种:Strin…

蓝牙信标覆盖范围

蓝牙信标覆盖范围是一个重要的考虑因素,对于蓝牙技术的应用和部署至关重要。了解蓝牙信标的覆盖范围可以帮助我们更好地规划蓝牙设备的布局和位置,从而实现最佳的信号覆盖和传输效果。 首先,我们需要明确蓝牙信标的覆盖范围受到多种因素的影…

python--递归

1.递归 object--对象 递归(recursion): 函数自身调用自身 2.求1~100的和 def count(num):# n (n-1) ... 1if num 1:return 1return num (count(num - 1))print(count(100))3.求Fibonacci 0 1 1 2 3 5 …

外包干了1年....字节跳动面试高频考点,懒加载

一、文章内容 什么是懒加载懒加载的优点什么时候使用懒加载学习懒加载前置内容实战懒加载图片 二、什么是懒加载? 从语法角度分析懒加载,懒是adj形容词,加载是名词;或者懒看为副词,加载作为动词,这样就能理解懒加载了就是懒懒的/地加载,更通俗的讲就是通过一种手段来加载.就…

Linux内核err.h文件分析

在阅读和编写内核相关的代码时,经常会看到IS_ERR、ERR_PTR等函数。这些函数在内核头文件的err.h中。以我服务器的代码为例,内核版本为5.15。 这个文件的代码如下: /* SPDX-License-Identifier: GPL-2.0 */ #ifndef _LINUX_ERR_H #define _L…

Nacos介绍和统一配置管理

Nacos(全称为 Alibaba Cloud Nacos,或简称为 Nacos)是一个开源的分布式服务发现和配置管理系统。它由阿里巴巴集团开发并开源,旨在帮助开发人员简化微服务架构下的服务注册、发现和配置管理。 一、Nacos 提供了以下主要功能&…

论文阅读之PeriodicLoRA: Breaking the Low-Rank Bottleneck in LoRA Optimization(2024)

文章目录 论文地址主要内容主要贡献模型图技术细节实验结果 论文地址 PeriodicLoRA: Breaking the Low-Rank Bottleneck in LoRA Optimization 主要内容 这篇文章的主要内容是介绍了一种名为PeriodicLoRA(PLoRA)的参数高效微调(Parameter-…

基于Springboot Vue医院管理系统+数据库脚本+文档(万字)

项目效果视频: 基于Springboot Vue医院管理系统 一、 项目介绍 角色:管理员、患者、医生 基于springboot vue实现的医院管理系统,有管理员、医生和患者三种角色。系统拥有丰富的功能,能够满足各类用户的需求,系统提供了登录和注册…

ensp静态路由综合实验(一)

实验拓扑: 实验目的: 1、R6为ISP,接口IP地址均为公有地址,该设备只能配置IP地址,之后不能再对其进行任何配置; 2、R1-R5为局域网,私有IP地址192.168.1.0/24,请合理分配;…

超声波清洗机值不值得买?今年最值得入手的四款眼镜清洗器推荐!

如果是经常佩戴眼镜,并且眼镜比较容易脏,自己又很懒不会经常清洗眼镜的时候,不妨考虑眼镜超声波清洗机!因为眼镜在比较脏的时候,如果不清洁干净,长期佩戴模糊不清的镜片,会导致眼镜的视力下降严…

UE5C++学习(四)--- SaveGame类存储和加载数据

上一篇说到使用数据表读取数据,如果我开始玩游戏之后,被怪物打了失去了一部分血量,这个时候我想退出游戏,当我再次进入的时候,希望仍然保持被怪物打之后的血量,而不是重新读取了数据表,这个时候…

羊大师解析,孩子喝羊奶的好处

羊大师解析,孩子喝羊奶的好处 孩子喝羊奶有诸多好处。羊奶富含多种营养物质,包括蛋白质、脂肪、维生素和矿物质等,对孩子的生长发育和身体健康都有积极的促进作用。羊奶中的蛋白质含量丰富,且易于消化吸收。这些优质蛋白质可以为…

对电商不懂但又很想做抖店,该如何入局呢?给你一些电商入门建议

我是王路飞。 对电商感兴趣的不在少数,但这种兴趣可能更多是被电商的巨大红利给勾起来的。 天下熙熙皆为利来,天下攘攘皆为利往,这很正常。 尤其是电商中的抖店项目,作为近几年的黑马项目,接着直播带货的热度,吸引了…

k8s入门到实战(五)—— k8s存储卷详细介绍

存储卷 什么是存储卷 在 k8s 中,存储卷(Volume)是一种抽象的概念,用于提供 pod 中容器的持久化存储。存储卷允许将数据存储在 pod 的生命周期之外,以便在容器重启、迁移或重新调度时保留数据。 存储卷可以连接到 po…

Python:基础语法

一、import与from.....import 有时候我们需要使用一些第三方库或包时,我们就需要通过import或from.....import导入模块。 # 导入库 import sys print("hello,world") 当我们自己写了些函数,在其他py文件,我们也可以通过from.....im…

OC对象 - Block解决循环引用

文章目录 OC对象 - Block解决循环引用前言1. 循环引用示例1.1 分析 2. 解决思路3. ARC下3.1 __weak3.2 __unsafe_unretained3.3 __block 4. MRC下4.1 __unsafe_unretain....4.1 __block 5. 总结5.1 ARC下5.2 MRC下 OC对象 - Block解决循环引用 前言 本章将会通过一个循环引用…

项目管理商业文件--商业论证与效益管理计划

本文描述从事项目管理和了解项目管理领域所需的基本知识,词汇定义来自于《项目知识管理体系》(PMBOK指南)第六版,仅作个人学习使用,任何对此文章的引用,应当说明源出处,不得用于商业用途。 如有侵权、联系速删 文章目录…

SAP ABAP Update Module 调试

最近搞SAP migo的调试 BADI 那如何让起效呢 参考 SAP调试一: Update Module函数调试 - 程序员大本营 先在 BEFORE_update 里面打上内部断点 再在update里面打上外部断点 断点调试的时候 在设置->更改调试器参数文件/设置 如下图