math - GLSL折射功能说明可用吗?

标签 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.

我想知道这些方程式是从哪里来的。我在互联网上搜索了自己拥有的书籍(《实时渲染圣经》,或上一版的《基于物理的渲染》),所有这些都引用了此实现,没有说明,也没有告诉解决方案。

从开始使用几何体开始手工进行尝试会带给我其他答案,但是显然对于像GLSL这样的非常常见的函数而言,这是艰巨的工作。因此,我更喜欢使用这种优化的表示法。

我只有这个:
a.b = |a||b|cos(angle) (Dot product)
angleOut = eta * sin(angleIn) (Snell's Law).

你知道它从哪里来吗?
有文件或引用文献可供阅读吗?

最佳答案

您可以在本书的第16.5节中找到说明:

FOLEY,詹姆斯·D(编辑)。计算机图形学:原理和实践,第二版,C。Addison-Wesley Professional,1996年。

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


引用[HECK84]是

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

并具有标题为“反射和折射变换”的详细附录。

关于math - GLSL折射功能说明可用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20801561/

相关文章:

math - 坐标系手性如何与旋转方向和顶点排序相关?

java - 两个(小)数相乘给出负数解,而不是溢出……那为什么呢?

c++ - 使用几何着色器创建新的图元类型

javascript - 二维六边形网格的透视坐标

opengl - 将 GL ES 2.0 着色器移植到桌面 GLSL(我应该吗?)

python - ModernGL 设置统一

java - 有更有效的方法来处理这个问题吗?

java - 如何确定属于空间中两条不相交线之间距离的点

algorithm - 如何用不相交的旋转矩形填充矩形区域?

c - 当我尝试对纹理进行采样时 GLSL 着色器变黑