2013-12-04 3 views
0

Я пытаюсь реализовать отображение рельефа, но я не знаю, где проблема, шейдеры, похоже, в порядке. Я уверен, нормали, касательные и bitangets хорошо вычисленные и проблема в затенении, но если кто-то хочет посмотреть другие части коды здесь:Bump mapping с GLSL

(https://github.com/CarlosCarrera/OpenglElements)

VertexShader.vsh

#version 120 

attribute vec3 coord3d; 
attribute vec3 normals; 
attribute vec2 texcoord; 
attribute vec3 tangents; 
attribute vec3 bitangents; 

varying vec3 LightDir; 
varying vec2 f_texcoord; 
varying vec3 ViewDir; 

//Light 
uniform vec4 LightPosition; 
uniform vec3 LightIntensity; 

//Matrices 
uniform mat4 ModelViewMatrix; 
uniform mat3 NormalMatrix; 
uniform mat4 mvp; 

void main() 
{ 
vec3 norm = normalize(NormalMatrix * normals); 
vec3 tang = normalize(NormalMatrix * tangents); 
vec3 bitang = normalize(NormalMatrix * bitangents); 

mat3 toObjectLocal =mat3(
          tang.x, bitang.x, norm.x, 
          tang.y, bitang.y, norm.y, 
          tang.z, bitang.z, norm.z); 


// Transform light direction and view direction to tangent space 
vec3 pos = vec3(ModelViewMatrix * vec4(coord3d,1.0)); 
LightDir = normalize(toObjectLocal * (LightPosition.xyz - pos)); 

ViewDir = toObjectLocal * normalize(-pos); 

gl_Position = mvp * vec4(coord3d,1.0); 
f_texcoord = texcoord; 
} 

FragmentShader.fsh

#version 120 

varying vec3 LightDir; 
varying vec2 f_texcoord; 
varying vec3 ViewDir; 

uniform vec4 LightPosition; 
uniform vec3 LightIntensity; 

uniform vec3 Ar;   // Ambient reflectivity 
uniform vec3 Sr;   // Specular reflectivity 
uniform float Shininess; // Specular shininess factor 

uniform sampler2D mytexture,mytexture2; 

vec3 phongModel(vec3 norm, vec3 diffR) { 
vec3 r = normalize(reflect(-normalize(LightDir), normalize(norm))); 
vec3 ambient = LightIntensity * Ar; 
float sDotN = max(dot(normalize(LightDir), normalize(norm)), 0.0); 
vec3 diffuse = LightIntensity * diffR * sDotN; 

vec3 spec = vec3(0.0); 
if(sDotN > 0.0) 
    spec = LightIntensity * Sr * 
    pow(max(dot(r,normalize(ViewDir)), 0.0), Shininess); 

return ambient + diffuse + spec; 
} 

void main() { 
// Lookup the normal from the normal map 

vec2 flipped_texcoord = vec2(f_texcoord.x, 1.0 - f_texcoord.y); 

vec3 normal = 2.0 * texture2D(mytexture2, flipped_texcoord).rgb - 1.0; 
normal = normalize(normal); 
vec4 texColor = texture2D(mytexture, flipped_texcoord); 

gl_FragColor = vec4(phongModel(normal.xyz, texColor.rgb), 1.0); 
} 

результаты я получаю это будут:

https://dl.dropboxusercontent.com/u/1015014/Captura%20de%20pantalla%202013-12-04%20a%20la%28s%29%2001.16.08.png

+0

Ваша матрица TBN построена неправильно. Это должно быть 'mat3 (tang, bitang, norm)'. И я мог бы предложить использовать другое слово, отличное от «нормы», потому что это обычно означает длину :) Заманчиво сделать «норму» стенографию «нормального», но «норма» уже имеет собственный математический смысл. –

+0

Спасибо за ответ. Я изменил то, что вы сказали, но я все равно получаю одинаковые результаты ... Как я уже сказал, я уверен, что нормали правильны, потому что, когда я использую только огни с постоянным цветом на объекте, и я полагаю, что uvs в порядке, потому что он правильно отображает текстуру ... Любая другая идея? Еще раз спасибо! – Tolokobcn

ответ

1

Хорошо, поэтому я, наконец, нашел ошибку ... Это было не в шейдерах, поэтому шейдеры в порядке! Проблема была в том, что я не передавал нормальное изображение в шейдер правильно.

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