gpt4 book ai didi

opengl - 现代 GLSL 中的半向量是什么?

转载 作者:行者123 更新时间:2023-12-03 03:11:36 28 4
gpt4 key购买 nike

http://www.lighthouse3d.com/opengl/glsl/index.php?ogldir2 报告 OpenGL 上下文中的半向量是“眼睛位置 - 灯光位置”,但接着又说“幸运的是 OpenGL 为我们计算了它”[现已弃用]。

实际上如何计算(一个简单的例子将不胜感激)[主要是,它让我困惑什么是“Eye”以及它是如何导出的]。

目前,我成功地进行了镜面反射计算(具有良好的视觉效果),半矢量等于 Light,其中 Light 为

vec3 Light = normalize(light_position - vec3(out_Vertex));

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

[如果至少我知道“眼睛”是什么以及它如何实际衍生出来就好了。]

最佳答案

半矢量用于镜面照明,代表表面微缺陷处的法线,这会导致入射光反射向观察者。当半矢量更接近表面法线时,更多缺陷与实际表面法线对齐。与较粗糙的表面相比,较光滑的表面远离表面法线的缺陷较少,并且当半矢量远离实际法线时,会产生更锐利的高光和更显着的光衰减。下降量由镜面反射项控制,镜面反射项是半矢量和法线矢量之间的余弦值的幂,因此更平滑的表面具有更高的幂。

我们称其为半矢量 (H),因为它位于指向光的矢量(光矢量,L)和指向观看者的矢量(即眼睛位置 (0,0, 0) 减去眼睛空间中的顶点位置; View 向量,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);

关于opengl - 现代 GLSL 中的半向量是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3744038/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com