法线贴图工作不正常,奇怪的半光效果

问题描述 投票:0回答:1

我们正在尝试在2D游戏引擎中实现法线贴图,并获得怪异的效果。如果正常手动设置vec3 Normal = vec3(0.0, 0.0, 1.0)光源可以正常工作,但无法获得我们希望通过法线贴图实现的“深”效果:enter image description here但是,如果我们使用法线贴图纹理获得法线:vec3 Normal = texture(NormalMap, TexCoord).rgb,则根本无法使用。不应照亮的东西照亮,反之亦然(例如,砖之间的间隙)。除此之外,在纹理的底部(或顶部,取决于灯光的位置)一暗区域。enter image description here尽管法线贴图本身的纹理看起来不错:enter image description here这是我们的片段着色器:

#version 330 core
layout (location = 0) out vec4 FragColor;

in vec2 TexCoord;
in vec2 FragPos;

uniform sampler2D OurTexture;
uniform sampler2D NormalMap;

struct point_light
{
    vec3 Position;
    vec3 Color;
};

uniform point_light Light;

void main()
{
    vec4 Color = texture(OurTexture, TexCoord);
    vec3 Normal = texture(NormalMap, TexCoord).rgb;

    if (Color.a < 0.1)
        discard;

    vec3 LightDir = vec3(Light.Position.xy - FragPos, Light.Position.z);

    float D = length(LightDir);

    vec3 L = normalize(LightDir);
    Normal = normalize(Normal * 2.0 - 1.0);

    vec3 Diffuse = Light.Color * max(dot(Normal, L), 0);
    vec3 Ambient = vec3(0.3, 0.3, 0.3);

    vec3 Falloff = vec3(1, 0, 0);

    float Attenuation = 1.0 /(Falloff.x + Falloff.y*D + Falloff.z*D*D);
    vec3 Intensity = (Ambient + Diffuse) * Attenuation;

    FragColor = Color * vec4(Intensity, 1);
}

以及顶点:

#version 330 core
layout (location = 0) in vec2 aPosition;
layout (location = 1) in vec2 aTexCoord;

uniform mat4 Transform;
uniform mat4 ViewProjection;

out vec2 FragPos;
out vec2 TexCoord;

void main()
{
    gl_Position = ViewProjection * Transform * vec4(aPosition, 0.0, 1.0);
    TexCoord = aTexCoord;
    FragPos = vec2(Transform * vec4(aPosition, 0.0, 1.0));
}

我用谷歌搜索,发现一些人得到相同的结果,但是他们的问题仍然没有答案。知道原因是什么?

c++ glsl rendering light normals
1个回答
0
投票

您在法线贴图中使用什么纹理格式? SRGB,SNORM等?这可能是问题所在。尝试UNORM。

另外,由于未使用切线空间,因此请确保平面的Z轴与法线的Z轴对齐。此外,OGL会沿相反方向读取Y,因此您需要翻转从法线贴图读取的法线的Y坐标。另外,您可以使用反向的Y法线贴图(绿色朝下)。

© www.soinside.com 2019 - 2024. All rights reserved.