GLSL折射功能说明可用吗?

时间:2013-12-27 13:27:06

标签: math geometry glsl raytracing

我试图调试我的简单光线跟踪器,模拟来自穿过镜头的一个点的光线。我只需要折射效果。

我尝试手工完成,但最后我从GLSL中找到refract,这在GLSL 1.1中有记录,如下所示:

//For a given incident vector I, surface normal N and ratio of 
//indices of refraction, eta, refract returns the refraction vector, R. 
//R is calculated as:

k = 1.0 - eta * eta * (1.0 - dot(N, I) * dot(N, I));
if (k < 0.0)
    R = genType(0.0); // or genDType(0.0)
else
    R = eta * I - (eta * dot(N, I) + sqrt(k)) * N;

//The input parameters I and N should be normalized in order to 
//achieve the desired result.

我想知道这些方程式来自哪里。我搜索了互联网和我拥有的书籍(Real Time Rendering bible,或者是基于Phisically Based Rendering的最后编辑。)所有这些都是参考这个实现,没有解释,或只是告诉解决方案。

尝试从开始使用几何图形手动完成它会带给我其他答案,但显然只是像GLSL一样非常常见的功能。所以我更喜欢使用这种优化的符号。

我只有这个:

a.b = |a||b|cos(angle) (Dot product)
angleOut = eta * sin(angleIn) (Snell's Law).

你知道它来自哪里吗? 任何要阅读的文件或参考文献?

3 个答案:

答案 0 :(得分:7)

您可以在本书第16.5节找到解释:

FOLEY,James D.(编辑)。 计算机图形学:原理与实践,C语言第二版。 Addison-Wesley Professional,1996。

这些是相关页面,它们来自Google Books search(参见2013-12-29T10:15:00 + 01:00):

enter image description here enter image description here

参考[HECK84]是

HECKBERT, Paul S.; HANRAHAN, Pat. Beam tracing polygonal objects. In: ACM SIGGRAPH Computer Graphics. ACM, 1984. p. 119-127.

并有一个详细的附录标题&#34;反射和折射转换&#34;。

答案 1 :(得分:4)

smallpt的代码,即全局照明渲染器,具有折射功能的实现;在我看来,这个实现类似于你问题中的实现。 explained中的实施是presentation slides by David Cline;我在这里附上相关幻灯片:

enter image description here

根据Wikipedia,该公式在书中解释:

GLASSNER,Andrews(编辑)。 光线追踪介绍。摩根考夫曼,1989年。

在Glassner的书中,第7章的第5节(由Paul Heckbert编写)标题为“衍生折射公式”,该部分可在Heckbert's page获得;在那一节中,赫克伯特得出了这两篇论文中使用的公式:

WHITTED, Turner. An improved illumination model for shaded display. Comm. ACM, 1980, 23.6.

HECKBERT, Paul S.; HANRAHAN, Pat. Beam tracing polygonal objects. In: ACM SIGGRAPH Computer Graphics. ACM, 1984. p. 119-127.

答案 2 :(得分:1)

这应该是Snell's Law。有一个推导涉及材料中虚构“波前”的速度变化,这是一个很好的物理学,但可能不是真正需要理解如何使用它进行渲染。它非常普遍,适用于大多数情况,尽管光学中有些情况并不充分。