Articles of 光线跟踪

为什么在转换时逆转换射线?

我正在向我的光线追踪器添加3D仿射变换,并且似乎networking上的所有文献都建议逆变换射线而不是变换3D对象。 这是为什么? 在典型的光线追踪场景中,光线比物体多得多,所以转换物体本身效率会不会更高?

使用gluUnProject或倒转的MVPmatrix获得射线

我已经阅读了很多这里的主题,在SO,opengl.org等。示例gluUnProject应该如何工作(从NeHe教程): winX = (float)x; winY = (float)viewport[3] – (float)y; glReadPixels( x, int(winY), 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ ); gluUnProject( winX, winY, winZ, modelview, projection, viewport, &posX, &posY, &posZ); 问题是, gluUnProject返回大多为零,如果不是零,则返回世界坐标系中的摄像头位置。 价值winZ我从glReadPixels得到永远是正确的,如果我缩放如下: float z_distance = ProjectionMatrix[14] / (winZ * -2.0 + 1.0 – ProjectionMatrix[10]); 包含鼠标点击点的近平面和平面平面之间的距离。 看下面的示例: gluUnProject( winX, winY, -1, modelview, projection, viewport, &posX1, &posY1, &posZ1); […]

光线跟踪延迟渲染中的阴影

最近我编写了一个有趣的光线跟踪器,并发现与光栅器相比,如何创建阴影是非常简单的。 现在,我忍不住想,如果能够实现类似于延迟渲染器中的阴影光线追踪的类似的东西。 我可以这样做的方式是绘制到gbuffer后,在一个单独的通道,并为每个像素来计算光线的光线,并绘制成独特的颜色线与几何(颜色0)。 如果存在遮挡,这些线将被截断,并且这个事实可以在片段着色器中用来计算哪些光线被遮挡。 我猜一定有一些我想念的东西,例如我不知道片段着色器如何保存每条光线的遮挡结果,以便它们可用于光线原点的像素。 这个方法以前是否已经被使用过了,是否可以像我所描述的那样实现它,如果是的话,这样计算阴影的性能会有什么问题呢?

相交射线与挤出的2D形状(例如挤压文本)

我正在寻找一种方法来find光线和挤出的二维形状或文本(由贝塞尔曲线所定义)之间的交集。 有任何想法吗?

光标位置到使用角度的3D光线

我一直坚持一个月试图让gluUnProject工作。 在我尝试使用gluUnProject失败(以及尝试手动实现gluUnProjectfunction)后,我实现了使用角度获取ray的方法。 float RadToDeg = 180.0f / (float)M_PI; // conversion coefficient to degree float DegToRad = 1 / RadToDeg; // conversion coefficient to radians float DeltaX = tan(fovy/2 * DegToRad) * 2 * (Width / 2 – winX) * zNear / Height; float DeltaY = tan(fovy/2 * DegToRad) * 2 * (Height / 2 – […]

给OBB表面上的一个点,返回正常的脸

所以我有这个类OBB它实现了一个test函数,确定是否光线击中它。 如果是这样,一个结构被传递给一堆variables: struct HitData { float t; Color color; Shape* lastShape = nullptr; Vec lastNormal; } 最后一名成员Vec lastNormal; 应该从课堂上得到它的价值“ normal(Vec& point)function。 这里是我绘制一个完整的空白。 即我似乎找不到任何明显的(或不明显的)如何确定正常的解决scheme。 基本上我想要做的是确定6个飞机中的哪一个在哪个位置上。 理论上我可以蛮横的,只是对所有的飞机做一个交叉点testing,但这似乎不必要的昂贵。 OBB由一个中心,三个基本vector和它们的一半长度定义。 任何想法如何我可以解决这个问题?

DirectX着色器 – 如何传播光线追踪计算多帧?

我正在制作HLSL中的shadertoy样式的SDF光线追踪器,并使其在高分辨率(1080p及以上)下运行速度更快,我希望将计算分散在多个帧中。 现在我有一个片段着色器,可以为屏幕大小的四边形的每个像素进行光线跟踪。 我注意到,如果我丢弃( clip() )每个第二个像素的片段,我得到0帧率提高,尽管有效地只渲染一半的图像。 但是如果我将渲染纹理分辨率降低一半,那么显然我看到了改进。 另外,如果我剪辑片段的一个连续的一半 ,并渲染另一半,我得到了类似的性能提升。 这意味着gpu线程组默认在屏幕上以平铺方式分配,并且一个组中的所有线程必须在线程组的(其他)资源再次使用之前进行计算。 有谁知道任何可以强制片段着色器的魔术,只分配资源的屏幕像半个像素? (但保持渲染目标大小) 或者,我想我可以在计算着色器系统中分配我自己的线程组,我自己管理所有这些东西。 这是唯一的方法吗? 那么我将如何处理渲染目标呢? (知道任何资源?) 我也非常确定,在计算着色器之前,人们几年前就已经看到了这种粒状多帧光线追踪器。

如何使用天空的双向path追踪渲染室内

是否可以使用双向path追踪来渲染室内场景,其中光源是通过窗户进入的天窗(无太阳光)? 我想我大概知道这是怎么做的,如果光源是窗口矩形本身作为一个漫射源,但不能得到我的头如果它将工作,如果源是天窗和相机在一个房间里:这是需要采样的窗户形状还是天空穹顶? 光采样点是从整个天空穹顶中挑选出来的,还是只从窗口看到的? 谢谢。

光线追踪的概念:高效的数据结构和光子映射

我正在为特定的目标场景建立一个简单的光线追踪器。 下面是一个这样的场景的例子。 我担心在这种情况下加速数据结构是最有效的,因为所有的对象都是触摸的,但另一方面,场景是统一的。 我的射线跟踪器中的对象被存储为三角形的集合,因此我也可以访问各个三角形。 另外,当试图find现场的边界框时,应该怎样处理无限的平面呢? 应该使用视锥体来计算边界框吗? 我有一些其他的问题是关于光子映射。 我已经阅读了詹森的原始文件和更多的材料。 在他们介绍的光子的紧凑的数据结构中,他们将光子的能量存储为4个字符,据我所知,它是3个字符的颜色,1个字符的通量。 但我不明白1个字符是如何存储1 / n数量级的通量的,其中n是光子的数量(我对通量和功率也有点困惑)。 另一个关于光子映射的问题是,如果在我的情况下存储每个对象(甚至每个对象的三角形)的光子而不是使用平衡的kd-tree会更有效。 另外,关于场景的边界框但是用于光子映射的问题也是一样的。 当涉及无限的飞机时,应该如何从光的位置find一个边界框? 编辑:我想添加一个问题。 我在一些源代码中看到,使用俄罗斯轮盘赌,通过材料的扩散性来缩放光子的能量,并除以平均颜色。 它是否正确? 我认为俄罗斯轮盘赌的意义在于不必这样做,最终获得各种各样的小功率光子。

在运行时渲染光照贴图

我正在为Unity创建一个程序化的地形系统。 而且我正在寻找方法来高效地投射自己的阴影。 如果不是程序性的,我可以简单地用Beast来烘烤光照贴图。 但是,我不能因为在运行时创建地形网格。 可以做什么样的方法,我相信它已经完成了。 如果可能的话,我正在寻找一个适用于非专业版的解决scheme。 我在想,也许某种一次性的光线追踪方法可能是一个解决scheme。