gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:27:49 26 4
gpt4 key购买 nike

我正在学习 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/

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