2011-11-03 17 views
5

tengo que poner la iluminación en una imagen de OpenGL pero no saben cómo poner un punto de luz de iluminación correcta como en la siguiente imagen:iluminación de OpenGL y brillante

Right

Por ahora lo había intentado modo diferente de la iluminación, pero el resultado es el siguiente :(

Wrong

os adjunto el código que he utilizado para mi resultado. lo que está mal?

float specref[] = { 1.0f, 1.0f, 1.0f, 1.0f }; 
    // Light values and coordinates 
    float ambientLight[] = { 0.3f, 0.3f, 0.3f, 1.0f }; 
    float diffuseLight[] = { 0.7f, 0.7f, 0.7f, 1.0f }; 
    float specular[] = { 1.0f, 1.0f, 1.0f, 1.0f}; 
    float lightPos[] = { 0.0f, -150.0f, -150.0f, 1.0f }; 

    glEnable (GL_LIGHTING) ; 

    glLightfv(GL_LIGHT0,GL_AMBIENT, ambientLight); 
    glLightfv(GL_LIGHT0,GL_DIFFUSE,diffuseLight); 
    glLightfv(GL_LIGHT0,GL_SPECULAR,specular); 
    glLightfv(GL_LIGHT0,GL_POSITION,lightPos); 
    glEnable(GL_LIGHT0); 
    glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); 
    glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR,specref); 
    glMateriali(GL_FRONT_AND_BACK,GL_SHININESS,128); 
    glEnable (GL_COLOR_MATERIAL) ; 

    glClearColor (1.0, 1.0, 1.0, 1.0); 
    glColor3f(0.0,0.0,0.0); 

Edición 04/11/2011 0.39 CET

adjunto también es mi función de visualización() llamada por glutDisplayFunc (pantalla);

void display(void) 

    { 

    [...] 

    //Draw polygons in 3d 

    glColor3f(0.0,1.0,1.0); 

    glBegin(GL_QUADS); 

    for(i=0;i<NVERT-1;i++) { 

     for (j=0;j<NVERT-1;j++) { 

       glVertex3f((GLfloat)((sb[i*NVERT+j]).x()), 

             (GLfloat)((sb[i*NVERT+j]).y()), 

             (GLfloat)((sb[i*NVERT+j]).z())); 


       glVertex3f((GLfloat)((sb[i*NVERT+j+1]).x()), 

             (GLfloat)((sb[i*NVERT+j+1]).y()), 

             (GLfloat)((sb[i*NVERT+j+1]).z())); 


       glVertex3f((GLfloat)((sb[(i+1)*NVERT+j+1]).x()), 

             (GLfloat)((sb[(i+1)*NVERT+j+1]).y()), 

             (GLfloat)((sb[(i+1)*NVERT+j+1]).z())); 


       glVertex3f((GLfloat)((sb[(i+1)*NVERT+j]).x()), 

             (GLfloat)((sb[(i+1)*NVERT+j]).y()), 

             (GLfloat)((sb[(i+1)*NVERT+j]).z())); 


     } 



    } 

    glEnd(); 
    glFlush(); 

    } 

En la práctica con pantalla escribo las pequeñas áreas que componen la figura 2 ° que Representé (I omite el algoritmo para el cálculo de los puntos de cada zona porque se lo trabajo).

Mi objetivo es tener un resultado similar a la figura 1 para el rayo y la representación de la figura, pero sólo el resultado obtenido en la figura 2.

No sé cómo poner correctamente la luz y cómo para configurar mi figura para tener este render (como espejo).

+2

Publicar un ejemplo completo, mínimo que demuestra el problema. – genpfault

+4

podrían ser varias cosas. Supongo que no tienes ninguna norma, pero supongo. Necesitamos un ejemplo mínimo como señala @genpfault. – larsmoa

+0

¿Es la primera imagen lo que quiere lograr y la segunda lo que tiene en este momento? – NickLH

Respuesta

1

Faltan normales. O bien debe proporcionar una normal por vértice (glNormal) o puede habilitar GL_AUTO_NORMALS si usa glMap2 (que no es así). Hay un artículo sobre cómo compute normals for a triangle or polygons en opengl.org que probablemente encuentre útil.

Begin Function CalculateSurfaceNormal (Input Polygon) Returns Vector 

    Set Vertex Normal to (0, 0, 0) 

    Begin Cycle for Index in [0, Polygon.vertexNumber) 

     Set Vertex Current to Polygon.verts[Index] 
     Set Vertex Next to Polygon.verts[(Index plus 1) mod Polygon.vertexNumber] 

     Set Normal.x to Sum of Normal.x and (multiply (Current.y minus Next.y) by (Current.z plus Next.z)) 
     Set Normal.y to Sum of Normal.y and (multiply (Current.z minus Next.z) by (Current.x plus Next.x)) 
     Set Normal.z to Sum of Normal.z and (multiply (Current.x minus Next.x) by (Current.y plus Next.y)) 

    End Cycle 

    Returning Normalize(Normal) 

End Function 

partir de la imagen informados de los resultados parece que se está calculando y dibujar las normales (flechas rojas), pero no aplicarlos.

0

Realmente no puedo descubrir qué está pasando con tu código. Espero que tus cordinates estén entre -1 y +1. Te sugiero que trabajes con iluminación con primitivos simples. el trabajo con tu generación de superficie. La posición de la fuente de iluminación y el cálculo de las normales son los puntos más importantes.

http://www.falloutsoftware.com/tutorials/gl/gl8.htm

http://glprogramming.com/red/chapter05.html

+1

No sé por qué las coordenadas deberían estar en [-1,1], a menos que se refiera a las normales, que en realidad no están allí. –

+0

los parámetros de iluminación parecen entre -1 y +1 y si el mapeo es de mayor valor, no podrá ver los efectos. eso es lo que estaba confirmando – sarat

+0

¿Qué parámetros de iluminación están en [-1,1]? Espero que no se refiera a los colores, que no tienen nada que ver con las coordenadas (y están en [0,1], de todos modos). Y la posición de la luz (el único "parámetro de iluminación" relacionado con las coordenadas) es (0, -150, -150). –