实时渲染 -- 几何(Geometry)

news2024/11/17 22:27:21

几何表示(Geometry Representation)

隐式表面(Implicit Surface)

一个函数定义一个隐式几何 f(x,y,z)=0。​

  • 容易判断一个点是在几何体内部(f<0)还是外部(f>0)

显式表面(Explicit Surface)

低维参数映射成隐式函数的高维参数。

  • 相对容易采样,因为低维参数所需参数数量相对少了。
  • 不容易判断点在几何体内部/外部(需要将多维参数解算成低维参数,这一步相当麻烦)。

 

Constructive Soild Geometry

通过几何体布尔运算合成的几何体。

 

有向距离场(Signed Distance Field,SDF)

有向距离场(Signed Distance Field,SDF):输入一个点,输出与这个点最近的几何体距离(有向距离)。

  • SDF 的插值会有着几何融合的效果(与一般的插值效果很不一样):

水平集(Level Set Methods):水平集则是一种用来表示 SDF 的存储结构,因为复杂的几何组合的 SDF 基本上很难用一个数学函数表示出来。网格存储近似函数值,坐标通过网格之间的插值可以得到函数输出。

点云(Point Cloud)

点的集合,一般涉及三维重建领域。

Polygon Mesh

渲染中最常见的几何表示法,通过存储一堆 polygons (往往是三角面 triangles,triangle 一般又有顶点和顶点索引组成)来表示一个 Polygon Mesh。

 

射线相交(Ray Intersection)

射线的数学形式:r(t) = o + td (0\leq t < \infty )

判断射线与几何函数 f(x) 的一般方法就是将射线方程代换掉 x:f(o+td) = 0

然后解算出 t 即为相交点,无解时则没有相交

最后还需要测试是否满足 0\leq t < \infty  ,即不为负数

射线与球面相交

球方程:(x-c)^2 - R^2 = 0

射线与平面相交

平面方程:(x-p')\cdot N = 0

射线与三角形相交

  1. 测试射线是否与三角形所在平面相交(若相交,将会得到相交点)
  2. 测试相交点是否在三角形内部

射线与AABB相交

轮流与各维度的两个平面做相交测试,可以预想到每个维度的测试都能获得两个解,按一大一小分类成 t_{max},t_{min}。 

网格细分(Mesh Subdivision)

Loop细分算法(Loop Subdivision)

注:Loop是人名,不是循环的意思

 Loop细分算法主要是针对基于三角形网格的细分。

进行一轮Loop细分的步骤:

1.先将每个三角形拆分成四个小三角形

 

2.每个新顶点(由于三角形拆分而出现的)的位置应为:

V_{new} = \frac{3}{8}\cdot (A+B) + \frac{1}{8}\cdot (C+D)

其中,A、B 是新顶点所在边的两个端点(即相邻两个三角形的共享顶点),而 C、D​ 则分别是相邻两个三角形的非共享顶点。

 3.最后,每个旧顶点的位置也应该进行调整,应为

V'_{old} = (1-n\cdot u)\cdot V_{old} + u\cdot \sum V_{neighbor}

注:旧顶点的位置调整并不依赖于新顶点,而是依赖于它本身和它周围的旧顶点。

其中, n​​ ​​​为旧顶点的度(即周围有多少个旧顶点与它直接相连),而 u�​实际上代表着周围顶点的权重且有如下规则:

u = \left\{\begin{matrix} \frac{3}{16}, & n=3\\ \frac{3}{8n}, & otherwise \end{matrix}\right.

Loop细分效果图:

Catmull-Clack 细分算法(Catmull-Clack Subdivision)

Catmull-Clack 细分算法则是支持通用网格(如包含三角形、四边形)的细分,它的主要想法是每轮细分都在面的中心和边的中心生成新顶点,然后连接所有这些新顶点即可。

进行一轮 Catmull-Clack (针对四边形Quad Mesh的情况)细分的步骤:

1.先生成每个面的Face point:f = \frac{v_1+v_2+v_3+v_4}{4}

        

2.生成每个边的Edge point:e = \frac{v_1+v_2+f_1+f_2}{4}

3.调整旧顶点的位置:v = \frac{f_1+f_2+f_3+f_4+2(m_1+m_2+m_3+m_4)+4p}{16}

其中,m 是边的中点,p是旧顶点位置

Catmull-Clack 细分效果图:

曲面细分技术(Tessellation)

曲面细分技术(Tessellation) 通过硬件+算法的方式来完成网格细分的操作,在不耗费CPU资源的情况下让简单的模型变得细节更多、表面更加光滑。

最初,Tessellation 技术仅用于网格细分。随着DirectX11中引入可编程的Tessellation Shader后,Tessellation 技术开始多了更多的顶点插值算法来实现别的效果(例如,NVIDIA的一个Demo演示了利用Tessellation技术生产的“头发”,在有限的头发模型中镶嵌入更多的头发模型)

Tessellation 可被重新编程来用来实现如下技术(部分):

  • 网格细分(Mesh Subdivision)
  • Displacement mapping
  • 头发镶嵌
  • 地形渲染

在DirectX11的渲染管线中,Tessellation 技术包含了三个流程:Hull Shader、Tessellator、Domain Shader。

  • Hull Shader(外壳着色器):控制自动生成顶点的数量(Tessellator的细分级别)和算法。

  • Tessellator:根据 Hull Shader 配置好的参数,GPU硬件会自动进行镶嵌处理。

  • Domain Shader(域着色器):修改镶嵌后的顶点的属性,可用于生成曲面、法线平移、Displacement mapping等。

网格简化(Mesh Simplification)


Quadric Error 网格简化算法(Quadric Error Mesh Simplification)

1.网格简化最简单的想法是每次简化都坍缩(collapse)一条边,并且:

坍缩一条边后自然会形成一个新的顶点,这个顶点需要放在适当的位置来尽可能保持坍缩后的模型与原来的模型一致,于是便引入了一个衡量新旧模型差别的数值概念:Quadric Error Metrics。

朴素的想法是:新顶点位置使用取周围几个顶点的位置平均或者中点的位置,旦这样效果显然不佳(如图左)。

二次误差度量(Quadric Error Metrics):坍缩后形成的新顶点与周围各个旧三角形所在平面的距离之和。

2.使用最小化 Quadric Error Metrics 方法(类比于机器学习里的最小二乘法)找到新顶点应当所在的位置即可。

Level Of Details 技术(LOD)

LOD 技术:简单来说就是渲染远处模型的时候不一定要使用原始高精度的模型,而可以使用简化的模型来替代,从而减少提交GPU的顶点数。为了做到这种优化效果且避免低模穿帮,可以根据模型与摄像机的距离来决定模型的精度(或者说简化程度)。

生成简化网格的算法往往比较耗时,因此一般采用离线计算先计算出若干个Level的模型(不同简化程度),然后在运行时根据模型与摄像机的距离来决定采用哪个Level的模型。

LOD的思想也可以应用到游戏开发的其它方面,例如一些Component的update频率可以根据与摄像机的距离来适当减小,《刺客信条》的NPC基本上就是采用这种LOD方式,因为视野远处的NPC即使行为稍有些粗糙滞后都很难被察觉到。

当然,这种Discret LOD是必然有突变的,level 切换的时候很难采用插值的方式实现模型过渡效果,因此也有LOD的实现是借助 Tessellation 技术:使用粗糙模型+Displacement mapping的方式,当模型距离最远时使用原始模型,距离越近则细分程度越高。由于细分的工作是GPU去做的,因此可以大大减少因动态切换模型而导致的开销。

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

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

相关文章

【C++】位图+布隆过滤器

位图布隆过滤器 1.位图2.布隆过滤器 喜欢的点赞&#xff0c;收藏&#xff0c;关注一下把&#xff01; 1.位图 问: 给40亿个不重复的无符号整数&#xff0c;没排过序。给一个无符号整数&#xff0c;如何快速判断一个数是否在这40亿个数中。 可能你会想到下面这几种方式&#…

分享多种vcruntime140_1.dll丢失修复办法,vcruntime140_1.dll文件下载

vcruntime140_1.dll是Windows操作系统中的一个重要系统文件&#xff0c;它与C运行库相关。当计算机上缺少或损坏了vcruntime140_1.dll文件时&#xff0c;可能会导致一系列问题和错误。出现这文件错误&#xff0c;应该很多小伙伴都会想到重新下载vcruntime140_1.dll&#xff0c;…

uniapp微信小程序图片上传功能实现,页面显示文件列表、删除功能

uniapp小程序图片上传功能效果预览 一、template 页面结构 <view class"upload-box"><view class"upload-list"><view class"upload-item" v-for"(item,index) of fileList" :keyindex><image class"img…

2024年可能会用到的几个地图可视化模板

前言 在数字化的过程中&#xff0c;数据可视化变得越来越重要。用户喜欢通过酷炫的视觉效果和直观的数据展示来理解数据。可视化地图组件是数据可视化的重要组成部分。这些地图组件提供多样化的效果&#xff0c;能够更好地展示数据的关系和地理分布&#xff0c;直观地将数据与…

制图新手首选!6款在线软件,让制图变得简单易学!

1. 即时设计 即时设计是一种国内在线UI设计工具&#xff0c;专注于UI设计领域&#xff0c;支持多人合作。即时设计是一种年轻的UI设计工具&#xff0c;前景广阔。UI设计工具的即时设计支持各种主流格式文件的引入&#xff0c;可以很容易地从其他软件转移。即时设计作为新一代U…

ubuntu22.04安装filebeat报错解决

1、查看报错 journalctl -u filebeat 或者 filebeat -c /etc/filebeat/filebeat.yml找到报错信息 runtime/cgo: pthread_create failed: Operation not permitted 2、解决报错 在filebeat.yml配置文件添加如下配置&#xff0c;重启filebeat seccomp:default_action: allow…

生命在于折腾——WeChat机器人的研究和探索

一、前言 2022年&#xff0c;我玩过原神&#xff0c;当时看到了云崽的QQ机器人&#xff0c;很是感兴趣&#xff0c;支持各种插件&#xff0c;查询游戏内角色相关信息&#xff0c;当时我也自己写了几个插件&#xff0c;也看到很多大佬编写的好玩的插件&#xff0c;后来因为QQ不…

Java零基础学习19:集合

编写博客目的&#xff1a;本系列博客均根据B站黑马程序员系列视频学习和编写目的在于记录自己的学习点滴&#xff0c;方便后续回忆和查找相关知识点&#xff0c;不足之处恳请各位有缘的朋友指正。 一、集合和数组的对比 数组和集合很相似&#xff0c;但集合只能存储引用数据类…

3W Star 网易云音乐第三方开源 API 仓库因侵权被要求删除

NeteaseCloudMusicApi是一个使用Node.js编写的非官方网易云音乐API&#xff0c;用于获取网易云音乐平台的歌曲信息。该项目是完全开源的&#xff0c;在GitHub上获得了超过3万的star。 根据公开信息&#xff0c;NeteaseCloudMusicApi的主要目的是整理网易云音乐公开的网页接口&a…

SSL证书是什么,有哪些作用

SSL证书是什么&#xff1f; SSL证书 是一种提供SSL协议的证书&#xff0c;通过在客户端浏览器与WEB服务器之间建立一条SSL安全通道&#xff0c;对网络传输数据进行加密&#xff0c;防止数据被截取或窃听。一份SSL证书包括一个公共密钥和一个私用密钥&#xff1a;公共密钥主要用…

红队视角下的公有云基础组件安全(二)

前言 我们已经发过一篇红队视角下的公有云基础组件安全的文章&#xff0c;这篇是对上一篇内容的补充&#xff0c;主要为国外公有云如AWS、Google Cloud、Azure。 本文主要从红队视角讲述公有云基本服务中一些因配置问题产生的安全风险。 目录 ● 云存储 ● 云计算 ● 云网…

【C++记忆站】类和对象(三)

文章目录 再谈构造函数构造函数赋值并非初始化初始化列表explicit关键字 static成员概念特性一、静态成员为所有类对象所共享&#xff0c;不属于某个具体的对象二、静态成员变量必须在类外定义&#xff0c;定义时不添加static关键字三、静态成员函数没有隐藏的this指针&#xf…

19.云原生CICD之ArgoCD入门CD过程实战

云原生专栏大纲 文章目录 ArgoCDArgoCD 简介GitOps介绍Argo CD 的工作流程argocd和jinkens对比kustomize介绍ArgoCD和kustomize关系 安装argocdargocd控制台介绍首页应用创建表单SYNC OPTIONS&#xff08;同步选项&#xff09;SYNC POLICY&#xff08;同步策略&#xff09; 应…

【LeetCode: 36. 有效的数独 + 模拟】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

2024年应用数学研究与测量测绘国际会议(AMRSMIC 2024)

2024年应用数学研究与测量测绘国际会议(AMRSMIC 2024) 2024 International Conference on Applied Mathematics Research and Surveying and Mapping(AMRSMIC 2024) 数据库&#xff1a;EI,CPCI,CNKI,Google Scholar等检索 一、【会议简介】 2024年图像处理与大数据信息应用国际…

《2023 亚信安慧AntDB数据库年度报告》请查收

关于亚信安慧AntDB数据库 AntDB数据库始于2008年&#xff0c;在运营商的核心系统上&#xff0c;服务国内24个省市自治区的数亿用户&#xff0c;具备高性能、弹性扩展、高可靠等产品特性&#xff0c;峰值每秒可处理百万笔通信核心交易&#xff0c;保障系统持续稳定运行超十年&a…

Qt5编译qextserialport(Qt5.14.2+VS2017)

1、qextserialport库下载 (1)github GitHub - qextserialport/qextserialport: Automatically exported from code.google.com/p/qextserialport (2) code.google https://code.google.com/archive/p/qextserialport/downloads 我下载的是最新版qextserialport-1.2rc.zip ​…

佛像三维扫描文物抄数建模服务雕塑等比例仿制/制作逆向设计造型

文物三维扫描等比例仿制/制作是一项利用先进技术手段对珍贵文物进行复制或仿制的过程。这种技术可以准确地测量文物的三维尺寸和形状&#xff0c;并且利用高精度3D打印技术或精密加工工艺制作出与原文物完全一致的复制品或仿制品。 CASAIM中科广电专业提供文物三维扫描等比例仿…

鸿蒙开发系列教程(九)--ArkTS语言:ForEach循环渲染

ForEach&#xff1a;循环渲染 官方&#xff1a;ForEach接口基于数组类型数据来进行循环渲染&#xff0c;需要与容器组件配合使用&#xff0c;且接口返回的组件应当是允许包含在ForEach父容器组件中的子组件。 语法&#xff1a; ForEach( arr: Array, itemGenerator: (item…

1030 完美数列 (20)(测试点4,5)

给定一个正整数数列&#xff0c;和正整数 p&#xff0c;设这个数列中的最大值是 M&#xff0c;最小值是 m&#xff0c;如果 M≤mp&#xff0c;则称这个数列是完美数列。 现在给定参数 p 和一些正整数&#xff0c;请你从中选择尽可能多的数构成一个完美数列。 输入格式&#x…