Luce in OpenGL
Ciao a tutti!!!
Qualcuno mi sa dire quando bisogna utilizzare i vettori normali della luce in OpenGL (Linux)?
Mi spiego, sulle mie slide c'è scritto: "Se si vogliono utilizzare sorgenti di luce, è necessario indicare con quale angolo la luce
incide sulla superficie illuminata, cioè bisogna specificare le normali per ogni vertice del poligono".
Però ho trovato vari esempi in cui ci sono sorgenti di luce ma non si utilizzano le normali.
Grazie dell'attenzione
Qualcuno mi sa dire quando bisogna utilizzare i vettori normali della luce in OpenGL (Linux)?
Mi spiego, sulle mie slide c'è scritto: "Se si vogliono utilizzare sorgenti di luce, è necessario indicare con quale angolo la luce
incide sulla superficie illuminata, cioè bisogna specificare le normali per ogni vertice del poligono".
Però ho trovato vari esempi in cui ci sono sorgenti di luce ma non si utilizzano le normali.
Grazie dell'attenzione
Risposte
Se si desidera "illuminare" un qualche oggetto in una scena 3D (non sono in OpenGL) è necessario specificare opportunamente le sorgenti luminose e le normali. Queste normali non sono necessariamente associate però ad ogni vertice (si potrebbero usare texture per passare le rette normali ad esempio) oppure si potrebbero avere mesh con una particolare geometria che permetta il calcolo di queste normali in un qualche shader. Nel tuo caso probabilmente la risposta è che devi SEMPRE passare dei vettori normali come descritto sulle slide.
Ma di quali esempi stai parlando?
Ma di quali esempi stai parlando?
"apatriarca":
Ma di quali esempi stai parlando?
Ho vari esercizi, svolti dal professore, che funzionano (compilano ed eseguono correttamente) dove ci sono fonti luminose ma non è stato fatto il calcolo delle normali. Per questo chiedevo quando bisogna usarle
Come viene disegnata in quel caso la scena?
"apatriarca":
Come viene disegnata in quel caso la scena?
Viene disegnato tutto normalmente con le matrici e le solite primitive ma non ci sono le normali...
Beh magari per sicurezza io le userò. Intanto ti chiedo un'altra cosa

Di quali 'primitive' stai parlando? Se non definisci i vertici uno per volta è possibile che la chiamata alla funzione setti già le normali.. In ogni caso credo potrei darti maggiori dettagli se postassi un pezzo di codice.
Che cosa intendi con 'scelgo una prospettiva'? Normalmente i parametri sono definiti dall'effett cevuoi ottenere. Prova a disegnare su un foglio la scena e la piramide tronca definita dai tuoi parametri se vuoi disegnare tutta la scena
Che cosa intendi con 'scelgo una prospettiva'? Normalmente i parametri sono definiti dall'effett cevuoi ottenere. Prova a disegnare su un foglio la scena e la piramide tronca definita dai tuoi parametri se vuoi disegnare tutta la scena
Ecco un esempio: la consegna dice "...Si disegnerà la scena usando una proiezione prospettica da un punto di vista che consenta la visualizzazione di tutta la scena".
void reshape(int w, int h)
{
// Prevent a divide by zero
if(h == 0)
h = 1;
// Set Viewport to window dimensions
glViewport(0, 0, w, h);
// Calculate aspect ratio of the window
float fAspect = (GLfloat)w/(GLfloat)h;
// Set the perspective coordinate system
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(90.0, fAspect, 1.0, 500.0);
glMatrixMode (GL_MODELVIEW);
glLoadIdentity ();
}
(La funzione l'ho capita, solo non capisco come fa lui a sapere che bisogna utilizzare quei parametri in questa riga gluPerspective(90.0, fAspect, 1.0, 500.0) per fare in modo che la scena possa essere interamente visualizzata, cioè io sparerei a caso, andrei a tentativi finchè la scena non si vede tutta).
void reshape(int w, int h)
{
// Prevent a divide by zero
if(h == 0)
h = 1;
// Set Viewport to window dimensions
glViewport(0, 0, w, h);
// Calculate aspect ratio of the window
float fAspect = (GLfloat)w/(GLfloat)h;
// Set the perspective coordinate system
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(90.0, fAspect, 1.0, 500.0);
glMatrixMode (GL_MODELVIEW);
glLoadIdentity ();
}
(La funzione l'ho capita, solo non capisco come fa lui a sapere che bisogna utilizzare quei parametri in questa riga gluPerspective(90.0, fAspect, 1.0, 500.0) per fare in modo che la scena possa essere interamente visualizzata, cioè io sparerei a caso, andrei a tentativi finchè la scena non si vede tutta).
In realtà normalmente non si agisce più di tanto sui parametri di quella funzione. L'aspect ratio è infatti definito dalle dimensioni della finestra, il field of view si sceglie normalmente in base a parametri più o meno indipendenti dalla scena. In generale si sceglie questo parametro in base alla dimensione reale della finestra e dalla distanza con cui l'utente vede la scena. Si cerca insomma di simulare il field of view reale dell'utente che osserva la scena. Ma normalmente si sceglie una costante fissa (come 90.0 nel tuo esempio). Rimangono infine near e far, ma sono secondari rispetto alla difficoltà di settare correttamente la scena. Se questi valori sono sufficientemente lontani puoi praticamente fregartene dei loro effettivi valori (a patto di non spostare la telecamera troppo vicino o lontano dalla scena). La posizione della "camera" è in generale una scelta molto più importante.