隐式渲染 收集 SphereTracing

这篇具有很好参考价值的文章主要介绍了隐式渲染 收集 SphereTracing。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Implicit

何为隐式?隐式(Implicit)的是显式(explicit)的反义词。

explicit可以简单理解为用网格等信息描述的几何形状,网格信息是离散的,信息量越大描述越精准。Implicit则不需要顶点等显式信息,用方程,或者说有符号距离场 (Signed Distance Field) 即SDF,表示几何形状的数学模型。

SDF

在SDF中,空间中的每一点都有一个值,表示该点到最近表面的距离。这个距离可以是正的(如果点在形状的外部),也可以是负的(如果点在形状的内部)。SDF提供了一种简洁而强大的方式来描述复杂的三维形状,包括难以用传统多边形网格表示的形状。

SDF的优势:

  1. 高效的几何操作:进行布尔运算以及形状变形和平滑处理变得简单高效。
  2. 复杂形状的表示:特别适合描述复杂或有机形状,如流体、云雾和生物组织。
  3. 动态变化的支持:使实时更新和变形成为可能。

对几何primitive的sdf描述
Inigo Quilez :: computer graphics, mathematics, shaders, fractals, demoscene and more (iquilezles.org)

Sphere Tracing

why

传统的光线追踪算法,通过发送光线并检测这些光线与场景中物体的交点,进行着色。但是当场景使用SDF来表示时,传统的交点检测方法不再适用。原因在于SDF和多边形网格表示场景的方式截然不同:

  1. 顶点表示:在传统的多边形网格表示中,物体由许多小的平面片(通常是三角形)构成的。这些三角形有明确的边界和顶点,因此当光线与这些三角形相交时,可以通过数学计算找到精确的交点
  2. SDF表示:相比之下,SDF场景被视为一个连续的体。体中每个点都有一个值,表示该点到最近表面的距离。这种表示方法不涉及明确的边界或顶点,而是提供关于形状表面的连续信息

由于SDF没有离散的多边形或边界,传统的光线与多边形的交点检测算法(通常涉及线性代数和平面几何计算)不再适用。在SDF表示的场景中,没有明确的多边形表面可以直接与光线进行交点计算。因此需要Sphere Tracing这样的算法来处理SDF场景。

How

原版的SphereTracing十分讨巧,其基本原理非常简洁,也非常聪明:

  1. 从点 \(p_0\) 开始投射一条 ray,以 SDF 值 \(f(p_0)\) 为步长进行一次 marching。
  2. 以上次 marching 的终点为起点,以 \(f(p_1)\) 为步长继续下一次 marching。
  3. 重复 marching 直到 \(f(p_n)\) < \(\epsilon\) , \(\epsilon\) 为预设的阈值。此时我们认为 \(f(p_n)\) 即为交点。
    隐式渲染 收集 SphereTracing

Enhanced Sphere Tracing

上述的传统 Sphere Tracing 算法冗余的步进次数很多,为了进一步提高效率,诞生了很多种优化方案。

binary search 二分查找法,实际效果不理想,并且遇上TPMS这种复杂结构会有更多问题
Inigo Quilez :: computer graphics, mathematics, shaders, fractals, demoscene and more (iquilezles.org)

Segment Tracing 通过假设场景是 \(C^2\) 连续去加长初始 marching 的距离,有效减少 marching 次数的同时,大幅提升了每次 marching 的消耗,效果不理想,并且在有棱角的场景表现更差
https://diglib.eg.org/bitstream/handle/10.1111/cgf13951/v39i2pp545-554.pdf
GitHub - aparis69/Segment-Tracing: Source code for the Computer Graphics Forum paper: Segment Tracing Using Local Lipschitz Bounds. Presented at Eurographics 2020.
【光线追踪】Segment Tracing:一种可能加速距离场求交的实时光线追踪方案 - 知乎 (zhihu.com)
Enhanced Sphere Tracing 采用激进的 marching 步长,即设定一个步长倍数\(\alpha\) ,marching 步长改为 \(f(p_n) * \alpha\) 而不是 Sphere Tracing 保守的 \(f(p_n)\) 。只要两个 sphere 相交,就说明本次 marching 可安全,否则退回到点 \(p_n\) 的位置重新进行保守的 marching。
隐式渲染 收集 SphereTracing
Accelerating Sphere Tracing 在 enhanced 的基础上更进一步。假设前两次 marching 所形成的 sphere 都相切于同一平面,那么下一次可以尝试 marching 同样与该平面相切并且也与上一次的 marching sphere 相切的距离。同样,如果尝试失败则回退至保守 marching。

隐式渲染 收集 SphereTracing

上述两个方法都是在2023年以前最优秀的 marching 算法之一,直到 Automatic Step Size Relaxation。

Automatic step size relaxation

Automatic step size relaxation 可以根据历史 marching 的情况,动态调整步长:平面多的地方。可以走相切平面的激进步长,而曲面多的地方则调整为走更保守的步长。
隐式渲染 收集 SphereTracing
每次 marching 不断更新近似斜率 m,然后用它来指导下一次 marching。

博主拙劣的C++实现

auto trace_auto_relaxation = [&](glm::vec3 p)
{
	float t = 0.0f;
	float r = sdf(p);
	float m = -1.0f;
	float z = r;
	const float beta = 0.3f;

	for (int i = 0; i < max_steps; i++)
	{
		if (r < eps) {
			return true;
		}
		if (t + r > max_dist) {
			break;
		}

		glm::vec3 next_p = p + ray_dir * z * relaxation_factor;
		float R = sdf(next_p);
		bool doBackStep = z > abs(R) + r;

		if (!doBackStep) {
			float M = (R - r) / (z + 1e-5f);
			m = (1.0f - beta) * m + beta * M;
			t += z * relaxation_factor;
			p = next_p;
			r = R;
		}
		else {
			m = -1.0f;
		}

		float omega = glm::max(1.0f, 2.0f / (1.0f - m));
		z = glm::max(eps, r * omega);
	}
	return false;
};

But

讲完了吗?讲完我要开始转了。
上述的所有方法,对 TPMS(Triply Periodic Minimal Surfaces 三周期极小曲面),都起不到多少作用。目前效果最好的办法只能是力大砖飞——marching 步长乘以系数 \(\alpha ,\alpha < 1\) ,以非常保守的步长去小心翼翼的找TPMS表面。也是博主目前最头疼的问题,欢迎讨论。

隐式渲染 收集 SphereTracing文章来源地址https://www.toymoban.com/news/detail-791614.html

到了这里,关于隐式渲染 收集 SphereTracing的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • selenium Explicit 和 Implicit Waits区别

    The Selenium Browser Automation Project | Selenium Explicit and Implicit Waits Waiting is having the automated task execution elapse a certain amount of time before continuing with the next step. You should choose to use Explicit Waits or Implicit Waits. WARNING: Do not mix implicit and explicit waits. Doing so can cause unpredictable wait times. For example

    2024年02月10日
    浏览(34)
  • DDIM原理及代码(Denoising diffusion implicit models)

    之前学习了 DDPM(DDPM原理与代码剖析)和 IDDPM(IDDPM原理和代码剖析), 这次又来学习另一种重要的扩散模型。它的采样速度比DDPM快很多(respacing),扩散过程不依赖马尔科夫链。 Denoising diffusion implicit models, ICLR 2021 摘选paper一些重要思想。 (1) 由于DDPM加噪基于马尔科夫链过程,那么

    2024年02月02日
    浏览(42)
  • NICE-SLAM: Neural Implicit Scalable Encoding for SLAM论文阅读

    标题 :NICE-SLAM: Neural Implicit Scalable Encoding for SLAM 作者 :Zihan Zhu, Songyou Peng,Viktor Larsson — Zhejiang University 来源 :CVPR 代码 :https://pengsongyou.github.io/nice-slam 时间 :2022 神经隐式(Neural implicit representations)表示最近在同步定位和地图绘制(SLAM)方面有一定的进展,但现有方法

    2024年02月15日
    浏览(53)
  • MySQL提示Illegal mix of collations (utf8mb4_0900_ai_ci,IMPLICIT) and (utf8mb4_general_ci,IMPLICIT)

    根据错误提示,报错原因应该是=号两侧内容的排序规则(collation)不一致导致的报错。 原sql中出现了: status !=\\\'取消\\\' 原因是:表字段的排序规则为utf8mb4_0900_ai _ci,而字面常量是排序规则是utf8mb4_general_ci  collation_connection用于字面常量比较,如果字段比较会使用字段或表声明

    2024年01月18日
    浏览(45)
  • Scala 如何调试隐式转换--隐式转换代码的显示展示

    在需要隐式转换的地方,把需要的参数显示的写出。 在terminal中 利用 scalac -Xprint:typer xxx.scala 方法打印添加了隐式值的代码示例。 对于复杂的工程来说,直接跑到terminal执行 scalac -Xprint:typer xxx.scala 会报很多库不存在的错误。 可在idea的设置中,找到如下配置,写入 -Xprint:ty

    2024年02月12日
    浏览(43)
  • 毫米波雷达成像论文阅读笔记: IEEE TPAMI 2023 | CoIR: Compressive Implicit Radar

    原始笔记链接:https://mp.weixin.qq.com/s?__biz=Mzg4MjgxMjgyMg==mid=2247486680idx=1sn=edf41d4f95395d7294bc958ea68d3a68chksm=cf51be21f826373790bc6d79bcea6eb2cb3d09bb1860bba0af0fd5e60c448ca006976503e460#rd ↑ uparrow ↑ 点击上述链接即可阅读全文 毫米波雷达成像论文阅读笔记: IEEE TPAMI 2023 | CoIR: Compressive Implicit Radar Ab

    2024年02月12日
    浏览(36)
  • 论文阅读之Reasoning Implicit Sentiment with Chain-of-Thought Prompting

    本文主要对2023ACL论文《Reasoning Implicit Sentiment with Chain-of-Thought Prompting》主要内容进行介绍。 虽然情绪分析任务中通常根据输入文本中的关键意见表达来确定给定目标的情绪极性,但在隐式情绪分析(ISA)中,意见线索通常是隐含或者模糊的。因此,检测隐含情绪需要常识和

    2024年03月22日
    浏览(56)
  • 数字化新星何为低代码?何为无代码

    码是一类新兴的数字化产品,受到越来越多厂商和用户的青睐。低代码刚出现的时候,市场概念相对朴素,用户较容易理解。各类厂商入局后,为了提升差异化竞争能力,纷纷提出各种概念,例如表单驱动、模型驱动、数据驱动、工作流引擎等。2022年,海比研究院研究显示,

    2024年01月24日
    浏览(44)
  • Scala-隐式转换

    精度小的类型可以自动转换为精度大的类型,这个转换过程无需开发人员参与,由编译器自动完成,这个转换操作我们称之为隐式转换。 如果程序编译出错,编译器会尝试在整个的作用域中查找能够让程序编译通过的方式 如果找到,那么编译器会尝试二次编译,让之前编译

    2024年01月20日
    浏览(43)
  • MySQL隐式类型转换

    当运算符与不同类型的操作数一起使用时,会发生类型转换以使操作数兼容。有些转换是隐式发生的。例如,MySQL会根据需要自动将字符串转换为数字,反之亦然。 如果一个或两个参数都为 NULL ,则比较结果为 NULL 。但是相等比较运算符 = 除外,对于 NULL=NULL ,结果为1,不需

    2023年04月23日
    浏览(48)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包