__?! DirectX ou OpenGL ?!__

Généralités sur la programmation 3D

Vous préférez DirectX ou OpenGL ?

DirectX
4
19%
OpenGL
9
43%
Je ne sais pas !
8
38%
 
Nombre total de votes : 21

Buckethead
Messages : 122
Inscription : jeu. 27/sept./2007 20:25

Message par Buckethead »

Peut tu m'expliquer un peu le truc et pourquoi ca marche ?
Admettons que l'on soit en 800*600 et que l'on capture l'écran pour en faire une texture.
Comment cette routine fait pour qu'au final la texture soit un carré et non un bloc 800*600.
Je n'ai pas bien étudié l'intruction glViewport, juste quelques tests.

Autrement je viens de comprendre que pour un effet (fake) blur on pouvait aussi strecher l'image avant (je ne sais pas le faire, gluScaleImage()) , 800*600 -> 600*600 puis texturer son quad qui va épouser l'écran à chacun de ses coins. La perte est relativement minime, en tout cas on n'y voit que du feu pour le blur.
Il y a une méthode avec glViewport est-ce que tu me montres?
J'essayerais demain ;)
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

Re: __?! DirectX ou OpenGL ?!__

Message par beauregard »

openGL a toujours eu ma préférence, car plus, heu, rationnel et logique( et pas sous influence crosoft)
Mytic a écrit :Bonjour…
Je suis entrain de développer un FPS multi joueur en ligne
un projet dès plus impressionant ! vu ton niveau, en perseverant tu y arrivera sans l'ombre d'un doute!
un autre sondage:
http://www.purebasic.fr/french/viewtopic.php?t=7365
Anonyme

Message par Anonyme »

Buckethead a écrit :Peut tu m'expliquer un peu le truc et pourquoi ca marche ?
Admettons que l'on soit en 800*600 et que l'on capture l'écran pour en faire une texture.
Comment cette routine fait pour qu'au final la texture soit un carré et non un bloc 800*600.
Je n'ai pas bien étudié l'intruction glViewport, juste quelques tests.

Autrement je viens de comprendre que pour un effet (fake) blur on pouvait aussi strecher l'image avant (je ne sais pas le faire, gluScaleImage()) , 800*600 -> 600*600 puis texturer son quad qui va épouser l'écran à chacun de ses coins. La perte est relativement minime, en tout cas on n'y voit que du feu pour le blur.
Il y a une méthode avec glViewport est-ce que tu me montres?
J'essayerais demain ;)

C'est très simple ,

glViewport(0,0,TextureWidth,TextureHeight);
cette commande te permet de spécifié la taille du rendu.

glOrtho(0,TextureWidth,TextureHeight, 0, -1, 1); Généralement , tu utilises cette fonction avec les coordonées de l'écran.
Admettons que ta résolution réelle est de 1024x768 et que tu as passé à cette fonction une taille de 640x480 et que tu affiches un pixel en 320x240 , ce pixel se trouve ou ?
Sachant que tu es en 1024x768 et que tu affiches un pixel en 320x240... eh ben il s'affichera au milieu de l'ecran. Car tu as défini la vue Ortho en 640x480 , même si ta résolution réelle est de 1024x768... tu me suis ? :D

Donc , récapitulons :

tu créer un quad vierge puis :

Code : Tout sélectionner

glViewport(0,0,TextureWidth,TextureHeight);
glOrtho(0,TextureWidth,TextureHeight, 0, -1, 1); 

// RENDU DE TA SCENE

glBindTexture(GL_TEXTURE_2D,TextureID);
glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0,TextureWidth, TextureHeight, 0);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glViewport(0,0,ScreenW,ScreenH);


//RENDU DE TON QUAD
Tache d'avoir une texture vierge en n² 32x32 64x64 128x128 512x512 etc... sur certainent carte sa passe pas sinon.
Anonyme

Message par Anonyme »

Tiens voici un cube qui se fait un rendu sur lui même :
je te laisse faire la convertion SDL->Win32 :lol:



Code : Tout sélectionner

IncludeFile "OpenGL.pbi"

Global ScreenSDL


Declare DrawCube(Size.f,ID.l)
Declare SDL_OPENGL_INIT(W,H,D)


Procedure DrawCube(Size.f,ID.l)

glBindTexture_(#GL_TEXTURE_2D,ID)
glBegin_(#GL_QUADS)
glColor4f_(1,1,1,1)

          glNormal3d_(-1.0,0.0,0.0) ;face gauche
          glTexCoord2d_(0,1) : glVertex3d_(-Size,Size,Size)
          glTexCoord2d_(0,0) : glVertex3d_(-Size,Size,-Size)
          glTexCoord2d_(1,0) : glVertex3d_(-Size,-Size,-Size)
          glTexCoord2d_(1,1) : glVertex3d_(-Size,-Size,Size)
          
          glNormal3d_(0.0,1.0,0.0) ;face haut
          glTexCoord2d_(0,1) : glVertex3d_(-Size,Size,Size)
          glTexCoord2d_(0,0) : glVertex3d_(Size,Size,Size)
          glTexCoord2d_(1,0) : glVertex3d_(Size,Size,-Size)
          glTexCoord2d_(1,1) : glVertex3d_(-Size,Size,-Size)
          
          glNormal3d_(0.0,-1.0,0.0) ;face bas
          glTexCoord2d_(0,1) : glVertex3d_(-Size,-Size,Size)
          glTexCoord2d_(0,0) : glVertex3d_(-Size,-Size,-Size)
          glTexCoord2d_(1,0) : glVertex3d_(Size,-Size,-Size)
          glTexCoord2d_(1,1) : glVertex3d_(Size,-Size,Size)
          
          glNormal3d_(0.0,0.0,-1.0) ;face arriere
          glTexCoord2d_(0,1) : glVertex3d_(Size,Size,-Size)
          glTexCoord2d_(0,0) : glVertex3d_(Size,-Size,-Size)
          glTexCoord2d_(1,0) : glVertex3d_(-Size,-Size,-Size)
          glTexCoord2d_(1,1) : glVertex3d_(-Size,Size,-Size)
          
          glNormal3d_(1.0,0.0,0.0) ;face gauche
          glTexCoord2d_(0,1) : glVertex3d_(Size,Size,Size)
          glTexCoord2d_(0,0) : glVertex3d_(Size,-Size,Size)
          glTexCoord2d_(1,0) : glVertex3d_(Size,-Size,-Size)
          glTexCoord2d_(1,1) : glVertex3d_(Size,Size,-Size)
          
          glNormal3d_(0.0,0.0,1.0) ; Face avant
          glTexCoord2d_(0,1) : glVertex3d_(-Size,Size,Size)
          glTexCoord2d_(0,0) : glVertex3d_(-Size,-Size,Size)
          glTexCoord2d_(1,0) : glVertex3d_(Size,-Size,Size)
          glTexCoord2d_(1,1) : glVertex3d_(Size,Size,Size)
glEnd_() 

EndProcedure







Procedure SDL_OPENGL_INIT(W,H,D)

SDL_Init_(#SDL_INIT_VIDEO)
ScreenSDL = SDL_SetVideoMode_(W,H,D, #SDL_OPENGL)

If ScreenSDL=0
 PrintN("Error when initialize SDL")
EndIf 
 
 
glMatrixMode_(#GL_PROJECTION)
gluPerspective_(90,W/H,1,5000)

glMatrixMode_(#GL_MODELVIEW)
glEnable_(#GL_TEXTURE_2D)
glHint_(#GL_PERSPECTIVE_CORRECTION_HINT,#GL_NICEST) 
glEnable_(#GL_DEPTH_TEST) 
glEnable_(#GL_CULL_FACE) 
glEnable_(#GL_LIGHTING)
glEnable_(#GL_LIGHT0)
glHint_ (#GL_FOG_HINT, #GL_NICEST); 


 
 
EndProcedure






SDL_OPENGL_INIT(800,600,32)


TEXTURE_SIZE = 64
Global TextureID.l


    glGenTextures_(1,@TextureID)
    glBindTexture_(#GL_TEXTURE_2D,@TextureID);
    glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MAG_FILTER, #GL_NEAREST);
    glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MIN_FILTER, #GL_NEAREST);
   





Repeat


    While SDL_PollEvent_(@Event.SDL_Event)
      Select Event\Type
      	Case #SDL_QUIT  
          Quit = 1
      	Case #SDL_KEYDOWN
  ;        Debug "Key: "+Str(Event\key\keysym\sym)
	          If Event\key\keysym\sym = #SDLK_ESCAPE
            Quit = 1
          EndIf
	      Case #SDL_MOUSEMOTION
	       ; Debug "x:"+Str(Event\motion\x) + " y:" +Str(Event\motion\y)
      EndSelect	
    Wend
    
    glClearColor_(1,1,1,1)
    glClear_(#GL_DEPTH_BUFFER_BIT | #GL_COLOR_BUFFER_BIT ) 
        
    angle.f + 0.1
      
    glLoadIdentity_( )
    gluLookAt_(90,0,0,0,0,0,0,1,0)              
    
    
   
    
    ; ***************************************************
    ; DESSINE LA SCENE DANS TEXTUREID
    ; ***************************************************
    
     glViewport_(0,0,TEXTURE_SIZE,TEXTURE_SIZE)

       ANGLE.f+0.1

        glPushMatrix_()
      
          glTranslatef_(-50,0,0)
          glRotated_(ANGLE,1.0,1.0,1.0)
          DrawCube(50,@TextureID)
          
         glPopMatrix_()
         
     glCopyTexImage2D_(#GL_TEXTURE_2D, 0, #GL_RGBA, 0, 0,TEXTURE_SIZE, TEXTURE_SIZE, 0)
     glClearColor_(0, 0, 1, 0)
     glClear_(#GL_COLOR_BUFFER_BIT | #GL_DEPTH_BUFFER_BIT)
     glViewport_(0,0,800,600);



      glPushMatrix_()
          glTranslatef_(-100,0,0)
          glRotated_(ANGLE,1.0,1.0,1.0)
          DrawCube(50,@TextureID)
      glPopMatrix_()
 
    
    SDL_GL_SwapBuffers_()
    
    
    Until Quit = 1
    
    SDL_Quit_()  
Le principe est le même pour un Quad.

@++ :wink:
Buckethead
Messages : 122
Inscription : jeu. 27/sept./2007 20:25

Message par Buckethead »

Merci Cpl.Bator ! Je vais regarder ça, décidement en ce moment je suis plus bon à manger et boire qu'à faire du Basic ;P

Dans l'exemple du cube, sans avoir lancé PB je comprend ce qui doit se passer avec le glViewport qui doit retrecir le truc en petit carré, et hop on re-glViewport à la taille initiale. Ca me semble être la routine qui me fallait. C'est du tout bon, merci !
A prioris il ne devrait y avoir moins de problemes avec ATI avec cette routine. C'est plus simple avec une Nvidia :)

Pour Glortho j'avais déjà abordé, c'est vraiment essentiel si on veut travailler au pixel. Pour l'instant je me suis contenté de quads texturés en transparence pour faire un fake "radial blur" avec GLortho. Comme tu es sous nunux, c'est même pas la peine que je te montre, mon truc fonctionne déjà mal sous vista ;\
tmyke
Messages : 1554
Inscription : lun. 24/juil./2006 6:44
Localisation : vosges (France) 47°54'39.06"N 6°20'06.39"E

Message par tmyke »

J'arrive un peu tard, mais quel sujet interessant que ce topic (domage que j'étais en vacances) .
Et comme le dit si bien mon comparse et complice Seyhajin, pour une fois que cela ne part
pas en troll...

D'ailleurs Seyhajin a très bien résumé globalement la chose.

On se rend compte que dans le monde de la prog 3D amateur, OpenGL remporte très largement les
suffrages, même si c'est parfois pour des raisons obscures ( parfois uniquement parce que DX est
du Microsoft, donc c'est forcement pas bon), meme si au départ pour débuter OGL parait en effet
plus abordable.
Je me fais donc régulièrement le modeste défenseur de DirectX (du moins j'essais), uniquement parce
que j'aime bien quand les choses justes soient dites, et que pour les débutants ne partent pas sur de
vil commentaires très partiaux qui n'ont souvent rien avoir avec la realités des choses.

@Mytic: Je pense en effet que si tu veux de mettre à la 3D à travers PB, OpenGL semble etre un bon
choix pour le moment ;)
Dernière modification par tmyke le sam. 29/déc./2007 19:11, modifié 1 fois.
Force et sagesse...
Anonyme

Message par Anonyme »

OpenGL peut être difficile aussi , c'est sur, afficher un cube , un mesh , un terrain , ca va... mais dès que tu attaques les stencils buffers , les shaders & co , c'est pas pareil. :D
D'ailleurs , a se sujet tmyke, qu'en est il des sources de Dm3D ?
Pense tu qu'il sera difficille d'ajouté une couche ogl dessus ?
tmyke
Messages : 1554
Inscription : lun. 24/juil./2006 6:44
Localisation : vosges (France) 47°54'39.06"N 6°20'06.39"E

Message par tmyke »

Tu me coupe l'herbe sous le pieds ;) J'allais faire un petit post pour en parler dans la section DM3D.

La version 4 est dispo depuis quelques temps sur le site de DM3D, avec le code source du
moteur. Pour l'instant, le transfert vers OGL du code ne doit pas etre simple en l'état actuel des
choses. Mais rien n'est impossible, et en bossant un peu cela sera certainement
realisable. Notre Roadmap est de terminer DM3Dv4, en y ajoutant les composants qui manquent
toujours (comme les animations modernes, les ombres), et en suite nous remprendront
le moteur pour le préparer au multi API (DX9-DX10-OGL). Mais au rythme ou l'on va
cela ne sera certainement pas avant mi 2008 voir meme fin 2008.

:)
Force et sagesse...
Anonyme

Message par Anonyme »

très bien , fait moi signe dès que tu te lançe dans le multi api, car multi api , multi os :D
tmyke
Messages : 1554
Inscription : lun. 24/juil./2006 6:44
Localisation : vosges (France) 47°54'39.06"N 6°20'06.39"E

Message par tmyke »

Ohhhhhh, ne t'en fait pas, car un petit coups de main pour OGL et surtout pour la partie lié à Nunux...
;)

(t'as encore 6 mois pour devenir une bête en OGL :D )
Force et sagesse...
Répondre