Thursday, January 24, 2008

A spasso per lo spazio...

Ho appena terminato lo sviluppo della parte che si occupa di disegnare (correttamente) più di un oggetto, quindi finalmente ho l'occasione di mettere tutti gli "attori" che vi ho fatto vedere nei giorni scorsi.
Così ecco sullo schermo il sole, giove, la terra, la luna, e una piccola astronave.
L'algoritmo di ordinamento pare comportarsi davvero bene, ed i problemi del depth buffer speriamo siano chiusi una volta per tutte.
Quindi ne approfitto per farvi vedere un filmato di quel che ho per ora tra le mani.
Purtroppo ho dovuto usare fraps non registrato per creare il video, e i 600 fps che ho nella realtà son scesi a 30 per via della versione demo (no, quasi 40 dollari per catturare lo schermo non glie li do, mi dispiace), quindi la scena non è fluida, quindi vi chiedo un atto di fede :)
Ad ogni modo vuole solo essere un breve filmato che riassume quel che vi ho raccontato in questa settimana.

2 comments:

Anonymous said...

Aggiungi winmm.lib e vfw32.lib al progetto.

All'inizio del programma fai
AviFileInit();

// Create a stream using AVIFileCreateStream.
hr = AVIFileCreateStream(pf, &psSmall, &strhdr);
if (hr != 0) { //Stream created OK? If not, close file.
AVIFileRelease(pf);
return;
}

// Set format of new stream using AVIStreamSetFormat.
hr = AVIStreamSetFormat(psSmall, 0, &biNew, sizeof(biNew));
if (hr != 0) {
AVIStreamRelease(psSmall);
AVIFileRelease(pf);
return;
}

// Allocate memory for the bitmaps.
lpNew = GlobalAllocPtr(GMEM_MOVEABLE, biNew.biSizeImage);




Poi, alla fine della funzione di rendering:
// Recuperi la bitmap che e' visualizzata al momento sullo schermo e la scrivi in lpNew buffer.

// Save the compressed data using AVIStreamWrite.
hr = AVIStreamWrite(psSmall, lStreamSize, 1, lpNew,
biNew.biSizeImage, AVIIF_KEYFRAME, NULL, NULL);
}

// Close the stream and file.
AVIStreamRelease(psSmall);
AVIFileRelease(pf);
}



Per recuperare la bitmap adesso non ricordo tutto, cmq questo codice dovrebbe funzionare:

memdc.CreateCompatibleDC(pDC); //Make Compatible DC for memdc

bmp.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());
//Create Compatible DDB
pOldBmp=memdc.SelectObject(&bmp);
memdc.BitBlt(0,0,rect.Width(),rect.Height(),pDC,0,0,SRCCOPY);


C'e' un flag da impostare su DX9 per poter accedere al DC di una finestra, ma ora mi sfugge.


Cmq, mettendo insieme i pezzi ti puoi fare il tuo "registratore video" assolutamente gratuito.
Ovviamente le prestazioni della scheda video ne risentiranno, ma almeno non avrai il limite di Fraps.
Altra cosa...non ti serve a niente catturare un AVI a piu' di 30 FPS....

PdG said...

grazie, molto interessante.
In effetti il problema di fraps sono i 30 secondi piu' che i 30 fps.
Gli "scatti" che si vedono a video dipendono piu' che altro dal fatto che il mouse e' troppo sensibile ancora.
Ruotando, chiaramente, gli oggetti lontani si muovono molto piu' velocemente di quelli vicini, e un pianeta e' cosi' lontano che basta una variazione di pochi gradi per vederlo schizzare.
Un domani divento senior magari potrei anche implementare un blur per rendere i movimenti meno irreali, ma non voglio correre troppo :)

Ah, una cosa che voglio fare e' implementare un lens flare per il sole, ad ogni modo e' ancora prematuro, si tratta di abbellimenti puramente grafici, prima e' piu' urgente occuparsi del gioco vero e proprio, poi in caso provvedero' a rendere il tutto piu' carino, con atmosfere nei pianeti, lens flares, fondali ecc.