用定向光源计算反射矢量

Posted

技术标签:

【中文标题】用定向光源计算反射矢量【英文标题】:Computing the Reflection Vector with Directional Light source 【发布时间】:2012-05-17 06:13:51 【问题描述】:

我正在使用一种简单形式的 Phong 着色模型,其中场景由在方向 -y 照射的定向光照亮,单色光的强度为 1。视点无限远,沿着由向量 (-1, 0, -1)。

在这种情况下,阴影方程由下式给出

I = k_d*L(N dot L)+k_s*L(R dot V)^n_s

其中L是定向光源,kdks都是0.5n_s = 50

在这种情况下,如何计算R 向量?

我很困惑,因为要计算有限向量,我们需要有限坐标。在定向光的情况下,它在 -y 方向上无限远。

【问题讨论】:

【参考方案1】:

反射矢量可以通过使用 GLSL 中的reflect 函数来计算。

vec3 toEye = normalize(vec3(0.0) - vVaryingPos);    
vec3 lightRef = normalize(reflect(-light, normal)); 
float spec = pow(dot(lightRef, toEye), 64.0f);  
specularColor = vec3(1.0)*max(spec, 0.0); 

计算是在眼睛空间中完成的......所以 eyePos 在 vec3(0.0) 中

【讨论】:

您应该在pow 之前应用max,因为否则负值在提高到64 次方时将变为正值,而它们应该被限制为0。 【参考方案2】:

这些方程使用法线向量。所以在你的情况下,当你使用定向光时,它只是意味着 L 是常数并且等于 [x=0, y=1, z=0] (或 [0, -1, 0],我不记得了,您应该检查您的方程式中 L 是指向该点还是远离该点)。

【讨论】:

以上是关于用定向光源计算反射矢量的主要内容,如果未能解决你的问题,请参考以下文章

有效地计算两个向量之间的差异

Matlab计算向量的反射

ShaderLab学习小结(十四)点光源问题

光照计算

Linux OpenGL 实践篇-6 光照

Unity Shader入门教程反射光斑的实现