gpt4 book ai didi

opengl - 使用具有世界空间法线的切线空间法线贴图

转载 作者:行者123 更新时间:2023-12-05 05:26:44 28 4
gpt4 key购买 nike

我正在研究 GLSL 中的延迟着色。我在世界空间中拥有我所有的模型法线,以及位置。整个过程完全按照多边形的世界空间法线应有的方式工作,但我不确定如何添加法线贴图。我知道建议在 View 空间中进行照明,我已经尝试过了,但我什至无法获得世界空间中的四分之一。我现在要做的就是添加法线。我有一个规则的法线贴图,它在切线空间中。我尝试了以下方法:

  1. 用法线贴图乘以世界空间法线似乎没有用。

  2. 我尝试添加法线贴图的法线,尽管我知道那行不通。

此时我不太确定还能尝试什么。有什么简单的方法可以做到这一点吗?

正常渲染片段着色器:

#ifdef NORMALMAP
uniform sampler2D m_Normals;
#endif

varying vec3 normal;
varying vec2 texCoord;

void main() {
vec3 normals;
#ifdef NORMALMAP
normals = normalize(normal * (texture(m_Normals, texCoord).xyz));
#else
normals = normal;
#endif
gl_FragColor = vec4(normals, 1.0);
}

变量“normal”是从顶点着色器传入的世界空间法线。

最佳答案

My light positions are all in normal space.

老实说,我不知道这里的“正常空间”是什么意思。数学中有“法空间”,但两者关系不大,也没有标准的坐标空间称为“法空间”。

My question is how to convert tangent to world.

你的多边形的世界空间法线不足以解决这个问题(事实上,你需要一个逐顶点法线)。要从切线空间转换为对象空间,您需要三样东西:

  1. 你的对象空间法向量
  2. 表示纹理坐标变化的向量
  3. 表示纹理 t 坐标变化的向量

这三件事共同构成了切线空间 -> 基矩阵的对象空间变化(通常称为 TBN,因为向量称为 Tangent、Bitangent 和正常)。

但是,在这个问题中您不需要对象空间法线,因此您需要将该矩阵乘以您的模型矩阵,以便它跳过对象空间并直接进入世界空间。同样,如果您的法向量已经在世界空间中,您需要将其转换回对象空间。在这种情况下,对象空间和世界空间可能是相同的,特别是因为我们在这里只处理 3x3 矩阵(没有转换)。但是根据你的描述我不能确定。

最后要注意的是,在这种情况下,您需要传统 TBN 矩阵的逆矩阵。传统上,它用于将向量转换到切线空间,但您想将它们转换。旋转矩阵的逆与其转置相同,因此您真正需要做的就是将这 3 个向量放在行中而不是列中1

1假设您的 T、B 和 N 向量成直角。不一定是这种情况,因为它们是从您的纹理坐标派生的。这一切都将取决于您使用什么来计算切线和双切线向量;许多软件会为您重新正交化它们。

关于opengl - 使用具有世界空间法线的切线空间法线贴图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24233433/

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