Note
Struttura
A Steroid V0.4s e V0.5
Paolo Cignoni
cignoni@iei.pi.cnr.it
http://vcg.iei.pi.cnr.it/~cignoni
5 dicembre 2001
Versione 0.4s
Esercizi proposti
Esplosioni con frammenti
Stars
Better intro
Nuova Intro
Perspective View and flying asteroids
Geometria della scena
Creare la scritta
Usando font3d occorre fare attenzione a
NON CREARE TROPPI TRIANGOLI
max 2000
Se ne genera troppi modificare i vari parametri di font3d per ottimizzare la creazione della scritta (no bevel e minore resolution)
Settare la vista
Nella GameIntro::Reshape()
gluPerspective(fov,a,near,far);
dove
fov è l’apertura dell’angolo di vista nel nostro esempio 90 gradi (un grandangolo)
a è l’aspect ratio della camera
near e far indicano la distanza dei due piani perpendicolari al viewer entro cui è racchiusa la scena.
gluLookAt(xv,yv,zv, xt,yt,zt, upx,upy,upz);
dove
xv,yv,zv posizione dell’osservatore (0,0,200)
xt,yt,zt, posizione del punto dove si guarda (0,0,0)
upx,upy,upz direzione dell’alto (0,1,0)
Optimization
View Frustum Clipping
inutile disegnare quel che non si vede
In molti casi è facile capire che cosa è fuori dal view frustum
nel nostro caso quando un asteroide
200-z < abs(x)
A Steroid
Versione 0.5
Texture Mapping
Sound (preliminary)
Riorganizzazione Classi
GameSession figlia di GameSection
Nuova classe intro
Tutte le GlutCallback si rifanno alla variable globale che GameSection corrente
Passare dall’intro al gioco significa cambiare la GameSection corrente
variabili globali per tenere una gamesession e una gameintro
Texture Mapping
Colorare una primitiva (triangolo) secondo i colori di una bitmap
Aggiungere dettagli senza aumentare la complessità della geometria dei modelli
Coordinate di texture
Per specificare come si colora un triangolo si definiscono le coordinate di texture che indicano dove ritagliare la bitmap per colorare il triangolo
Coordinate Texture
Per ogni vertice si specifica quindi
Le sue coordinate 3d effettive:
glVertex3f(x,y,z)
e le corrispondenti coordinate di texure
glTexCoord2f(s,t)
Esempi
Ad ogni vertice del triangolo è assegnato un punto sulla texture
Esempio
Modificando le coordinate di texture cambia che cosa viene disegnato sul triangolo
Esempio
Modificando la matrice di trasformazione la texture rimane ferma sull’oggetto
Texture mapping in opengl
Caricare le texture
creare un nome
scegliere il nome di texture
caricare un immagine
Scegliere una texture corrente
specificare per ogni vertice le coordinate di texture
Caricare una texture
Ogni texture ha un nome con cui puo’ essere richiamata velocemente
glGenTextures(n,int *names)
crea n nomi di texture memorizzandoli in names[]
Per scegliere una texture
glBind(GL_TEXTURE2D, texturename)
Parametri Texture
glTexParameter permette di settare
GL_TEXTURE_MIN_FILTER
GL_TEXTURE_MAG_FILTER
GL_TEXTURE_WRAP_S
GL_TEXTURE_WRAP_T
Loading an image
void glTexImage2D(GL_TEXTURE_2D
GLint level, // the mipmap level
GLint components, // number of color component (1..4)
GLsizei width,    // must be 2^n
GLsizei height,   // must be 2^n
GLint border,     // width of border
GLenum format, // GL_RGB, GL_RGBA, GL_ALPHA ecc
GLenum type, // the data type of pixel (GL_BYTE, ecc)
const GLvoid *pixels // a pointer to the image.
);
Loading a Texture
Il problema maggiore è come caricare un’immagine:
Generarsi la texture da soli (facile per scacchiere e affini)
Scriversi un lettore per un formato di immagini molto semplice (.pbm)
Utilizzare una lib tipo glpng.
glPng
Libreria free che permette di caricare come texture un’immagine in formato png
#include <gl/glpng.h>
…
pngInfo info;
GLuint texture;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
pngLoad(filename, PNG_NOMIPMAP, PNG_SOLID, &info))
Utilizzare una texture
Scegliere una texture con
glBind()
specificare come si vuole utilizzare il colore della texture con
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
GL_MODULATE moltiplica il colore della texture per il colore dell’oggetto dopo lo shading (in questo modo la texture viene ombreggiata)
GL_DECAL il colore viene applicato esattamente.
disegnare specificando le coordinate di texture
Costruire una texture per l’astronave
Partire da un rendering
ortografico dell’astronave
Colorarlo a piacimento
con un qualunque bitmap
editor (paintshoppro, gimp)
Costruire una texture per l’astronave
Per specificare le coordinate di texture basta ricordarsi che la geometria dell’astronave era (dopo una Mesh::Normalize()) all’interno di un box unitario centrato sull origine.
glTexCoord2f(-x+.5,y+.5);
glVertex3f(x,y,z);
Esercizio 1 (*)
Textured Asteroids
Aggiungere una texture significativa agli asteroidi per rendere meno uniforme la superficie