*-----------------------------* | OpenGL 2D engine | *-----------------------------* Salut a tous !!!!! Donc, je vais tenter d'expliquer comment on a fait les vieux effets "olDsk00l" dans notre demo "Space delirium".... Le but n'étant pas ici d'expliquer les algos des effets mais plutôt comment les appliquer a une frame OpenGL !!! Bon, ca va etre court, mais ne me frappez pas hein !!!!! =)) Donc, on commence: 1. Petit Rappel : ----------------- a. Tous les bouts de code seront en C ( s'il y en a ! :) ) b. On suppose que tout le monde connait les functions (de base) OpenGl ex: --- glMatrixMode(); glVertex3f(); glTexCoord2d(); glBlend(); 2. Principe : ------------- Donc, on commence par déclarer un pointeur "void" qui sera notre "buffer" affichable à l'ecran. void *buffer; Ensuite, on commence à "stocker" le contenu pointé par notre "void *buffer" avec cette fontion magique : glTexSubImage2D (GL_TEXTURE_2D, 0, 0,0, 256, 256, GL_RGBA, GL_UNSIGNED_BYTE, buffer); donc, ce qu'on affiche à l'ecran c'est du 256*256*32 sachant qu'on peut enclencher le mipmapping en temp réel ! :) Ensuite, il faut faire un quad de la taille de l'ecran ki va permettre d'afficher notre buffer et nos effets Voici un p'tit bout de code qui montre l'ordre dans lequel il faut proceder : ( tout ce qui commence par * se trouve dans une de nos fonctions Effects2D::DrawBuffer(); ;) ) * * glBindTexture(GL_TEXTURE_2D, GLtexture[videoGLnum]); * glTexSubImage2D (GL_TEXTURE_2D, 0, 0,0, 256, 256, GL_RGBA, GL_UNSIGNED_BYTE, buffer); * glLoadIdentity(); // current matrix is MODEL_MATRIX * glColor4f( 1, 1, 1, alpha); // alpha est un parametre de DrawBuffer... * glEnable(GL_TEXTURE_2D); * glEnable(GL_BLEND); * glDepthMask( false ); * glBegin(GL_QUADS); * * // et c la k'on fait le quad !!!! * * bon, je vous explique pas comment on fait un quad avec les coordonnées UV hein.... =) * * * apres le quad, il vous faut rajouter ces quelques lignes : * * glEnd(); * glDepthMask( true ); * glDisable(GL_TEXTURE_2D); * * et voila !!!! :))))) alors, les acces au buffer : ---------------------------- pour mettre un point blanc au centre de l'ecran : void Point_au_centre_de_l_ecran() { unsigned char *buf = (unsigned char *)buffer; // si void *buffer est déclaré en global !!! :) unsigned char r,g,b,a; r = g = b = a = 255; int offset = x + y * 256; // (256*256+256) buf[(offset<<2) ] = r; // rouge buf[(offset<<2)+1] = g; // vert buf[(offset<<2)+2] = b; // bleu buf[(offset<<2)+3] = a; // alpha } donc, il faut d'abord dessiner sa scene et ensuite la fameuse DrawBuffer(); aller, voici comment on rend le buffer en additif :) void Effect2D::drawBufferAdd() { glBlendFunc(GL_ONE, GL_ONE); drawBuffer(1.0f); // drawBuffer(float alpha) vous la connaissez now, hein ! :) glBlendFunc(GL_SRC_ALPHA , GL_ONE_MINUS_SRC_ALPHA ); } voilou, voilou...... bon, ben si c'est pas assez clair, ou que vous avez pas aimé, voire meme aimé : stv@goyave.com PS: je n'ai pas le seul mérite pour ca, car Gozer y est pour beaucoup !!!! :) bon code à tous et merci à : - #demofr #codefr #traxfr #convivial - Impulse ke j'aime ! :) - Tex aussi ! :) - Allergy pour sa patience - pas TuO !!! pas bien lui !!! ( g compris les gars ! :) ) - Bouby - Still qui doit coder comme un fou en ce moment !!! :) et tous ceux qui nous ont mis un "Thumb up' sur pouët !!!! PS2: ( pas playstation hein !!! ) le code source de "Space Delirium est accessible sur simple demande" no PB ! :) g appris comme ca moi ! ( Thx Impulse ! :) ) a+ Stv / Syn[Rj]