光线追踪出了问题

Posted

技术标签:

【中文标题】光线追踪出了问题【英文标题】:Something with raytracing that has gone wrong 【发布时间】:2011-10-01 01:23:57 【问题描述】:

我正在尝试用 c#(从 python 移植)做一个简单的光线追踪分配。 我已经设法让示例代码显示正确的图片,但是当我尝试使其适应我的作业时出现问题。

如果我知道出了什么问题,我会发布一些我认为可能会有所帮助的代码,但我不知道从哪里开始。

基本上我的作业输出如下:

http://i56.tinypic.com/2vcdobq.png

开启镜面高光,并且

http://i53.tinypic.com/2e1r38o.png

关闭它。 它应该看起来像:

http://i56.tinypic.com/2m7sxlh.png

我的 Phong 光照公式如下所示:

Colour I = diffuse_colour;
Vector L = light.vector;
Vector N = normal; //FIXME!
Colour Is = diffuse_colour * light.intensity;
Colour Ia = new Colour(1,1,1) * light.ambient;
Colour Kd = specular_colour;
Colour Ka = Kd;
double Ks = sharpness ?? 0.4;
Vector H = Vector.unit(view + L);

//Phong Illumination
//I = KaIa + KdIs max(0,L.N) + KsIs (H.N)^n

I = Ka * Ia
+ Kd * Is * Math.Max(0, L.dot(N))
+ Ks * Is * Math.Pow(H.dot(N),200); //FIXME?

我从工作示例代码中复制了它,所以我知道它有效。

任何想法都会很棒,因为我很难过。

【问题讨论】:

【参考方案1】:

您有两个相同算法的实现。你声称它们产生了不同的结果。发现错误似乎很简单:同时在各自的调试器中逐步运行这两种算法。仔细观察这两个程序的状态。当它们产生不同的程序状态时,就会出现你的错误。

【讨论】:

【参考方案2】:

它并没有那么简单,因为一个实现是在 python 中,另一个是在 c# 中。 原来有两件事错了。

首先,在我的点类中,我的一个重载运算符是错误的。 (操作员 - 在 2 点上,我让它返回 Vector (p1.x - p2.x, p1.y - p2.y, p1.x - p2.x) ...最后一对应该是 p.z .

我犯的另一个错误是在保存位图图像时,我将 x 和 y 的列和行混淆了。 (列 = x,行 = y)

希望这可以帮助像我这样遇到随机问题的其他人:P

【讨论】:

【参考方案3】:

在编写光线追踪器时,我研究了这篇文章以更好地了解 Phong Illumination。 所以看看这里,我相信你会有一个想法:

www.gamedev.net/page/resources/_/technical/graphics-programming-and-theory/phong-illumination-explained-r667

【讨论】:

以上是关于光线追踪出了问题的主要内容,如果未能解决你的问题,请参考以下文章

3D渲染-光线追踪-包围盒

GAMES202 笔记-实时光线追踪

减少光线追踪时的计算

C中的光线追踪器,光线平面相交

实现光线追踪

光线追踪 - 反射