Implicit隐式渲染入门 SDF SphereTracing

这篇具有很好参考价值的文章主要介绍了Implicit隐式渲染入门 SDF 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)\) 即为交点。
    Implicit隐式渲染入门 SDF 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。
Implicit隐式渲染入门 SDF SphereTracing
Accelerating Sphere Tracing 在 enhanced 的基础上更进一步。假设前两次 marching 所形成的 sphere 都相切于同一平面,那么下一次可以尝试 marching 同样与该平面相切并且也与上一次的 marching sphere 相切的距离。同样,如果尝试失败则回退至保守 marching。

Implicit隐式渲染入门 SDF SphereTracing

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

Automatic step size relaxation

Automatic step size relaxation 可以根据历史 marching 的情况,动态调整步长:平面多的地方。可以走相切平面的激进步长,而曲面多的地方则调整为走更保守的步长。
Implicit隐式渲染入门 SDF 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表面。也是博主目前最头疼的问题,欢迎讨论。

Implicit隐式渲染入门 SDF SphereTracing文章来源地址https://www.toymoban.com/news/detail-787944.html

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

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

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

相关文章

  • SDF文件【简要说明】

    SDF (Standard Delay Format),标准延时格式文件,常用延迟反标注。该文件包含了仿真用到的所有 IOPATH,INTERCONNECT的延时。 线延时: 表示 fsm_block/U27/Q端口到fsm_block/U41/C端口的连线延时最小是0.002,最大是0.002。典型值在sdf中没有说明。因此在Modelsim里反标sdf延时时,要指定-sdfmin或

    2024年02月11日
    浏览(29)
  • 零基础入门Vue之影分身之术——列表渲染&渲染原理浅析

    从 条件渲染 那一篇,我学习到了如何用Vue对dom节点根据条件显示 但单单有条件还不够啊,有时候数据是一大坨一大坨的数据,如果Vue不提供咱要么使用“v-html” 要么就没办法实现 v-html又感觉太low了,Vue提供了另外的指令更好的实现,那便是:列表渲染 简单的列表渲染可以

    2024年02月19日
    浏览(22)
  • 编译错误 error: implicit declaration of function ‘getopt’ [-Werror=implicit-function-declaration] 解决方法

    编译错误: error: implicit declaration of function ‘getopt’ [-Werror=implicit-function-declaration] 在某些C标准中,要求函数必须在调用前具有显示声明,例: 若在调用前没有显示声明,则报编译错误,例: 使用 getopt 方法时,需要先 #include utistd.h , utistd.h 中又进行了 #includegetopt.h 的包含

    2024年02月16日
    浏览(53)
  • Unity shader 入门之渲染管线一、总览

     如下示意图 应用阶段(ApplicationStage):准备场景信息(视景体,摄像机参数)、粗粒度剔除、定义每个模型的渲染命令(材质,shader)——由开发者定义,不做讨论。 几何阶段(GemetryStage):顶点着色器、曲面细分着色器、几何着色器、裁剪、屏幕映射; 光栅化阶段(Rasterizer

    2024年02月11日
    浏览(33)
  • 基于Three.js的WebXR渲染入门

    我不会花太多时间讨论 Three.JS 渲染管道的工作原理,因为它在互联网上有详细记录(例如,此链接)。 我将在下图中列出基础知识,以便更容易理解各个部分的去向。 在我们深入了解 WebXR API 本身之前,您应该知道 WebXR 设备 API Polyfill 可通过两种主要方式帮助开发人员: 如

    2024年02月11日
    浏览(34)
  • 【微信小程序入门到精通】— 条件渲染实现方式

    对于目前形式,微信小程序是一个热门,那么我们该如何去学习并且掌握之后去做实际项目呢? 为此我特意开设此专栏,在我学习的同时也将其分享给大家! 本篇文章我将带大家学习一下条件渲染相关知识点,接下来我将结合例子来讲解! 如果在往下阅读的过程中,有什么

    2024年02月01日
    浏览(31)
  • HDL抽象等级 仿真模型 网表 delay speicfy与sdf

    HDL这里主要说verilog 在描述硬件电路时分为三个抽象级别 行为级模型: 主要用于test bench,着重系统行为和算法,不在于电路实现,不可综合 (常用描述有initial,fork/join,task,function,repeat,wait,event,while等)。 •RTL级模型:主要用于集成电路的设计(ASIC,SOC或FPGA等),

    2024年02月09日
    浏览(28)
  • 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日
    浏览(27)
  • Unity中的渲染优化技术 -- Shader入门精要学习(15)

    本章中,我们将阐述一些 Unity 中常见的优化技术。这些优化技术都是和渲染相关的,例如,使用批处理、LOD 技术等。 游戏优化不仅是程序员的工作,更需要美工人员在游戏的美术上进行一定的权衡。例如,避免使用全屏的屏幕特效,避免使用计算复杂的 Shader,减少透明混合

    2024年01月18日
    浏览(31)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包