• Jueves 28 de Marzo de 2024, 09:58

Autor Tema:  la Rotación Geométrica affecta a la iluminación del objecto  (Leído 1791 veces)

diego.martinez

  • Miembro MUY activo
  • ***
  • Mensajes: 297
    • Ver Perfil
la Rotación Geométrica affecta a la iluminación del objecto
« en: Lunes 13 de Abril de 2015, 13:55 »
0
Buenas:

Tengo un problema con la iluminación de un objeto.
Estoy trabajando con Opengl ES 2.0 para entornos embebidos.
Cuando genero rotación del objecto, la iluminación del objecto rota de forma erronea, no correspondiendo con la linea de luz que deberia de dar sobre el objeto.



Si veis en la imagen, el punto de luz es el mismo para las tres teteras, pero al rotarlas, no se corresponde con un punto unico en el espacio.

Tengo la impresión de que se debe al calculo de la normal, quizas. He depurado los objetos y las normales parecen correctas, pero cuando las multiplico por la normal matrix, parecen erroneas.

La matrix de normales la calculo:

Código: C++
  1. void    GRPMATRIX::GetNormalMatrix (GLFLOAT (*r)[4][4])
  2. {
  3.         GRPMATRIX inverse;
  4.         GRPMATRIX transpose;
  5.  
  6.         transpose=*this;
  7.         transpose.Transpose();
  8.  
  9.         inverse=transpose;
  10.         inverse.Inverse();
  11.  
  12.         inverse.CopyTo(r);
  13.  
  14. }
  15.  

los cálculos de la inversa y la traspuesta están comprobados matemáticamente.

El shader que uso es:

Código: C++
  1.  
  2. const char GRPSHADERLIBRARY::VertexShaderDOT[] =
  3.  
  4.         "precision mediump float;                               \n"
  5.  
  6.         "attribute vec3 a_position;                     \n"
  7.         "attribute vec3 a_normal;                               \n"
  8.         "attribute vec2 a_texCoord;                     \n"
  9.                                                                                                                                                                                                                                
  10.         "uniform sampler2D s_texture;           \n"    
  11.  
  12.         "uniform mat4 MVPMat;                                           \n"
  13.         "uniform mat4 Model;                            \n"
  14.         "uniform mat4 ModelView;                                \n"                                                                                                            
  15.         "uniform mat4 iMVPMat;                                  \n"
  16.  
  17.         "varying vec4 v_position;                               \n"
  18.         "varying vec4 v_normal;                                 \n"
  19.         "varying vec2 v_texCoord;                               \n"
  20.  
  21.         "uniform vec3 lightPosition;            \n"
  22.         "uniform float lightStrength;\n"
  23.         "varying vec4 vLight;\n"
  24.  
  25.         "void main()                                                                                                                                                                                                                            \n"
  26.         "       {                                                                                                                                                                                                                                       \n"
  27.         "v_position             = (ModelView * vec4(a_position,1.0));\n"
  28.         "vLight         = normalize(MVPMat * vec4(lightPosition,1.0)); \n"                                                                                             
  29.         "v_texCoord     = a_texCoord;\n"
  30.         "v_normal               = normalize(iMVPMat*vec4(a_normal,1.0));\n"                                                                                                                                                                                                            
  31.         "gl_Position        = MVPMat * vec4(a_position,1.0);\n"
  32.  
  33.         " } \n";
  34.  
  35. //---------------------- fragment
  36.  
  37. const char GRPSHADERLIBRARY::TextureShaderLightTextureDOT[] =
  38.  
  39. "precision mediump float;                       \n"
  40.  
  41. "varying vec4 v_position;\n"
  42. "varying vec2 v_texCoord;                       \n"
  43. "varying vec4 v_normal;                         \n"
  44.  
  45.  
  46. "uniform sampler2D s_texture;   \n"                                                                                                                                                                                                            
  47. "const vec3 lightPos                    = vec3(1.0,     1.0,    1.0);\n"
  48.                                                                                                                
  49. "varying vec4 vLight;\n"
  50.                                                                                                                
  51. "void main() {\n"                      
  52.                                                                                                        
  53. "       vec4 N = v_normal;\n"
  54. "       vec4 nN = normalize(N);\n"
  55.  
  56. " vec4 nLight = normalize(vLight-v_position);\n"
  57.                                                                                                                
  58. " float lambert = dot(nN,nLight); \n"
  59. "        lambert = clamp (lambert,0.0,1.0);\n"
  60.  
  61. // Multiply the color by the diffuse illumination level to get final output color.
  62.                                                                                                                
  63.         "vec4 color                     =       vec4(texture2D(s_texture,v_texCoord).rgb,1.0);\n"
  64.         "gl_FragColor           =       vec4((color.r*lambert),(color.g*lambert),(color.b*lambert),1.0);                                                                        \n"// Pass the color directly through the pipeline.
  65.  
  66.                 "gl_FragColor.a =       1.0;                                                                                                            \n"
  67. "}\n";
  68.  
  69.  


Alguna idea?
« última modificación: Lunes 13 de Abril de 2015, 13:59 por diego.martinez »