首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >射线追踪工程中的奇异球反射效应。我不知道是什么原因造成的

射线追踪工程中的奇异球反射效应。我不知道是什么原因造成的
EN

Computer Graphics用户
提问于 2019-08-10 15:35:28
回答 1查看 369关注 0票数 2

我用Python启动了一个射线跟踪项目。我为每个像素创建了一个CUDA内核和一个trace()函数。它在计算交叉口、阴影和兰伯特阴影时工作得很好,但是当我从球体表面引入反射时,我会在投影球面盘的边缘得到一个“带”,而我不知道为什么。

图像结果:https://imgur.com/a/LoXOyl5

My反射算法:

  1. 找到交叉口的P点。
  2. 在交点处求法向量N,C是球心:
代码语言:javascript
复制
    N = P - C
    N = N / norm(N)
  1. 使用(其中D是原始射线方向)找到反射向量R:
代码语言:javascript
复制
    R = D - 2 * (D * N ) * N
    R = R / norm(R)
  1. 沿着R移动点P有一点(为了避免反射痤疮,这并没有解决问题)
代码语言:javascript
复制
    P = P + 1e-4 * R
  1. 再次调用射线跟踪函数(只再调用一次)如下:
代码语言:javascript
复制
    color_refl = trace(ray_origin=P, ray_direction=R) 
  1. 使用以下方法添加反射颜色:
代码语言:javascript
复制
    color = color + color_refl * reflect_intensity

备注:

  • 在第二步和第三步之间,我计算兰伯特阴影,这是相当好的工作。
  • 从飞机上反射出来的反射效果很好。
  • 我使用了一个CUDA内核,它不支持递归函数调用,因此我使用了另一个不计算反射的名称不同的跟踪函数。(这就是为什么只有一个反射呼叫)

下面是跟踪和反射跟踪函数的源代码:https://github.com/Speterius/ray_追踪/blob/主/库达_射线_tracing.py

EN

回答 1

Computer Graphics用户

发布于 2019-08-10 16:48:01

这一问题是由于对反射方向矢量的不正确计算造成的。对于D射线方向和N的法向量:

代码语言:javascript
复制
R = D - 2 * dot(D, N) * N

造成这一问题的原因是计算R的组成部分如下:

代码语言:javascript
复制
R[i] = D[i] - 2 * (D[i] * N[i]) * N[i]

我花了一段时间才发现这个错误,因为这对水平面产生了正确的反射。

票数 4
EN
页面原文内容由Computer Graphics提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://computergraphics.stackexchange.com/questions/9063

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档