c++ - 为什么法线使用相机空间而不是模型空间?

标签 c++ math opengl

我正在学习 OpenGL 图形,并且正在研究阴影。我正在阅读的教程告诉我将法线和光 vector 转换为相机空间。为什么是这样?为什么不能只保留模型空间中的坐标?

对此的后续问题是如何处理模型转换。我无法找到明确的答案。我目前有这段代码:

vec3 normCamSpace = normalize(mat3(V) * normal);"
vec3 dirToLight = (V*vec4(lightPos, 0.0)).xyz;"
float cosTheta = clamp(dot(normCamSpace, dirToLight),0,1);"

V 是 View 矩阵,或相机矩阵。当模型的位置、旋转和比例发生变化时,我不确定如何移动或编辑灯光。

最佳答案

主要原因是,通常您的光照位置不会在模型空间中给出,而是在世界空间中给出。然而,为了使照明有效地工作,所有计算都必须在公共(public)空间中进行。在您通常的转换链中,模型局部坐标由模型 View 矩阵直接转换到 View 空间

p_view = MV · p_local

因为你通常只有一个模型 View 矩阵,所以将这一步分成类似的东西会很麻烦

p_world = M · p_local
p_view  = V · p_world

为此,您需要分离 MV。

由于投影变换传统上作为一个单独的步骤发生,因此 View 空间是照明计算所基于的自然“公共(public)低地”。它只涉及将您的灯光位置从世界空间变换到 View 空间,并且由于灯光位置不是很复杂,因此这是在 CPU 上完成的,并且预变换的灯光位置作为着色器给出。

请注意,没有什么能阻止您在世界空间或模型局部空间中执行照明计算。它只需要正确地转换灯光位置。

关于c++ - 为什么法线使用相机空间而不是模型空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17499976/

相关文章:

c++ - 旋转纹理 sfml 并将输出保存到文件

opengl - 尝试执行深度附加时错误的帧缓冲区状态(返回 36054)

c++ - 当异常发生在国外源代码时,自创建的Minidump-File的Stacktrace无法正确使用

c++ - 如何在给定 dims+1 点的情况下找到任意维球体的中心和半径

c++ - 为什么ofstream作为类成员不能传递给thread?

optimization - 求一个函数的最大值

python - 计算 1/tanh(x) - 1/x 对于非常小的 x

java - LWJGL 的透明度问题

c++ - 关键字 'class' 和 c++ 中的类名之间可以有什么吗?

C++11:延迟初始化的安全双重检查锁定。可能的?