【问题标题】:GLSL - Vertex normals + normal mapping?GLSL - 顶点法线+法线贴图?
【发布时间】:2013-08-14 06:40:22
【问题描述】:

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

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

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

【问题讨论】:

    标签: vector glsl normals


    【解决方案1】:

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

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

    如果您想更好地理解切空间,并完成推导基向量的实现,请参阅this link。

    【讨论】:

      【解决方案2】:

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

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

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

      vec3 normal = normalize( (normalHeight.xyz * 2.0) - 1.0 );
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-04-30
        • 1970-01-01
        • 2021-12-19
        • 2012-01-12
        • 1970-01-01
        • 2013-05-08
        • 1970-01-01
        相关资源
        最近更新 更多