问题标签 [raycasting]

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 投票
2 回答
560 浏览

c - 将表示地图的文本文件解析为四叉树结构

我必须创建一个伪 wolfenstein 3D 作为学校的作业,并且我需要一个结构来表示地图。由于所有计算都将基于二维网格,我认为四叉树将是我所需要的。

您将如何解析包含此内容的文件,例如:

其中 1 是墙块,0 是空块,形成四叉树结构?

0 投票
1 回答
2137 浏览

raycasting - 如何获得球体的法线向量?

我必须实现简单的光线追踪算法,但我无法弄清楚如果我有球体的原点和半径以及光线的方向,如何获得球体的法线向量。感谢 Wiki aboute sphere,但我无法解决这个问题

0 投票
1 回答
20345 浏览

opengl - 使用光线投射算法进行体积渲染(使用 glsl)

我正在使用光线投射算法学习体积渲染。我在这里找到了一个很好的演示和教程。但问题是我有一个 ATI 显卡而不是 nVidia,这使我无法在演示中使用 cg 着色器,所以我想将 cg 着色器更改为 glsl 着色器。看过OpenGL的红皮书(7版),但是对glsl和cg不熟悉。有人可以帮我将演示中的 cg 着色器更改为 glsl 吗?或者是否有任何材料可以使用光线投射(当然在 glsl 中)进行最简单的体积渲染演示。 是演示的cg着色器。它可以在我朋友的 nVidia 显卡上运行。最让我困惑的是,我不知道如何将 cg 的入口部分翻译成 glsl,例如:

更重要的是,我可以编写一个程序将具有 2 个纹理单元的 2 个纹理对象绑定到着色器,前提是我在绘制屏幕时分配了两个 texcoord,例如

glMultiTexCoord2f(GL_TEXTURE0, 1.0, 0.0);

glMultiTexCoord2f(GL_TEXTURE1, 1.0, 0.0);

在演示中,程序将绑定到两个纹理(一个 2D 对应backface_buffer一个 3D volume texture),但只有一个纹理单元,glMultiTexCoord3f(GL_TEXTURE1, x, y, z);我认为该GL_TEXTURE1单元用于体积纹理,但哪一个(纹理单元)用于backface_buffer?据我所知,为了在着色器中绑定纹理 obj,我必须获得一个纹理单元来绑定,例如:

该程序编译良好并且链接正常。但我只得到了所有三个位置(texloc、volume_texloc 和stepsizeloc)中的-1。我知道它可能会被优化。任何人都可以帮我将 cg 着色器转换为 glsl 着色器吗?

编辑:如果您对使用 glsl 的现代 OpenGL API 实现(C++ 源代码)感兴趣:Volume_Rendering_Using_GLSL

0 投票
1 回答
1569 浏览

raytracing - Skewed:基于 CPU 的简单体素 raycaster/raytracer 中的旋转相机

我正在尝试编写一个简单的体素 raycaster 作为学习练习。现在这纯粹是基于 CPU 的,直到我弄清楚事情是如何工作的——现在,OpenGL 只是(ab)用于尽可能频繁地将生成的位图 blit 到屏幕上。

现在我已经到了透视投影相机可以在世界中移动的地步,我可以渲染(主要是减去一些需要调查的人工制品)透视正确的“世界”3维视图,它基本上是空的,但包含斯坦福兔子的体素立方体。

所以我有一个相机,我可以上下移动,左右扫视和“向前/向后走”——到目前为止所有轴对齐,没有相机旋转。这就是我的问题。

屏幕截图:(1) 射线投射体素同时... ...(2) 相机保持... ...(3) 严格轴对齐。

现在我已经有几天试图让轮换工作了。理论上,矩阵和 3D 旋转背后的基本逻辑和理论对我来说非常清楚。然而,当相机旋转时,我只实现了“2.5 渲染”......鱼眼,有点像谷歌街景:即使我有一个体积世界表示,看起来 - 无论我尝试什么 - 就像我将首先从“前视图”创建一个渲染,然后根据相机旋转旋转该平面渲染。不用说,我现在知道旋转光线不是特别必要且容易出错。

尽管如此,在我最近的设置中,使用最简化的光线投射光线位置和方向算法,我的旋转仍然会产生相同的鱼眼平面渲染旋转样式外观:

相机“向右旋转了 39 度” ——请注意屏幕 #2 中立方体的蓝色阴影左侧在此旋转中是如何不可见的,但现在“它确实应该”!

现在我当然知道了这一点:在一个简单的轴对齐无旋转设置中,就像我在开始时所做的那样,光线只是以小步长穿过正 z 方向,向左或向右和顶部发散或底部仅取决于像素位置和投影矩阵。当我“向右或向左旋转相机”时——即我围绕 Y 轴旋转它——这些步骤应该简单地通过适当的旋转矩阵进行转换,对吗?因此,对于向前遍历,Z 步越小,凸轮旋转得越多,偏移量为 X 步中的“增加”。然而,对于基于像素位置的水平+垂直发散,需要将 x 步的增加部分“添加”到 z 步。不知何故,我试验过的许多矩阵都没有,

这是我的基本每射线预遍历算法——Go 中的语法,但将其作为伪代码:

  • fxfy:像素位置 x 和 y
  • rayPos : vec3 表示世界空间中的光线起始位置(计算如下)
  • rayDir : vec3,用于在光线遍历期间的每个步骤中将 xyz 步骤添加到 rayPos
  • rayStep : 一个临时的 vec3
  • camPos : vec3 用于世界空间中的相机位置
  • camRad : vec3 用于以弧度为单位的相机旋转
  • pmat : 典型的透视投影矩阵

算法/伪代码:

我跳过了遍历和采样部分——根据屏幕 #1 到 #3,这些部分“基本上是正确的”(虽然不漂亮)——当轴对齐/未旋转时。

0 投票
1 回答
1375 浏览

ios - iOS GLSL 球面谐波着色器。如何使用 iOS GPU 进行光线投射

我正在为我正在编写的 iOS 应用程序开始一个 Spherical Harmonics 着色器项目。我首先阅读了这篇关于该主题的优秀深入论文 (PDF) - http://bit.ly/aQmax3

该论文描述了涉及光线投射的场景预处理步骤。有人可以描述如何在 iOS 上使用 GLSL 执行光线投射吗?

0 投票
1 回答
920 浏览

3d - 如何在光线行进中计算远处的视锥半径(即像素的大小)?

我是 GLSL 中的“光线追踪距离场”(正确的术语:球体追踪)。为了在它上面实现锥形行进(并且还要最小化光线行进步骤的数量,无论是否添加了锥形行进),我需要估计任何给定距离处的光线锥的半径。

回想一下 raymarching 距离场,当与对象的距离小于阈值时,会记录一次“命中”,通常使用名为 nearLimit 或 epsilon 的代码。如果我们将这个阈值随着行进的距离呈指数增加,这个阈值可以看作等同于射线锥半径——这样,我们不会将细直线射入太空,而是根据透视投影扩展锥体。这更准确地涵盖了捕捉“正确”的远处物体(此时让我们暂时忽略在距离 t 处的视锥中混合材质和过滤所有相交物体的法线的问题......)。

在第 0 步,这个半径可以近似为诸如

然后可以通过将起始半径应用于距离,在每一步以指数方式增加:

这工作正常,但仍然有工件。如果我使用 fInitialRadius*fInitialRadius(由于 640px 帧缓冲区和单位宽度视图平面的初始半径为 1/640 导致数字更小),我会得到更少的伪像和更准确的结果。但是这两种方法都不准确,第一种过于急切(过早地增加半径),后者过于懒惰(过早地增加半径)。

在给定距离处增加 fNearLimit / 圆锥半径的最准确因素必须很可能考虑到我当前的视野,并且会根据视野是 45° 或 60° 或 90° 还是...

TL; DR:我想知道给定距离的圆锥半径的正确计算或最可接受的近似值是什么?给定步骤 0 的初始像素半径和视场角?

0 投票
2 回答
292 浏览

opengl - 这是一个体积渲染结果,如何与其他 3D 对象交互

我已经在 CUDA 中使用光线投射实现了体积渲染。现在我需要在场景中添加其他 3D 对象(如我的情况下的 3D 地形),然后使其与体积渲染结果交互。例如,当我移动与地形重叠的体积渲染结果时,我希望对体积渲染结果进行调制,例如裁剪体积渲染结果中的重叠部分。

但是体积渲染的结果来自于光线累积的颜色,所以是没有深度的2D图片。那么如何实现交互让我很困惑。有人可以给我一个提示吗?

0 投票
0 回答
1830 浏览

opengl - 如何在 glsl 中切换着色器程序

我想使用可编程管道(使用 glsl)而不是固定管道进行体积渲染。我用 2 个着色器程序和 2 个通道来实现它,exitPointProg并且rayCastProg. 第一遍是获取立方体边界框的出口点(即背面),它将在下一次进行光线投射的过程中用作纹理。进行光线投射体积渲染的想法来自这里。我认为我已经做了大部分正确的事情,因为我已经使用固定管道和可编程管道实现了这一点。让我感到困惑的是,我在第一帧就达到了效果,并且随着闪光灯的闪烁,屏幕上的显示变成了全白(我设置了glClearColor(1.0f, 1.0f, 1.0f, 1.0f). 我认为着色器程序或 FBO 的切换可能存在一些问题。这是我在 render() 函数中所做的。

  1. 第一遍,使用着色器程序渲染到绑定了纹理的 fboexitPoints以获得立方体边界框的出口点exitPointProg
  2. 2ed pass,将exitPoints纹理(绑定到)作为统一的 sampler2D 变量映射GL_TEXTURE1到着色器程序中,该变量将在着色器中使用。rayCastProg这里是setupFBOandrender和两个子例程:setupFBO()函数:

    render()功能:

    getExitPoints()功能:

    rayCasting功能:

    我在 Qt 中使用从 QGLWidget 继承的类。正如我之前提到的,我只用第一帧就得到了正确的结果,然后它很快就消失了,变成了全白。不知道这是怎么回事,是shader程序的切换还是FBO的东西有问题?我一直在研究这个很长时间,但无法弄清楚,任何帮助将不胜感激!

编辑询问 是否有任何演示或教程演示如何将多个 glsl 着色器程序与 FBO 一起使用?

0 投票
1 回答
422 浏览

opengl - 在 CUDA 中,如何在内核函数中将屏幕空间坐标转换为世界空间坐标

在这里,我尝试将光线投射添加到真实的 3D 场景中。众所周知,在光线投射中,为了投射光线,我们需要获取光线的方向。射线中的第一个点是射线的起点,我可以从 glLookAt 获得。射线中的第二个点是屏幕中的每个点。在原始的CUDA ray-casting SDK中,它通过以下代码在Kernel Function中获取屏幕点:

(x,y) 是屏幕空间坐标吗?所以现在我需要将 (x, y) 翻译成世界空间坐标。一个好人告诉我使用 gluUnProject 来完成这项工作。好想法!但是我不能在 CUDA 内核中调用 OpenGL 函数。

也许我可以使用可逆矩阵进行翻译。但我不确定正确的方法。有没有人可以给我一个关于如何在 CUDA 内核函数中将屏幕坐标转换为世界坐标的提示?

0 投票
1 回答
1160 浏览

c++ - 是否可以在 pcl 中进行点向量重播?

我有一个 3d 点世界。我有指向它a [x,y,z]和方向(方位角θ和极角)我想得到b [x2,y2,z2]我的光线(从我的点发送a到方向)将停止的点。(仅从一点且仅针对一个方向)。如何在 pcl 中做这样的事情,是否有可能(我看到一个射线投射器类,但它似乎在整个世界上都有效,而不是点对点)?