http://www.lighthouse3d.com/opengl/glsl/index.php?ogldir2 据报道,OpenGL上下文中的一半矢量是“眼睛位置 - 光线位置”,但随后它继续说'幸运的是,OpenGL为我们计算它'[现已弃用]。
如何,实际上可以计算(一个简单的例子将非常感激)[主要是,它让我困惑的是“眼睛”是什么以及它是如何得出的。)
此刻我设法使镜面反射计算工作(具有良好的视觉效果),其中半矢量等于Light,其中Light是
vec3 Light = normalize(light_position - vec3(out_Vertex));
现在,我不知道为什么会这样。
[如果至少我知道“眼睛”是什么以及如何实际得出它。]
答案 0 :(得分:6)
半矢量用于镜面反射,表示表面微瑕疵的法线,这会导致入射光向观察者反射。当半矢量更接近表面法线时,更多的缺陷与实际的表面法线对齐。更平滑的表面将具有更少的指向远离表面法线的瑕疵,并且当半矢量远离实际法线而不是更粗糙的表面时,导致更明亮的高光和更明显的光下降。下降量由镜面反射项控制,镜面项是采用半矢量和法向量之间的余弦的功率,因此更平滑的表面具有更高的功率。
我们称它为半矢量(H),因为它是矢量点到光(光矢量,L)和指向观察者的矢量(眼睛位置(0,0)之间的中间值) 0)减去眼睛空间中的顶点位置;视图矢量,V)。在计算H之前,请确保光线和眼睛的矢量位于相同的坐标空间中(传统的OpenGL使用了眼睛空间)。
H = normalize( L + V )
您进行了正确的计算,但您的变量可以更恰当地命名。 这里的术语light_position并不完全正确,因为你引用的教程是定向光教程,根据定义,定向光没有位置。方向光的光矢量与顶点无关,所以在这里,你已经组合了几个方程。请记住,光矢量朝向光线,与光线中的光子流相反。
// i'm keeping your term here... I'm assuming
// you wanted to simulate a light coming from that position
// using a directional light, so the light direction would
// be -light_position, making
// L = -(-light_position) = light_position
vec3 L = light_position;
// For a point light, you would need the direction from
// the point to the light, so instead it would be
// light_position - outVertex
vec3 V = -out_Vertex;
// really it is (eye - vertexPosition), so (0,0,0) - out_Vertex
vec3 H = normalize(L + V);
答案 1 :(得分:4)
在片段着色器中,顶点坐标可以看作是从相机(或观察者的“眼睛”)到当前片段的向量,因此通过反转此向量的方向,我们就可以得到“眼睛” - 你正在寻找的矢量。在计算半矢量时,您还需要了解光位置矢量的方向,在它们指向表面的链接的网页上,http://en.wikipedia.org/wiki/Blinn%E2%80%93Phong_shading_model指向远离表面的位置。