问题标签 [raymarching]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
139 浏览

algorithm - 整合多个光线追踪样本

假设我正在使用 raymarching 来渲染场函数。(这在 CPU 上,而不是 GPU 上。)我有一个像这样粗略编写的伪代码的算法:

逻辑真的很简单……但它是如何integrate()工作的?

每个样本实际上代表我所在领域的一个体积,而不是一个点,即使样本是在一个点上采集的;因此,对最终像素颜色的影响将根据体积的大小而有所不同。

我不知道该怎么做。我环顾四周,但是虽然我发现了很多代码(通常在 Shadertoy 上),但它们的作用都不同,我找不到任何解释原因。这是如何工作的,更重要的是,哪些神奇的搜索词可以让我在 Google 上查找它?

0 投票
1 回答
2362 浏览

opencl - OpenCL Kernel 执行时间过长导致崩溃

我目前正在构建一个光线行军来查看诸如曼德尔盒之类的东西。它工作得很好。但是,在我当前的程序中,它使用每个工人作为从眼睛投射的光线。这意味着每个工作人员都有大量的执行。因此,当查看一个非常复杂的对象或尝试以足够大的精度进行渲染时,它会导致我的显示驱动程序崩溃,因为内核在单个工作人员上执行的时间太长。我试图避免更改我的注册表值以延长超时时间,因为我希望此应用程序可以在多台计算机上运行。

有没有办法解决这个问题?就目前而言,每个工作项的执行完全独立于附近的工作项。我已经考虑为 GPU 订阅一个缓冲区,该缓冲区将存储该射线上的当前进度并且只执行少量迭代。然后,我会一遍又一遍地调用该程序,结果有望进一步完善。这个问题是我不确定如何处理分支光线(例如反射和折射),除非我有一个最大数量的每个预期。

有人对我应该做些什么来解决这个问题有任何指示吗?我是 OpenCL 的新手,这个问题已经有一段时间了。我觉得好像我做错了什么或滥用 OpenCL 主要是因为我的单个工作项背后有很多逻辑,但我不知道如何拆分任务,因为它只是一系列步骤、检查和调整。

0 投票
1 回答
912 浏览

three.js - 体积渲染从一个方向比另一个方向更透明

我正在尝试使用three.js 和光线行进GLSL 进行体积渲染。我有一些从 numpy 数组合成的数据。

正在渲染的数据立方体在一侧更加不透明,在另一侧逐渐变得透明 - 就像这样(忽略线框,这只是为了一点方向) 在此处输入图像描述

但是,当您从更透明的一端看立方体时,透明度似乎会“阻挡”不太透明的一端(希望这是有道理的)。像这样: 在此处输入图像描述

我不知道这是否相关,但我也有一个问题,当相机稍微在立方体内部时,它会停止正确渲染。它会切断离相机最近的位,如下所示: 在此处输入图像描述 这是一个相关问题,还是只是方法的限制。

代码在这里 https://github.com/niallrobinson/test-volume-rendering/blob/master/viewer.html https://github.com/niallrobinson/test-volume-rendering/blob/master/viewer.js https ://github.com/niallrobinson/test-volume-rendering/blob/master/viewer.html

第二遍着色器看起来像这样:

提前谢谢大家

编辑:经过一些实验,问题似乎是只渲染了立方体的外部。如果我将一团数据放在多维数据集的中间,你什么也看不到。

编辑:事实上,它在前端表面上的唯一渲染数据。如果我反转光线行进方向(即更改为朝向相机),您只能在背面查看它

0 投票
0 回答
518 浏览

algorithm - 使用 Revelles 算法以动态统一的方式遍历八叉树 GLSL

我正在尝试使用带有实时光线行进的 revelles 算法在 GLSL(v450)中的计算着色器中遍历我的八叉树。我设法遍历它并获得了图像,但我的 fps 非常低,大约 0-5 fps。由于算法伪代码是递归的,因此我使用堆栈将其转换为循环(因为 GLSL 不允许递归)。问题是,一旦我使这个循环非动态统一,我就会得到大约 30-40 的巨大 fps 下降。

如果我在我的堆栈上使用shared属性,我可以得到这个 fps 备份,仅在全局变量的计算着色器中可用:

使其能够在我的工作组中的所有线程之间共享和使用。问题是我无法将这些与barrier()和/或memoryBarrierShared()函数同步,因为它们似乎需要循环动态统一(参见共享变量 www.opengl.org/wiki/Compute_Shader)。由于我无法同步,图像变得像素化并闪烁。

有没有办法将此算法转换为动态统一循环?当循环变得非动态均匀时,为什么fps会下降?

下面是我的主循环代码。

0 投票
2 回答
4657 浏览

geometry - GLSL立方体有符号距离场实现解释?

我一直在查看并试图理解以下代码

我知道length(d)处理 SDF 情况,其中点偏离“角落”(即所有组件d都是正的),并且max(d.x, d.y, d.z)在所有其他情况下为我们提供了适当的距离。我不明白的是如何在不使用 if 语句检查d's 组件的符号的情况下将这两者结合在这里。

当所有d分量都为正时,返回表达式可以简化为,length(d)因为min/max评估方式 - 当所有d分量都为负时,我们得到max(d.x, d.y, d.z). 但是我应该如何理解中间情况呢?的成分d有混合迹象的那些?

我一直试图绘制它无济于事。如果有人能用几何/数学术语向我解释这一点,我将不胜感激。谢谢。

0 投票
0 回答
175 浏览

glsl - 如何防止rotationg glsl raymarching表面上的伪影

我正在学习 GLSL 中的 raymarching,并从http://www.iquilezles.org/www/articles/distfunctions/distfunctions.htm和 ShaderToy 网站上的各种着色器中获得了基本的了解。

我创建了一个着色器,我在其中使用圆环的有符号距离函数,然后重复形状、应用旋转并移动相机(请参阅https://www.shadertoy.com/view/MdlcD7

我的问题是,在对环面应用旋转后,表面上会产生人工制品。如果我删除旋转(注释掉着色器的第 30 行和第 31 行),那么伪影将不再出现。类似地,如果我在 raymarching 中引入一个轻微的后退因子(通过取消注释第 4 行的一部分),那么伪影就会被移除。但是,如果我改变这个后退因子的值,那么人工制品就会返回。

我的问题是:

1)导致伪影的旋转是什么?

2)如果后退是正确的方法,那么我如何确定一个可靠的因素来应用,它适用于我应用于 sdTorus 函数的任何值?

3) 如果我从使用 sdTorus 更改为使用 sdBox 函数(取消注释第 32 行),那么这将如何改变我对前两个问题的答案(如果有的话)?

提前谢谢了

0 投票
1 回答
291 浏览

three.js - 有什么问题 - 或如何找到正确的 THREE.PerspectiveCamera 设置

我有一个简单的 THREE.Scene,其中主要内容是一个 THREE.Line 网格,它可视化相机将遵循的一些脚本动画的基于关键帧的路径。然后有一个基于 THREE.SphereGeometry 的网格,始终重新定位到当前相机位置。

当前错误的结果看起来像这样(分形背景是独立渲染的,但使用相同的关键帧输入 - 最终的想法是“相机路径”可视化最终以与相应分形背景相同的比例/投影结束......) : 可视化相机路径

base 是一个关键帧数组,每个关键帧代表特定相机位置/方向的模型视图矩阵,并直接用于驱动背景的顶点着色器,例如:

(据我了解,“eye”基本上是相机位置,而“dir”反映了相机的方向,并且在光线行进期间使用它的方式隐含地导致透视投影)

相应的网格对象是这样创建的:

为了播放动画,我像这样更新相机和标记位置(我想我如何直接在“shadowCamera”上使用输入矩阵“m”已经是错误的 - 尽管我认为它包含正确的位置):

我已经尝试了有关相机的多种方法,并且屏幕截图反映了禁用“this.projectionMatrix”的输出(请参见下面的代码)。

我最初的尝试是使用与分形背景的 opengl 着色器相同的设置(参见上面的 glFrustum)。不幸的是,我似乎还没有成功地将输入“modelViewMatrix”(以及由着色器中的光线行进隐式执行的投影)映射到等效的 THREE.PerspectiveCamera 设置(方向/投影矩阵)。

这里有没有矩阵计算专家,知道如何获得正确的变换?

0 投票
0 回答
912 浏览

opengl - GLSL 中简单、最基本的 SSR

我正在尝试在 GLSL 中实现“尽可能简单”的 SSR。有人可以帮我设置一个非常基本的ssr代码吗?

我不需要(目前)任何粗糙度/金属度计算,没有菲涅尔,没有淡入淡出效果,没有什么花哨的——我只想要最简单的设置,我可以理解、学习并可能在以后改进。

我有 4 个源纹理:颜色、位置、法线和上一个最终帧图像的副本(反射)

attributes.position是位置纹理 (FLOAT16F) - WorldSpace

attributes.normal是法线纹理 (FLOAT16F) - WorldSpace

sys_CameraPosition是眼睛在WorldSpace中的位置

rd应该是WorldSpace中的反射方向

texture(SOURCE_2, projectionCoord.xy)是当前反射目录端点的位置纹理

这甚至可能,使用世界空间坐标吗?当我将第一遍的输出与 viewMatrix 以及 modelMatrix 相乘时,我的光照计算就会上升,因为它们也在 worldSpace 中......

不幸的是,互联网上没有基本的 SSR 教程,只解释了 SSR 位而没有其他内容,所以我想我会在这里试一试,我似乎真的无法理解这个......

0 投票
1 回答
360 浏览

bigdata - 用于 TB 级数据的大规模体绘制和可视化库

我想可视化跨越几 GB 到几 TB 的 3D 数据量。一种解决方案是自己动手,但这可能需要一些时间。为避免这种情况,我目前正在探索当前可用的解决方案。我研究得越多,我发现的软件就越多。一些例子包括ParaView/VTK, OSPRay, Embree, Splotch,NVIDIA GVDB/OptiX等。

其中一些软件为可视化和数据操作提供了完整的解决方案(例如,ParaView/VTK)。其他人主要关注高性能渲染(例如,Embree)。其他人提供用于渲染的低级 API(例如,GVDB/OptiX)。有些针对特定硬件进行了优化(例如,Embree针对 Intel 硬件、GVDB/Optix针对 NVIDIA GPU)。其他包括分布式渲染的基础设施(例如,ParaView/VTK) 这允许他们声称他们可以渲染数 TB 大小的数据集,而其他人则将此功能留给用户。可以说,使用一些巧妙的 LOD 和核外算法,也可以在单台机器上执行数 TB 大小的数据集体积渲染,但让我们将这个留待另一个讨论。最后,还有大量来自大学研究项目和学术界的软件,这些软件旨在解决特定问题,并且不再维护。

我想知道这里是否有人对此类软件有经验,并且可以就哪些软件/库值得试验给我一些指示或建议。我的理想要求如下:

  • 以交互式帧速率(假设 > 10 FPS)对高达几 TB 的数据集执行体积渲染/光线行进。
  • 利用不同的并行架构(CPU、GPU、多节点)
  • 实施/支持详细程度算法。
  • 能够在渲染场景中添加小部件。例如,轴箭头、剪切平面等。
  • 采用提供公共 API 以供使用的库的形式。理想情况下在 Python 中,但我想自己围绕 C/C++ API 制作 Python 包装器是非常可行的。
  • 它们得到积极维护并具有适当的文档。

我不一定要寻找包含以上所有内容的软件库,但是,越多越好!:)

先感谢您。

0 投票
0 回答
115 浏览

c - 计算光线行进矢量时消除鱼眼失真

我正在尝试为 raymarching 编写一个 opencl 内核。一切正常,除了生成的图像中有明显的鱼眼失真,如本例所示:(这应该是一个立方体)

问题在于我为每条射线构造方向向量的方式。

目前,我将相机的方向作为俯仰和偏航(在我的代码中)给pitch内核yaw

然后基于 fov ( fov)、内核正在计算的像素坐标 (ixiy) 以及整个帧的宽度和高度 ( width, height),我得到了光线方向的俯仰和偏航。

最后,我使用前面计算给出的俯仰和偏航构造一个单位向量。

varfloat表示浮点或双精度取决于内核是以双精度还是单浮点精度运行)

对于上图,fovPi/3 和widthheight都是 500。

有人能告诉我应该如何计算方向矢量的俯仰和偏航以消除失真吗?