Opengl 用定向光源计算反射矢量

Opengl 用定向光源计算反射矢量,opengl,glsl,phong,Opengl,Glsl,Phong,我使用的是一个简单的Phong着色模型,场景由一个方向为y的平行光照亮,单色光强度为1。视点无限远,沿着向量(-1,0,-1)给出的方向观看 在这种情况下,着色方程由下式给出 I = k_d*L(N dot L)+k_s*L(R dot V)^n_s 其中,L为定向光源,kd,ks均为0.5和n_s=50 在这种情况下,如何计算R向量 我很困惑,因为计算有限向量需要有限坐标。对于平行光,它在-y方向上无限远。这些方程使用法向量。所以在你的例子中,当你使用平行光时,它仅仅意味着L是常数,等于[x

我使用的是一个简单的Phong着色模型,场景由一个方向为y的平行光照亮,单色光强度为1。视点无限远,沿着向量(-1,0,-1)给出的方向观看

在这种情况下,着色方程由下式给出

I = k_d*L(N dot L)+k_s*L(R dot V)^n_s
其中,
L
为定向光源,
kd
ks
均为
0.5
n_s=50

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


我很困惑,因为计算有限向量需要有限坐标。对于平行光,它在-y方向上无限远。

这些方程使用法向量。所以在你的例子中,当你使用平行光时,它仅仅意味着L是常数,等于[x=0,y=1,z=0](或[0,-1,0],我不记得了,你应该检查你的方程中L是指向点还是远离点)。

反射向量可以通过使用GLSL的
反射
函数来计算

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。