https://foro.gambas-es.org/viewtopic.php?f=1&t=5040&p=29611#p29611
-----------------------------------
tercoIDE
Miercoles, 13 Enero 2016, 23:52

Re: OpenGL. Tutoriales
-----------------------------------
Leecion 5: Iluminacion de la escena

Notese que dos figuras se iluminan hacia atras y las otras dos hacia adelante. Esto se establece con la normal 

gl.Normal3f()


[code linenumbers=false syntax=gambas]' Gambas class file

Public anguloX As Float
Public anguloY As Float


Public mouDownX As Float
Public mouDownY As Float


Public Listas As Integer


Public Sub Form_Open()

 Debug "open"
End

Public Sub Form_Resize()

  
gl.Viewport(0, 0, GLArea1.w, GLArea1.h)  'esto le dice a GL adonde debe dibujar
gl.LoadIdentity    'esto pone todas las transformaciones del dibujo al inicio 
gl.Scalef(0.5, 0.5, 0.5)   'esto achica los dibujos, si pones 0.01, tus coordenadas iran de -100 a 100

Debug "resizada"

End

Public Sub Form_Activate()

 GenerarListas 'para generar cualquier lista, tiene que estar el contexto de la ventana activo
 
 'Leccion 5: Iluminacion
 
 gl.Lightfv(gl.LIGHT0, gl.AMBIENT_AND_DIFFUSE, [5, 10, 5])
 'ligth0 es el numero de luz, que puede ser 0-9
 ' ambient and diffuse es el tipo de luz que estoy asignando a Ligth0
 ' 5,10,5 son las coordenadas
 ' O sea: colocar una luz ambiente y difusa en (5,10,5) y llamarla Ligth0
 
 
 gl.Enable(gl.LIGHTING) 'prendemos las luces!
 gl.Enable(gl.LIGHT0) 'prendemos la luz 0!
 
 
 
 
End





Public Sub GLArea1_Draw()
  
  
  gl.ClearColor(0, 0.5, 0, 1) 'elijo el color con el que voy a borrar la pantalla, en vez de 0-255, aqui los colores van de 0.0-1.0
                              ' el formato es R-G-B-Alpha
  gl.Clear(gl.COLOR_BUFFER_BIT Or gl.DEPTH_BUFFER_BIT) 'ahora borro la pantalla y el buffer de profundidad (los Z)
  
  
  gl.Enable(gl.DEPTH_TEST)  ' queremos que lo que esta atras quede oculto por lo que esta adelante


  
  gl.CallList(listas) 'dibujo lo que genere antes
 
 
 

End

Private Sub GenerarListas() 
 
  'Leccion 4: Listas de dibujos
  
  '            en lugar de dibujar todo cada vez que se ejecura Draw, hago que OpenGL guarde una lista de cosas a dibujar
  '            luego solo cambio las rotaciones y llamo a la lista de dibujos
  
  
 listas = gl.GenLists(1)  'genero el ID para 1 listas de dibujos, si ponia nListas en vez de 1 los ID eran lista+1 , lista+2...lista+n 

 If Not gl.IsList(listas) Then
   
   Message("No puedo crear las listas")
   Me.Close
   
 Endif
 

 gl.NewList(listas, gl.COMPILE) 'empiezo una lista de tareas
 
  gl.ShadeModel(gl.FLAT)
  
  gl.Begin(gl.TRIANGLES)  'dibujamos triangulos hasta nuevo aviso
  
   'establecemos el color hasta nuevo aviso
  gl.Materialfv(gl.FRONT_AND_BACK, gl.AMBIENT_AND_DIFFUSE, [1, 0, 0, 0]) 
  
  ' esto quiere decir que cuando al los elementos siguientes los ilumine una luz ambiente y difusa, 
  ' su color sera [red, green, blue, alpha]
  
  gl.Normal3f(0, 0, 1) 'este es el vector normal triengulo siguiente, la luz rebota segun esta normal al plano
  
  gl.Vertex3f(0, 0, 0) 'el punto 0,0 no esta en arriba a la izquierda, para openGL esta en el medio!!!
  gl.Vertex3f(1, 0, 0) ' 1 no es pixels, las coordenadas van de -1 a 1 , o sea, para eje X, 1 de openGL es GLArea1.width/2
  gl.Vertex3f(0, 1, 0) ' idem para la coordenada Y
  
  
  gl.Materialfv(gl.FRONT_AND_BACK, gl.AMBIENT_AND_DIFFUSE, [0, 1, 0, 0])
  
  gl.Normal3f(0, 0, -1) 'este es el vector normal al triangulo siguiente
  
  gl.Vertex3f(0, 0, 0) 
  gl.Vertex3f(-1, 0, 0) 
  gl.Vertex3f(0, -1, 0)
  
  
  gl.End  'esto es similar al Paint, todo se encierra entre Begin-End
  
  
  gl.Begin(gl.QUADS)
  

  gl.Materialfv(gl.FRONT_AND_BACK, gl.AMBIENT_AND_DIFFUSE, [0, 0, 1, 0])
  
  gl.Normal3f(0, 0, -1) 'este es el vector normal al cuadrado siguiente
  
  gl.Vertex3f(-0.5, -0.5, 0.5)
  gl.Vertex3f(-0.5, 0.5, 0.5)   ' cambie de 2f (o sea 2 floats) a 3f
  gl.Vertex3f(0.5, 0.5, 0.5)    ' con 2f, la coordenada z (profundidad) era 0, ahora la escribo
  gl.Vertex3f(0.5, -0.5, 0.5)    ' por si no se dieron cuenta 2i equivale a 2 integers, o sea el argumento de la funcion se toma entero
  
  gl.Materialfv(gl.FRONT_AND_BACK, gl.AMBIENT_AND_DIFFUSE, [0, 0.5, 0.5, 0])
  gl.Normal3f(0, 0, 1) 'este es el vector normal al cuadrado siguiente
  
  gl.Vertex3f(-0.5, -0.5, -0.5)
  gl.Vertex3f(-0.5, 0.5, -0.5)
  gl.Vertex3f(0.5, 0.5, -0.5)     ' un verde mas claro, en otra profundidad
  gl.Vertex3f(0.5, -0.5, -0.5)
  
  gl.End
  
  gl.EndList
  
  

End


Public Sub GLArea1_MouseMove()
  
  
  If Mouse.Left Then
    anguloY = (Mouse.X - mouDownX) * 0.01
    anguloX = (Mouse.y - mouDownY) * 0.01

    gl.Rotatef(- anguloX, 1, 0, 0) ' rotamos los dibujos 30 grados alrededor de un vector que va del 0,0,0 al 1,0.5,0
    gl.Rotatef(- anguloY, 0, 1, 0) ' rotamos los dibujos 30 grados alrededor de un vector que va del 0,0,0 al 1,0.5,0
    
    GLArea1.Refresh
  
  Endif
  
 End
 
 Public Sub GLArea1_MouseDown()

    mouDownX = Mouse.X
    mouDownY = Mouse.y
  End
  [/code]


