标签: raytracing

这个平面射线相交代码正确吗?

我的 Plane 类有两个字段:

public Vector3 Norm; //normal vector 
public double Offset; //signed distance to origin
Run Code Online (Sandbox Code Playgroud)

这是我用于交集的代码,不知道是否正确。我仔细检查了我的方程和所有内容,但我想从对此更有经验的人那里得到反馈。

public override Intersection Intersect(Ray ray)
{
    // Create Intersection.
    Intersection result = new Intersection();

    // Find t.
    double t = - (Vector3.Dot(Norm,ray.Start) + Offset) / (Vector3.Dot(Norm, ray.Dir));
    if (t < 0) // the ray does not hit the surface, that is, the surface is "behind" the ray
        return null;

    // Get a point on the plane.
    Vector3 p = ray.Start + t * ray.Dir; …
Run Code Online (Sandbox Code Playgroud)

raytracing game-physics

5
推荐指数
1
解决办法
1万
查看次数

如何解决相机沿X轴旋转的问题?

我有一个 Opengl 光线追踪器,它能够加载 obj 文件并以光线追踪方式将其可视化。我的应用程序使用 assimp 加载 obj 文件,然后使用着色器存储缓冲区将所有三角形面(包括顶点及其索引)发送到片段着色器。之后,片段着色器通过跟踪光线路径来计算像素的颜色。光线来自相机 ( posCamera) 的位置并穿过虚拟画布的像素。基本结构是将结果渲染到这个四边形画布上。

目前,我正在研究相机。相机始终注视0,0,0点 ( viewPoint),并且可以通过以下函数绕 y 轴旋转:

void setCamera(float param) {
    connect = posCamera - viewPoint;

    posCamera = glm::vec3(connect.x * cos(param) + connect.z * sin(param), connect.y,
                          -connect.x * sin(param) + connect.z * cos(param)) + viewPoint;

    canvasX = cross(upVector, connect) * getLength(connect) * tanf(fieldOfview / 2);
    canvasY = cross(connect, canvasX) * getLength(connect) * tanf(fieldOfview / 2);

    setCam(posCamera,viewPoint, canvasY, fieldOfview);
Run Code Online (Sandbox Code Playgroud)

我只想围绕 x 轴旋转场景。为了解决这个问题,我创建了一个新函数:

void rotateAroundX(float param) {
    connect …
Run Code Online (Sandbox Code Playgroud)

c++ opengl raytracing glsl glm-math

5
推荐指数
1
解决办法
468
查看次数

为什么我们应该区分光线追踪和光栅化的概念?

据我了解,现代电脑显示器主要以光栅方式显示图像,即我们在屏幕上看到的都是点或像素。让我困惑的是,我们常说光线追踪不是光栅化,但无论3D世界如何计算,计算机中渲染的所有内容最终不应该转换为在屏幕上形成光栅图像的像素吗?或者是我误解了一些关键概念。

graphics raytracing

5
推荐指数
1
解决办法
3679
查看次数

你如何计算发病角度?

我正在研究一个大型项目的光线跟踪器,目标是生成逼真的渲染而不用担心CPU时间.基本上是预渲染,所以我要求准确度超过速度.

我在围绕事物的照明方面正在进行的一些更高级的数学运算时遇到了一些麻烦.基本上,我对我的光有所了解.假设没有距离衰减,我应该可以使用我找到的多边形上的点,并将该点处的法线与光线上的入射角进行比较,以计算出我的照明值.因此,给定一个平面上的点,该平面的法线和点光源,我将如何计算出该角度?

我问的原因是我似乎找不到任何关于找到入射角的参考.我可以找到很多参考资料,详细说明一旦你得到了该怎么做,但没有任何东西告诉我如何获得它.我想这很简单,但我不能把它弄清楚.

谢谢

math raytracing

4
推荐指数
1
解决办法
6738
查看次数

测试线段是否与球体相交

我试图确定线段(即两点之间)是否与球体相交.我对交点的位置不感兴趣,只是该段是否与球体表面相交.有没有人对这个最有效的算法是什么有任何建议?(我想知道是否有任何算法比通常的射线球交叉算法更简单,因为我对交叉位置不感兴趣)

algorithm raytracing intersection

4
推荐指数
2
解决办法
1万
查看次数

在编写openCL代码时,它如何在没有GPU的单核机器上执行?

嘿所有,我目前正在将FORTRAN 77的光线跟踪器移植到C进行研究项目.

移植完要素后,问题是我们如何进行并行化.
在实验室中,我可以访问几个不同的Opteron机器,有2到8个内核,但没有GPU(目前).我们正在运行64b gentoo.

GPGPU版本(非常)是可取的,但项目中只有一个程序员,维护单独的非GPU和GPU版本不是一种选择.
此外,代码将是GPL,并且我们希望看到它被其他可能具有完全不同硬件的人使用.

因此,整个程序必须易于编译/运行,而无需GPU或甚至多核系统.
OpenCl似乎是一个不错的选择,因为它可以在没有GPU的机器上运行,但是这个代码将如何在单核或32b系统上运行?
是否有可能以这样的方式编写代码,以便在没有openCL的情况下轻松编译代码?

c parallel-processing raytracing opencl

4
推荐指数
1
解决办法
1057
查看次数

如何在Ray Tracer中实现景深?

有人可以帮我解决Ray Tracer中的景深实现吗?

我正在使用一个简单的针孔相机模型,如下所示.我需要知道如何使用针孔相机模型生成DOF效果?(图片来自维基百科)

在此输入图像描述

我的基本光线追踪器工作正常.

我注意(0,0,0,1)的方向为(dx,dy,1.0f,0.0f)其中

float dx =(x*(1.0/Imgwidth)) - 0.5;
float dy =(y*(1.0/Imgheight)) - 0.5;

现在我读到的所有地方都在讨论对应放置在图像平面和场景之间的镜头进行采样.例如如下所示(图片取自维基百科):

如果光线来自一个单点位置(相机或眼睛),如何在图像平面前引入镜头?

如果有人可以帮助,那就太好了!

谢谢

c++ raytracing depth

4
推荐指数
1
解决办法
1万
查看次数

软阴影:球面光源

我正试图在我的光线跟踪器中实现柔和阴影.为此,我计划从交叉点向区域光源拍摄多条阴影光线.我的目标是使用球面区域光 - 这意味着我需要在球体上为我的光线的方向矢量生成随机点(回想一下,光线是用原点和方向指定的).

我四处寻找在球体上生成随机点均匀分布的方法,但它们看起来比我正在寻找的要复杂一些.有谁知道在球体上生成这些点的任何方法?我相信我的球面光源将简单地由其XYZ世界坐标,RGB颜色值和r半径定义.

谢谢,我感谢你的帮助!

c++ graphics geometry raytracing

4
推荐指数
1
解决办法
1549
查看次数

光线跟踪是否会产生衍射/干涉/色散效应?

据我了解,计算机图形中使用的光线跟踪是"几何光学",并没有考虑波浪现象.

有没有办法以有效的方式包含它,或者是否有将这些概念伪装成光线跟踪算法的已知技巧?我的直觉答案是否定的; 波光学模拟对于计算机间隙目的而言还不够快.

微小更新:是否有计算机图形光线跟踪算法/实现可以模拟白光在棱镜上/通过棱镜分散?

graphics raytracing

4
推荐指数
1
解决办法
948
查看次数

禁止GLSL中的递归?

尝试编写以下递归调用时遇到此错误.我在GLSL中看到过很多关于递归Ray跟踪实现的演示,所以我假设GLSL支持递归.

这不是这种情况吗?

OpenGL返回编译时错误消息:

Error: Function trace(vec3, vec3, vec3, int) has static recursion
Run Code Online (Sandbox Code Playgroud)

这是我的函数定义:

vec3 trace(vec3 origin, vec3 direction, vec3 illum, int order) 
{       
   float dist;  
   int s_index = getSphereIntersect(origin, direction, dist);   
   //if light hit
   float light_dist = 200;
   for(int k = 0; k < L_COUNT;k++)      
       if(s_intersects(l_center[k], l_radius[k], 
             origin, direction, 
             light_dist)) 
             if(light_dist < dist )             
                 return l_color[k]; //light is pure color  

   if (s_index != -1)
   {
       illum = s_color[s_index];
       for(int j = 0; j < L_COUNT; j++)
       {
           float ambient = …
Run Code Online (Sandbox Code Playgroud)

c++ opengl raytracing glsl

4
推荐指数
1
解决办法
3231
查看次数