什么是现代GLSL中的半矢量?

j r*_*riv 5 opengl graphics glsl

http://www.lighthouse3d.com/opengl/glsl/index.php?ogldir2 报告说,OpenGL上下文中的一半矢量是"眼睛位置 - 光线位置",但随后它继续说'幸运的是,OpenGL为我们计算它'[现已弃用].

如何,实际上可以计算(一个简单的例子将非常感激)[主要是,它困惑我什么是"眼睛"是什么以及如何得出].

目前我设法使镜面计算工作(具有良好的视觉效果),半矢量等于Light所在的Light

vec3 Light = normalize(light_position - vec3(out_Vertex));
Run Code Online (Sandbox Code Playgroud)

现在,我不知道为什么会这样.

[如果至少我知道"眼睛"是什么以及如何实际得出它.]

MtR*_*oad 6

半矢量用于镜面光照并且表示表面中的微瑕疵处的法线,其将导致入射光朝向观察者反射.当半矢量更接近表面法线时,更多的缺陷与实际的表面法线对齐.更平滑的表面将具有更少的指向远离表面法线的瑕疵,并且当半矢量远离实际法线而不是更粗糙的表面时,导致更明亮的高光和更明显的光下降.下降量由镜面项控制,镜面项是采用半矢量和法向矢量之间的余弦的功率,因此更光滑的表面具有更高的功率.

我们将其称为半矢量(H),因为它是矢量点到光(光矢量,L)和指向观察者的矢量(眼睛位置(0,0,0)减去)之间的中间值眼睛空间中的顶点位置;视图矢量,V).在计算H之前,请确保光线和眼睛的矢量位于相同的坐标空间中(传统的OpenGL使用了眼睛空间).

H = normalize( L + V )
Run Code Online (Sandbox Code Playgroud)

您进行了正确的计算,但您的变量可以更恰当地命名.这里的术语light_position并不完全正确,因为你引用的教程是Directional light教程,根据定义,方向灯没有位置.方向光的光矢量与顶点无关,所以在这里,你已经组合了几个方程.请记住,光矢量朝向光,因此与光的光子流相反.

// 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);
Run Code Online (Sandbox Code Playgroud)


Dan*_*iel 5

在片段着色器中,顶点坐标可以看作是从相机(或观察者的“眼睛”)到当前片段的向量,因此通过反转该向量的方向,我们就可以得到“眼睛”向量正在找。在计算半矢量时,您还需要了解光位置矢量的方向,在您链接的网页上,它们指向表面,在http://en.wikipedia.org/wiki/Blinn %E2%80%93Phong_shading_model其指向远离表面。