2016-02-02 6 views
0

В настоящее время я пытаюсь реализовать Bump Mapping для моего OpenGL Project. Проблема в том, что те же части моего куба черные. Как показано на картинке: enter image description hereBump Отображение черных фрагментов

Я почти уверен, что я просто не понимаю, как работают шейдеры, поэтому я использовал шейдер из OpenGL Superbible. Вот мой код: Vertex Shader

#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); 
} 

Что мне не хватает?

+0

«* Я почти уверен, что я просто не понимаю, как работают шейдеры, поэтому я использовал шейдер из OpenGL Superbible. *« Итак. Вы ничего не понимаете, поэтому вы просто копируете и вставляете его, и когда это не сработает, вы говорите нам, чтобы понять это для вас? –

+0

Хорошая цитата. Я просто попросил о помощи, чтобы выяснить, что я пропал. Если я не копировал и не вставлял, потому что у меня было несколько реализаций и были получены те же результаты, этот пример должен просто упростить код. – greedsin

+0

Из моего опыта черный - очень плохой фон для отладки. Вы не знаете, прозрачен ли ваш объект или просто черный. –

ответ

2

Похоже, что вы не используете fragNormal в любом месте. Вы должны использовать его для нормализации текстуры. Чтобы сделать это очевидным, если рельеф плоский, вы все равно должны получать обычное поверхностное освещение.

Следующая странная вещь заключается в том, что вам нужно умножить, чтобы вы столкнулись с нормалью на 2 и вычитали {1,1,1}. Нормальная никогда не должна переворачиваться, и я подозреваю, что это происходит в вашем случае. Когда он перевернется, вы внезапно перейдете от света в тень, и это может вызвать черные области.

Смежные вопросы