我正在尝试为我的照明系统创建一个简单的着色器。现在,我正在努力增加对正常映射的支持。没有法线贴图,照明系统工作正常。我正在使用从顶点着色器转发的法线,它们工作得很好。我也正常地从法线贴图中读取法线。如果不包括法线贴图,则照明效果非常好。我已经尝试添加顶点法线和法线贴图的法线,但这不起作用。也试过倍增。这是我正在阅读法线贴图的方式:
vec4 normalHeight = texture2D(m_NormalMap, texCoord);
vec3 normals = normalize((normalHeight.xyz * vec3(2.0) - vec3(1.0)));
所以我有正确的顶点法线和法线贴图的法线。我应该如何结合这些以获得正确的法线?
答案 0 :(得分:1)
这取决于您存储法线贴图的方式。如果他们在世界空间中开始(这是相当罕见的)并且您的场景永远不会改变,您可以按照他们拥有它们的方式查找它们。然而,通常它们处于切线空间。切线空间是一个使用对象法线的向量空间,以及(s,t)纹理坐标的变化率,可以正确地转换任意方向的法线上的法线。
切线空间法线贴图通常在肉眼看来是蓝色的,而世界空间法线贴图是彩虹的每种颜色(并且需要偏置和缩放,因为一半的色彩空间应该代表负向量):)
如果您想更好地理解切线空间,请完成导出基矢量的实现,请参阅this link。
答案 1 :(得分:0)
您的法线贴图是否不包含调整后的法线?如果是,那么你只需要在片段着色器中读取纹理,你应该有你的法线,如下所示:
vec4 normalHeight = texture2D(m_NormalMap, texCoord);
vec3 normal = normalize(normalHeight.xyz);
如果你试图考虑负值,那么你不应该乘以向量而是标量。
vec3 normal = normalize( (normalHeight.xyz * 2.0) - 1.0 );