【问题标题】:Bump Mapping black fragments凹凸贴图黑色片段
【发布时间】:2016-02-02 13:56:15
【问题描述】:

目前我尝试为我的 OpenGL 项目实现凹凸映射。 问题是我的立方体的相同部分是黑色的。如这张图片所示:

我几乎可以肯定我只是不明白着色器是如何工作的,所以我使用了来自 OpenGL Superbible 的着色器。 这是我的代码: 顶点着色器

    #version 330

layout(location = 0) in vec4 position;
layout(location = 1) in vec3 normal;
layout(location = 2) in vec2 texCoord;
layout(location = 3) in vec3 tangent;
layout(location = 4) in vec3 bitangent;

uniform mat4 matModel;
uniform mat4 matNormal;
uniform mat4 matMVP;
uniform mat4 matMV;
uniform vec3 light_pos = vec3(0.0,0.0,100.0);

out VS_OUT{
    vec3 eyeDir;
    vec3 lightDir;
    vec2 fragTexCoord;
} vs_out;

void main()
{
    vec4 P = matMV*position;
    vec3 V = P.xyz;
    vec3 L = normalize(light_pos - P.xyz);

    vec3 N = normalize(mat3(matNormal)*normal);
    vec3 T = normalize(mat3(matNormal)*tangent);
    vec3 B = cross(N,T);

    vs_out.lightDir = normalize(vec3(dot(L,T),
                                     dot(L,B),
                                     dot(L,N)));
    V = -P.xyz;
    vs_out.eyeDir = normalize(vec3(dot(V,T),
                                     dot(V,B),
                                     dot(V,N)));

    vs_out.fragTexCoord = texCoord;
    gl_Position = matMVP * position;
}

还有片段着色器:

#version 330

uniform sampler2D diffuseTex;
uniform sampler2D heightTex;
uniform vec3 heightColor;


in vec3 fragNormal;
in vec2 fragTexCoord;
in vec3 tangent_out_normalized;
in vec3 bitangent_out;
in vec3 normal_out_normalized;

in VS_OUT{
    vec3 eyeDir;
    vec3 lightDir;
    vec2 fragTexCoord;
}fs_in;

out vec4 outputColor;

void main()
{

    vec3 V = normalize(fs_in.eyeDir);
    vec3 L = normalize(fs_in.lightDir);
    vec3 N = normalize(texture(heightTex,fs_in.fragTexCoord).rgb*2-vec3(1.0));
    vec3 R = reflect(-L,N);
    vec3 diffuse_albedo =  texture(diffuseTex,fs_in.fragTexCoord).rgb;
    vec3 diffuse =max(dot(N,L),0)*diffuse_albedo;
    vec3 specular_albedo = vec3(1.0);
    vec3 specular = max(pow(dot(R,V),25.0),0.0)*specular_albedo;


    outputColor = vec4(diffuse+specular,1);
}

我错过了什么?

【问题讨论】:

  • "我几乎可以肯定我只是不明白着色器是如何工作的,所以我使用了来自 OpenGL Superbible 的着色器。" 所以。你不明白,所以你只是复制并粘贴它,当它不起作用时,你告诉我们为你解决?
  • 很好的引用。我只是寻求帮助以找出我缺少的东西。我仍然没有复制和粘贴,因为我有几个实现并得到相同的结果,这个例子应该只是简化代码。!
  • 根据我的经验,黑色对于调试来说是非常糟糕的背景。您不知道您的对象是透明的还是黑色的。
  • @AdrianKrupa 是的,你是对的,我改变了它,看起来立方体的部分真的很黑

标签: opengl bump-mapping


【解决方案1】:

您不在任何地方使用fragNormal 似乎是非常错误的。您应该使用它来旋转纹理法线。为了清楚起见,如果凸起是平坦的,您仍然应该获得通常的表面照明。

下一个奇怪的事情是你需要将凹凸法线乘以 2 并减去 {1,1,1}。正常情况永远不会翻转,我怀疑您的情况正在发生这种情况。当它翻转时,您会突然从光中转到阴影中,这可能会导致黑色区域。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-25
    相关资源
    最近更新 更多