我正在尝试为我的照明系统创建一个简单的着色器。现在,我正致力于添加对法线映射的支持。在没有法线贴图的情况下,照明系统工作正常。我使用从顶点着色器转发的法线,它们工作得很好。我也正确地读取了法线贴图中的法线。在不包含法线贴图的情况下,照明可以完美工作。我尝试添加顶点法线和法线贴图的法线,但这不起作用。也尝试了乘法。下面是我是如何读取法线映射的:
vec4 normalHeight = texture2D(m_NormalMap, texCoord);
vec3 normals = normalize((normalHeight.xyz * vec3(2.0) - vec3(1.0)));所以我有正确的顶点法线,以及来自法线贴图的法线。我应该如何组合这些来获得正确的法线?
发布于 2013-08-14 06:13:46
这取决于存储法线贴图的方式。如果它们一开始就在世界空间中(这是相当罕见的),并且你的场景永远不会改变,你可以按照你拥有的方式来查找它们。但是,它们通常位于相切空间中。切线空间是一个向量空间,它使用对象的法线和(s,t)纹理坐标的变化率来正确变换具有任意方向的曲面上的法线。
切线空间法线贴图通常在肉眼看来是蓝色的,而世界空间法线贴图是彩虹的每种颜色(并且需要进行偏移和缩放,因为颜色空间的一半应该表示负向量):
如果要更好地了解切线空间,请完成导出基础向量的实现,请参见this link。
发布于 2013-08-14 03:00:30
您的法线贴图是否不包含调整后的法线?如果是,那么你只需要读取碎片着色器中的纹理,然后你应该有你的法线,如下所示:
vec4 normalHeight = texture2D(m_NormalMap, texCoord);
vec3 normal = normalize(normalHeight.xyz);如果你试图解释负值,那么你不应该乘以向量,而应该乘以标量。
vec3 normal = normalize( (normalHeight.xyz * 2.0) - 1.0 );https://stackoverflow.com/questions/18195689
复制相似问题