标签: raytracing

询问有关快速光线跟踪算法的资源

首先,我很抱歉这个粗略的问题,但我不想介绍太多细节,所以我只是要求提供相关资源,如文章,图书馆提示.

我的程序需要对射线 - 三角形交叉点进行密集计算(有数百万个光线和三角形),我的目标是尽可能快地完成.

我所做的是:

  1. 使用我所知道的最快的ray-triangle算法.

  2. 使用八叉树(来自Game Programming Gem 1,4.10.4.11)

  3. 使用一种高效且稳健的Ray-Box交叉算法,该算法用于八叉树算法.

它比我应用那些更好的算法之前更快,但我相信它可能会更快,你能不能点亮任何可能使它更快的地方?

谢谢.

algorithm performance geometry raytracing

6
推荐指数
1
解决办法
1510
查看次数

如何混合颜色

我正在编写光线跟踪器.我想知道如何将原始颜色与浅色混合.我见过很多种组合.

有些只是添加两种颜色.这给了我很奇怪的结果.

每个组件都有些笨拙.它看起来不错,但在原语是蓝色({0,0,1})而灯是红色({1,0,0}),它只是黑色.这是正常行为吗?

我也看过屏幕混合模式(屏幕(C1,C2)= C1 + C2 - C1*C2))这对我来说更合乎逻辑,因为在上面的例子中,颜色实际上会混合.

反射光线颜色的相同问题:如何将它们与局部颜色混合?

额外的问题:如果一个基元上没有被照亮的点是黑色的吗?我见过像"一半的颜色"这样的东西.

raytracing

6
推荐指数
1
解决办法
3031
查看次数

蒙特卡罗路径追踪算法的这一部分的目的是什么?

在使用大量蒙特卡罗样本进行路径追踪的所有简单算法中,跟踪算法的路径部分随机选择返回当前表面的发射值并继续追踪来自该表面半球的另一条射线(例如,这里滑动 ).像这样:

TracePath(p, d) returns (r,g,b) [and calls itself recursively]:
    Trace ray (p, d) to find nearest intersection p’
    Select with probability (say) 50%:
        Emitted:
            return 2 * (Le_red, Le_green, Le_blue) // 2 = 1/(50%)
        Reflected: 
             generate ray in random direction d’
             return 2 * fr(d ->d’) * (n dot d’) * TracePath(p’, d’)
Run Code Online (Sandbox Code Playgroud)
  1. 这只是一种使用俄罗斯轮盘赌终止路径同时保持不偏不倚的方式吗?当然,将所有射线路​​径的发射和反射特性统计在一起并使用俄罗斯轮盘只是为了决定是否继续跟踪更有意义.

  2. 这是一个后续问题:为什么我所看到的这些算法中的一些(如"基于物理的渲染技术"一书)只计算一次发射,而不是考虑对象的所有发射属性?渲染方程基本上是

    L_o = L_e + integral of (light exiting other surfaces in to the hemisphere of this surface)

    这似乎计算了这个L_o和所有其他L_o的积分中的自发属性,所以算法应该遵循.

math 3d graphics raytracing

6
推荐指数
1
解决办法
2990
查看次数

将2D点反投影到3D Plucker线

我正在尝试构建一个跟踪器(手动跟踪个人项目),因此我需要使用Plucker坐标将2d点反投影到3d线.(如光线追踪)

作为输入,我有一个点的2d坐标和投影矩阵.

关于plucker坐标的网上信息概述了它们有用的原因,但是没有纸质分析地描述上述过程.(他们只是提到他们回到投影线,没有任何进一步的描述)

有人可以指出我正确的方向吗?

raytracing projection projective-geometry projection-matrix

6
推荐指数
1
解决办法
3459
查看次数

搅拌机:不可能的立方体

我正在研究一个试图在3D中创建一个不可能的立方体的图形项目.一个不可能的立方体看起来像:

在此输入图像描述

这背后的技巧是"切割"的两个边缘和从特定角度拍摄的图片,以给出不可能性的错觉. 在此输入图像描述

好吧,我试图制作这个但不是静态图像,我希望能够动画它(旋转)保持不可能的属性.

我已设法在搅拌机中制作一个立方体,如下面的屏幕截图所示: 在此输入图像描述

我想听听你们如何达到预期效果的建议.一个想法是使边缘部分(在其后面具有边缘(或更多))透明,以便每次摄像机角度改变时,透明贴片移动.

它不必专门在Blender中完成,因此欢迎任何OpenGL等解决方案.

为了让您了解最终结果应该是什么,这是这样一个插图的链接:

3D不可能立方体幻觉动画

c++ graphics transparency raytracing blender

6
推荐指数
1
解决办法
662
查看次数

Webgl:写入gl_FragDepth的替代方法

在WebGL中,是否可以写入片段的深度值或以其他方式控制片段的深度值?

据我所知,gl_FragDepth在webgl 1.x中不存在,但我想知道是否还有其他方法(扩展,浏览器特定支持等)来做到这一点.

我想要存档的是让光线跟踪对象与使用通常的模型,视图,投影绘制的其他元素一起播放.

raytracing glsl depth-buffer webgl fragment-shader

6
推荐指数
1
解决办法
2178
查看次数

Phong Shading的麻烦

我根据Phong模型写了一个着色器.我正在尝试实现这个等式:

在此输入图像描述

其中n是法线,l是光的方向,v是摄像机的方向,r是光反射.维基百科文章中更详细地描述了这些等式.

截至目前,我只测试定向光源,因此没有r ^ 2衰减.环境术语在以下功能之外添加,效果很好.如果点积为负,则函数maxDot3返回0,这通常在Phong模型中完成.

这是我的代码实现上面的等式:

#include "PhongMaterial.h"

PhongMaterial::PhongMaterial(const Vec3f &diffuseColor, const Vec3f &specularColor, 
                            float exponent,const Vec3f &transparentColor, 
                             const Vec3f &reflectiveColor,float indexOfRefraction){

            _diffuseColor = diffuseColor;
            _specularColor = specularColor;
            _exponent = exponent;
            _reflectiveColor = reflectiveColor;
            _transparentColor = transparentColor;


}

Vec3f PhongMaterial::Shade(const Ray &ray, const Hit &hit, 
                    const Vec3f &dirToLight, const Vec3f &lightColor) const{

        Vec3f n,l,v,r;
        float nl;

        l = dirToLight;
        n = hit.getNormal();
        v = -1.0*(hit.getIntersectionPoint() - ray.getOrigin());

        l.Normalize();
        n.Normalize();
        v.Normalize();

        nl = n.maxDot3(l);
        r = 2*nl*(n-l);
        r.Normalize();

        return …
Run Code Online (Sandbox Code Playgroud)

c++ graphics shader raytracing

6
推荐指数
1
解决办法
5612
查看次数

GLSL立方体签名距离字段实现说明?

我一直在寻找并试图理解下面的代码

float sdBox( vec3 p, vec3 b )
{
  vec3 d = abs(p) - b;
  return min(max(d.x,max(d.y,d.z)),0.0) +
         length(max(d,0.0));
}
Run Code Online (Sandbox Code Playgroud)

我理解length(d)处理SDF的情况,其中点离开'拐角'(即所有组件d都是正的)并且max(d.x, d.y, d.z)在所有其他情况下给我们适当的距离.我不明白的是,如果不使用if语句检查d组件的符号,这两者是如何组合在一起的.

当所有d组件都是正数时,返回表达式可以减少到length(d)因为min/max评估的方式- 当所有d组件都是负数时,我们得到max(d.x, d.y, d.z).但我怎么理解中间案件呢?那些组成部分d有混合迹象的那些?

我一直试图把它绘制成无济于事.如果有人能用几何/数学术语向我解释,我真的很感激.谢谢.

shader geometry raytracing glsl raymarching

6
推荐指数
2
解决办法
1851
查看次数

处理渐变折射率的光线追踪器?

我想找到一个利用梯度折射率的射线追踪/合成成像程序.我已经在线查看了许多光线跟踪器,但我还没有找到一个专门处理梯度指数的工具,以及常规材料.任何有关查找具有此功能的光线跟踪器的建议都将非常感谢!

gradient raytracing imaging synthetic

6
推荐指数
0
解决办法
135
查看次数

通过Compute Shader对屏幕Quad进行光线跟踪

我最近通过opengl教程寻找光线追踪.大多数教程都更喜欢计算着色器.我想知道他们为什么不渲染纹理,然后将纹理渲染为四边形.

计算着色器方法在屏幕四边形上的优缺点是什么?

opengl graphics raytracing compute-shader fragment-shader

6
推荐指数
1
解决办法
1718
查看次数