0

我正在尝试为我的照明系统创建一个简单的着色器。现在,我正在努力添加对法线映射的支持。如果没有法线贴图,照明系统可以正常工作。我正在使用从顶点着色器转发的法线,它们工作得很好。我也正确地从法线贴图中读取法线。在不包括法线贴图的情况下,照明效果完美。我试过添加顶点法线和法线贴图的法线,但这不起作用。也试过乘法。这是我阅读法线贴图的方式:

vec4 normalHeight = texture2D(m_NormalMap, texCoord);
vec3 normals = normalize((normalHeight.xyz * vec3(2.0) - vec3(1.0)));

所以我有正确的顶点法线和法线贴图中的法线。我应该如何结合这些以获得正确的法线?

4

2 回答 2

2

这取决于您如何存储法线贴图。如果它们一开始就在世界空间中(这相当罕见)并且您的场景永远不会改变,您可以按照您拥有它们的方式查找它们。但是,通常它们位于切线空间中。切线空间是一个向量空间,它使用对象的法线和 (s,t) 纹理坐标的变化率来正确转换具有任意方向的表面上的法线。

切线空间法线贴图在肉眼看来通常是蓝色的,而世界空间法线贴图是彩虹的每一种颜色(并且需要偏置和缩放,因为一半的颜色空间应该代表负向量):)

如果您想更好地理解切线空间,并完成推导基向量的实现,请参阅此链接

于 2013-08-13T22:13:45.973 回答
0

您的法线贴图是否不包含调整后的法线?如果是,那么你只需要在片段着色器中读取纹理,你应该有你的正常,像这样:

vec4 normalHeight = texture2D(m_NormalMap, texCoord);
vec3 normal = normalize(normalHeight.xyz);

如果您试图考虑负值,那么您不应该乘以向量,而是乘以标量。

vec3 normal = normalize( (normalHeight.xyz * 2.0) - 1.0 );
于 2013-08-13T19:00:30.140 回答