gpt4 book ai didi

opengl - 每片段光照坐标系

转载 作者:行者123 更新时间:2023-12-04 12:13:00 25 4
gpt4 key购买 nike

我正在使用着色器开发 OpenGL 2.1 应用程序,但我的每片段光照出现问题。当我的场景初始加载时照明是正确的,但是当我在场景中导航时,照明会随着“相机”移动,而不是停留在静态位置。例如,如果我将灯光放在右侧,则物体的右侧将被照亮。如果我然后将相机移动到对象的另一侧并指向相反的方向,则照明仍然在对象的右侧(而不是像现在应该在左侧)。我假设我在错误的坐标系中计算照明,这导致了错误的行为。我正在按以下方式计算照明...

在顶点着色器中...

ECPosition = gl_ModelViewMatrix * gl_Vertex;
WCNormal = gl_NormalMatrix * vertexNormal;

其中 vertexNormal 是对象/模型空间中的法线。

在片段着色器中...
float lightIntensity = 0.2; //ambient
lightIntensity += max(dot(normalize(LightPosition - vec3(ECPosition)), WCNormal), 0.0) * 1.5; //diffuse

例如,其中 LightPosition 是 (100.0, 10.0, 0.0),这会将光放在世界的右侧,如上所述。我不确定的部分是 gl_NormalMatrix 部分。我不确定这个矩阵是什么以及它把我的法线放入什么坐标空间(我假设世界空间)。如果将法线放入世界空间,那么我认为问题在于 ECPosition 在眼睛空间中,而 LightPosition 和 WCNormal 在世界空间中。关于此的某些事情似乎不正确,但我无法弄清楚。我还尝试将 ECPosition 放入世界空间,我将其乘以我自己的模型矩阵,该模型矩阵仅包含我为将坐标放入世界空间所做的变换,但这不起作用。如果我需要提供有关我的着色器或代码的其他信息,请告诉我。

最佳答案

gl_NormalMatrix将您的法线转换为眼睛空间(有关更多详细信息,请参阅 this tutorial)。

我认为为了让您的灯光处于静态世界位置,您应该将 LightPosition 转换为眼睛空间,并将其乘以您当前的 View 矩阵。

关于opengl - 每片段光照坐标系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6670638/

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