问题标签 [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 投票
0 回答
100 浏览

android - 在 SparkSL 着色器中获取片段的世界位置

我正在尝试在 Spark AR 中创建一个 raymarcher,它需要屏幕上每个像素的相机位置和光线方向。现在,我正在尝试通过从世界位置中减去相机位置并对其进行标准化来获取方向,就像这样。

问题是,因为 SparkSL 将它的片段和顶点着色器捆绑到同一个函数中,它似乎做了某种坐标插值?(至少这是我的一位更精通着色器的朋友所建议的)。我对 SparkSL 的了解还不够,无法弄清楚如何撤消此插值,并且在线资源也不多,有人知道我应该在这里做什么吗?

这是它目前的样子。

请注意渲染类型是如何围绕我要投影到的立方体内部的。

0 投票
0 回答
311 浏览

webgl - 为什么 Unity 的 WebGL 构建不允许我的着色器使用条件开关来渲染光线行进对象

我一直在尝试制作一个着色器,它可以让光线行进在没有重型显卡的设备上发生。我正在使用 unity3d,但在一个问题上停留了大约 2 周。

我现在拥有的着色器非常简单,并且可以在不同平台上提供良好的 fps。它甚至在 WebGL 中运行得非常快(这一直是一场噩梦),但最后一个难题是允许用户选择不同的光线行进形状。

我一辈子都想不通为什么,第 94 行的简单开关在 WebGL 中不起作用。

我试过了:

  1. 将其重写为 if/else 语句
  2. 三元运算符
  3. 试图通过线性逻辑运算符确定正确的符号距离
  4. 基于比较的数学,以避免与条件分支。

我现在很想使用诸如 step 或 lerp 之类的函数的数学版本,但它们的实现有时也涉及似乎分支着色器的条件或逻辑运算符。WebGL 只是忽略我尝试的所有内容,它只会在 Web 控制台中打印(错误:制服太多)。

就好像它总是知道我在做什么(◕︵◕)

我也在尝试安装其他 Webgl 调试控制台,例如 spector.js,但我没有从中找到任何重要的线索。

我是着色器编程的新手,所以真的不知道调试它的最佳方法,并且想知道社区中是否有人知道出路。

} 吨

0 投票
0 回答
28 浏览

glsl - 在 Raymarching 中,当您可以只拥有与对象关联的材质时,为什么会有对象 ID 并通过该 ID 确定对象的材质?

所以当你用射线击中一个物体时,你为什么要抓住一个物体的 id 并用那个 id 确定它的材料,而你可以直接抓住一个材料而不是(这也更快)?

我能看到的唯一原因是,如果一个对象的东西比材料多,但在这种情况下,我还是宁愿传递那一堆而不是对象ID。

0 投票
0 回答
28 浏览

opengl - OpenGL眼睛位置到纹理空间


我正在按照nVidia 的本教程来实现流体模拟,但是我对光线行进算法部分中的这一部分感到困惑。

光线方向由从眼睛到入口点的向量给出(都在纹理空间中)。

我已经有了光线入口点的坐标,所以这不是问题,但我不明白如何在纹理空间中获得眼睛位置。

0 投票
0 回答
200 浏览

opengl - 如何使用模型视图投影矩阵计算光线行进的光线原点和方向?

我正在尝试在 GLSL 片段着色器中渲染 raymarched 场景。我能够在不使用 MVP 矩阵时成功绘制场景,而只是从指定的摄像机位置沿用固定视图渲染的方向场景行进光线,但是当我尝试更改代码以使用模型视图投影矩阵时(到请允许我使用合适的相机在场景中移动)我只是得到一个黑屏。我正在按照使用模型的说明,从这里查看带有光线行进的投影矩阵

不使用模型视图投影时我的顶点着色器

不使用模型视图投影时我的片段着色器

但是,当我尝试使用模型视图投影矩阵来转换场景时,我得到的只是一个空白屏幕。

这是我将矩阵传递给着色器的方法:

我的模型视图投影矩阵顶点着色器

这是更新的片段着色器

这是最终结果我到底做错了什么?如何使用模型视图投影矩阵计算光线行进的光线原点和方向?

0 投票
1 回答
48 浏览

unity3d - 有符号距离函数的正常估计是行不通的

我正在尝试在 Unity 中创建一个执行 raymarching 的计算着色器。到目前为止,我有一个盒子的 SDF 和一个射线生成/行进功能,所有这些似乎都可以正常工作:

上面的代码生成如下图像:

成功渲染立方体

下一步是添加一些照明。为此,我需要一个表面法线函数,我将其定义为:

现在,为了检查正常功能是否正常工作,我决定在盒子上绘制每个接触点的法线(通过替换colour = float4(ray.position, 0.0f);colour = float4(normal(ray.position), 0.0f)。我期望立方体的 6 个面中的 3 个被着色为红色、绿色和蓝色(即顶面应该是绿色,因为它的法线为 (0, 1, 0))。但是,我得到的是一个完全黑色的立方体: 破碎的立方体

这似乎是错误的。应该意味着如果生成的normalize()法线不为零,则至少有一些颜色,这向我表明所有点的法线只是(0、0、0)。但这不可能是正确的,因为立方体内部或立方体上的任何地方都没有表面法线为 0(中心点除外)。

我现在尝试了 4 种不同的正常评估函数,我在网上找到了这些函数,但没有一个有效。在这一点上,我严重质疑我的理智。

0 投票
1 回答
100 浏览

typescript - 如何在我的 3d raymarched 世界中正确平移/旋转我的相机

我想要达到的目标

所以我是一个分形爱好者,并决定使用 raymarching 在 WebGL 中构建一个 2D/3D 分形生成器,使用 Typescript 作为脚本语言。我多年来一直是 C#/Typescript 开发人员,但对 3D 编程的经验为零,我使用 Michael Walczyk 的博客作为起点。我在这里使用的一些代码来自他的教程。

我添加了可以使用 WASDQEZC 键在对象中移动的功能。WS = 前后扫射,AD = 左右扫射,QE = 上下扫射,ZC = 左右滚动。我将它与鼠标外观功能结合起来,该功能在鼠标指针位于渲染画布上的方向上移动。所以我想要的是完全自由的移动,就像在太空模拟中一样。为此,我使用了一个单独的相机旋转矩阵和平移值,并将它们发送到着色器,如下所示:

我尝试将相机平移值添加到相机矩阵,但没有奏效。我得到了奇怪的失真效果并且无法正确处理,因此我将那条线注释掉并暂时将其留在那里以便清楚起见。我这样做的原因是因为我的 GLSL 代码的构造方式:

来自片段着色器的主函数与对 ray_march 函数的调用。v_position是一个 vec2,x,y 坐标来自顶点着色器。:

我正在使用的 ray_march 函数。这源自 Michael Walczyk 博客中的示例代码。

我正在使用的 rayDirection 函数。

我的问题

我在 3d 世界中正确移动和旋转相机时遇到问题。我通过应用一些三角函数来使运动正确来做到这一点。例如,当我向前移动时,就是 Z 轴。但是当我向右转 90 度时,X 轴现在变成了 Z 轴。我正在使用三角函数来纠正这个问题,实际上得到了一些工作,但现在我陷入了三角函数的泥潭,看不到尽头,我觉得必须有一种更好、更简单的方法。看看我在说什么,这里是'move'函数的代码:

它实际上在某种程度上有效,但你可以看到这是怎么回事:(另外,当我沿着 Y 轴上下查看时,我得到一个“死区”。我发现这个线程似乎描述了我的问题并说“诀窍是将平移应用到 z 轴,但在相机的局部坐标系中。”

但是我如何用我现有的代码做到这一点?我尝试将世界矩阵乘以u_world旋转矩阵,u_rotationMatrix但随后照明也会发生变化,它只是对象旋转而不是单独的相机旋转。在我发布的线程中,没有照明,因此将相机矩阵与世界矩阵相乘对他们有用。但它不适合我,因为我实施了照明。此外,我似乎无法以这种方式单独应用法线,因此我只将法线应用到世界矩阵而不是相机旋转矩阵,这样当我旋转/平移相机时,照明就会保持在原位。

我可以获得世界矩阵和单独相机矩阵的正确法线的唯一方法是将rotationMatrix与rayDirection相乘,如下所示u_cameraRotation * vec4(rayDirection(u_foV,v_position),1)。但是当我这样做时,我必须应用所有这些可怕的、部分工作的三角函数来得到一些像样的东西。我想要的是让它像“诀窍是将平移应用到 z 轴但在相机的局部坐标系中”一样工作。

但我不知道怎么做。我尝试了各种各样的事情,但我目前陷入困境。任何帮助将不胜感激。我想我已经足够充分地概述了我的问题,如果您遗漏了什么,请告诉我。提前致谢。

0 投票
1 回答
54 浏览

glsl - 光线行进时的 GLSL 伪影

在下面的着色玩具中,我说明了光线行进时出现的伪影

https://www.shadertoy.com/view/stdGDl

这是我的“场景”(见下面的代码片段)。它渲染一个原始的“tunnel_fragment”,它是一个 SDF(有符号距离函数),并使用坐标上的模来计算这些片段的“无限”重复。然后它还会计算我们在哪个磁盘(奇数/偶数)来替换它们。

我真的不明白为什么当磁盘(或环->请参阅隧道片段,如果您删除评论它们成为环而不是磁盘)在 x 方向的交替移动变大时呈现这些伪影时会出现这些伪影。

这些伪影在圆盘结构整体向右移动时不会出现,仅在圆盘交替且整个结构变得更复杂时才会出现。

我究竟做错了什么?这真的让我难以置信。

0 投票
1 回答
23 浏览

glsl - 我的原始图元无法在 Raymarching 中显示

我在学习Raymarching时遇到了一个很奇怪的问题。我的方程不能很好地显示。在matlab中可以很好的显示出来。但它根本无法在 Shadertoy 上显示。

我的方程式:</p>

matlab中的代码:

matlab显示正常图片

shadertoy中的代码:</p>

我学习、练习和修改了 iq 代码。(https://www.shadertoy.com/view/Xds3zN)。

但是不能正常显示。 Shadertoy显示异常图片 Shadertoy显示异常图片

我不知道问题出在哪里。请帮我。困扰我很久了。

原谅我糟糕的英语。我用谷歌翻译。

0 投票
2 回答
81 浏览

algorithm - 如何让最近的轴对齐边界框到一个点?

我有一大堆 Axis-Aligned Bounding Boxes,我试图获得从一个点到最近一个点的欧几里得距离,我尝试过曼哈顿距离,但它似乎与迭代的“蛮力”结果不匹配用欧几里得距离覆盖所有这些。有什么有效的方法吗?干杯