GLSL - 顶点法线+法线贴图?

时间:2013-08-12 20:01:34

标签: vector glsl normals

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

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

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

2 个答案:

答案 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 );