最简单照明模型中的光向及其转换

Arm*_*yan 5 opengl lighting glsl

因此,在OpenGL学习任务中,我已经接触到基本的照明。

想象一下这个最简单的照明模型。每个顶点都有一个位置,颜色和法线。着色器将获得计算为(MV -1T的 ModelViewProjection 矩阵(MVP),Modelview矩阵(MV)和Normal矩阵(N),以及统一的LightColorLightDirection。顶点着色器执行光照计算-片段着色器仅输出插值的颜色。

现在,在有关该主题的每个教程中,我都发现有两件事使我感到困惑。首先,已经假定LightDirection位于眼睛坐标中。其次,输出颜色计算为

max(0, dot(LightDirection, N * normal))*LightColor*Color;
Run Code Online (Sandbox Code Playgroud)

我希望首先应该对LightDirection求逆,即我认为正确的公式是

max(0, dot(-LightDirection, N * normal))*LightColor*Color;
Run Code Online (Sandbox Code Playgroud)

似乎假设LightDirection实际上是实际光流矢量的逆向。

问题1:是否已建立某种惯例,即假设此模型中的LightDirection是无限远光源的矢量,而不是光方向的矢量,或者这不是主要问题,并且发生在我碰到的教程是如此假设吗?

Q2:如果LightDirection在世界坐标中而不是在眼睛坐标中,是否应使用法线矩阵或模型视图矩阵将其转换为眼睛坐标?

感谢您澄清这些事情!

dat*_*olf 2

Q1:这是某种既定的约定,即该模型中的 LightDirection 被假定为无限远光源的矢量而不是光方向的矢量,或者这不是一个主要问题,而且碰巧在我遇到的教程是这么假设的?

在固定函数 OpenGL 中,当提供光源位置时,第四个参数确定光源是定向的还是位置的。在定向光的情况下,提供的矢量指向(无限远的)光源。

如果是位置光源,则每个顶点的 LightDirection 计算如下LightDirection = LightPosition - VertexPosition- 为了简单起见,此计算是在眼睛坐标中完成的

Q2:如果LightDirection是世界坐标而不是眼睛坐标,是否应该用法线矩阵或模型视图矩阵转换为眼睛坐标?

glLighti在固定函数 OpenGL 中,通过调用时的当前模型视图矩阵来转换提供的灯光位置。如果光线是定位的,它会被通常的模型视图矩阵转换。如果是定向光,则使用法线矩阵。