mercoledì 2 febbraio 2011

OpenGL SecondProject - Texture!

Ieri ho sentito la necessità di conoscere gli FPS dell'applicazione che sta nascendo, così ho aggiunto un semplice contatore di FPS (semplicemente contando il tempo che passa tra un ciclo e l'altro e dividere "1 secondo" per quel tempo, niente medie o cose simili per ora). Unico problema: come visualizzare gli FPS? Stampandoli sullo schermo, sì, ok, ma OpenGL e SDL non ci sanno alcun supporto per la stampa di testo (GLUT ha qualcosa di essenziale, ma lavorando per un gioco non si può usare GLUT :D ), quindi bisogna provvedere da sè o trovare qualche libreria. Qualche libreria c'è, come google vi potrà mostrare, ma questa volta ho preferito fare da solo. Ho ricevuto un grande aiuto dal codice di Lugaru, dal quale ho preso l'idea di usare le liste di OpenGL (praticamente una serie di azioni memorizzata e associata ad un Id, richiamabile a necessità) e una texture per i caratteri (praticamente tutto il necessario :D).
Oh, guarda! "Texture"! Bisogna aggiungere il caricamento delle texture! FreeImage, la conoscete? È una famosa libreria che permette di leggere e scrivere immagini in tantissimi formati rilasciata con due licenze: GNU GPL e FIPL. La seconda è quella che mi interessa: ne permette l'uso a fini commerciali.
Per riuscire a caricare correttamente le immagini ho perso un sacco di tempo. Per memorizzare delle texture con OpenGL serve un array contenente i dati di tutti i pixel, in questo caso texel. Per capire come ottenere il suddetto array ci ho messo un po'; la luce mi è stata portata da questo tutorial. inizialmente ho usato il wrapper a oggetti FreeImagePlus, ma seguendo il tutorial, che non ne fa uso, ho capito come usare la libreria classica e lo ho abbandonato.
Per i primi test ho fatto un'immagine con GIMP e la penna del mio TabletPC alla veloce, quindi alcuni caratteri escono un po' dal loro riquadro e fanno capolino in quello di qualcun altro (vedi lo spazio); inoltre sono a risoluzione molto bassa. Ho scoperto che posso usare l'UbuntuFont e credo che farò una texture con quello, dato che lo trovo fantastico. Ora i due quadrati hanno una texture!

Quello grande ha una texture rettangolare (scelta rettangolare per vedere come si comportava): una foto che ho fatto ad un concerto degli Ulver.

quadrato grande: foto dal concerto degli Ulver - the rest is silence

Quello piccolo porta su di sé la texture del font.

quadrato piccolo: texture del font

Ho aggiunto il test sullo Z-buffer e sull'alpha per poter "non-vedere" correttamente gli oggetti coperti da altri e per avere la trasparenza con la texture del font. Una delle cose che ho aggiunto ha portato un bug, che è lo stesso che ho in Minecraft, e per questo credo potrebbe essere causato dalla mia scheda grafica: da certi poligoni partono triangoli con un vertice al punto di fuga. Credo accada solo con poligoni senza texture. Vedrò di indagare.

bug dei triangoli al punto di fuga

Ho fatto anche qualche ricerca sulle proporzioni del campo visivo umano, per avere una visione il più possibile completa e realistica, e ho scoperto che abbiano all'incirca un'apertura orizzontale di 160º e verticale di 120º, il che vuol dire 4/3. Sconvolgente eh? E i 16/9? non dovrebbero essere le proporzioni che più si avvicinano a quelle della nostra visuale? Beh, tutti quei gradi comprendono tutto quello che vediamo, ma se consideriamo la zona ad alta risoluzione ecco che i 4/3 scompaiono e compare una zona ellissoidale, più simile ai 16/9, anche se la zona con massima risoluzione è in realtà di circa 2º (º-º poco, no?). Pero ora le immagini che vedete sono 640*480(4/3) e con un FOV orizzontale di 120º. Avrò tempo per riflettere su questi aspetti.
Non ho postato codice, ma se avete dubbi o curiosità, anche non relative al codice, non esitate a commentare e chiedere!

Nessun commento:

Posta un commento

Related Posts Plugin for WordPress, Blogger...