Page 1 sur 2

OpenGl et cube

Publié : lun. 28/nov./2005 13:32
par Progi1984
Est ce moi ou j'ai un problème avec mon cube ?

Code : Tout sélectionner

; Triangle
;
;
; This is the second tutorial of pbgl.
; Here we learn how you can create, rotate, move and scale a triangle.
; ---
; First we create a window:

XIncludeFile "OpenGL1.pb" ;Includefile(see http://www.panicblue\xdn.de/pbgl/ link Links)

;Windowsettings
#WindowWidth = 500
#WindowHeight = 400
#WindowFlags = #PB_Window_TitleBar | #PB_Window_MaximizeGadget | #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered
Version = 2

Global hWnd.l,hDc
Declare CreateCube2()
Declare CreateCube(rot.f)

Procedure GL_Callback(WindowID, Message, wParam, lParam)
  Result = #PB_ProcessPureBasicEvents
  If Message = #WM_SIZE
    glViewport_(0, 0, WindowWidth(), WindowHeight())  ;Resize the OpenGLscene
    Result = 1
  EndIf
  ProcedureReturn Result
EndProcedure

;-Constantes
#Nb_vertex=2000
#Nb_polygones=2000
;-Structures
Structure TVertex
  x.f
  y.f
  z.f
EndStructure
Structure TPolygone
  ida.w
  idb.w
  idc.w
EndStructure
Structure TObjet
  Vertex.TVertex[#Nb_vertex]
  Polygone.TPolygone[#Nb_polygones]
EndStructure

Dim Objet.Tobjet(1000)

;-Tableaux


CreateCube2()
If OpenWindow(0, 0, 0, #WindowWidth, #WindowHeight, #WindowFlags, "PBGL - Tutorial "+Str(Version)) ;Fenster öffnen
  SetWindowCallback(@GL_Callback())
  hWnd = WindowID(0)  ;create a handle to the window
  pfd.PIXELFORMATDESCRIPTOR   ;start opengl
  hDC = GetDC_(hWnd)
  pfd\nSize        = SizeOf(PIXELFORMATDESCRIPTOR)
  pfd\nVersion     = 1
  pfd\dwFlags      = #PFD_SUPPORT_OPENGL | #PFD_DOUBLEBUFFER | #PFD_DRAW_TO_WINDOW
  pfd\iLayerType   = #PFD_MAIN_PLANE
  pfd\iPixelType   = #PFD_TYPE_RGBA
  ;pfd\idcColorBits   = 24  ;colorbuffer(24bit)
  ;pfd\idcDepthBits   = 32  ;depthbuffer
  pixformat = ChoosePixelFormat_(hDC, pfd)
  SetPixelFormat_(hDC, pixformat, pfd)
  hrc = wglCreateContext_(hDC)
  wglMakeCurrent_(hDC, hrc)
  SwapBuffers_(hDC) ;in purebasic you have to call this command once at the start.
  glClearColor_(0.0, 0.0, 1.0, 1.0) ;Backgroundcolor (Parameters: (1/255)*Red, (1/255)*Green, (1/255)*Blue, Alpha)
  Repeat
    glClear_(#GL_COLOR_BUFFER_BIT | #GL_DEPTH_BUFFER_BIT) ; Delete
    ;Here we can draw
    CreateCube(rot)
    SwapBuffers_(hDC) ;draw
    rot + 1
    Event = WindowEvent() ;We should use WindowEvent, because the Animation shouldn't stop
    Delay(5)
  Until Event = #PB_Event_CloseWindow
  End
EndIf

Procedure CreateGLWindow()

EndProcedure
Procedure CreateCube(rot.f)
  glLoadIdentity_() ;create a new Object
  glTranslatef_(0.0, -0.25, 0.0) ; move 0.25 up
  glRotatef_(rot,0.5, 0.5, 0.5) ;rotate around x, y and z
  glScalef_(0.75, 0.75, 0.75) ;scale with the scalefaktor 0.75
  glBegin_(#GL_TRIANGLES) ;start with the drawing(you can also create quadratics or polygons with #GL_QUADS, ...)
  For i=0 To 11
    glColor3f_(1.0,0.0,0.0)   
    glVertex3f_(objet(0)\vertex[objet(0)\polygone[i]\ida]\x, objet(0)\vertex[objet(0)\polygone[i]\ida]\y, objet(0)\vertex[objet(0)\polygone[i]\ida]\z)
    glColor3f_(0.0,1.0,0.0);
    glVertex3f_( objet(0)\vertex[objet(0)\polygone[i]\idb]\x, objet(0)\vertex[objet(0)\polygone[i]\idb]\y, objet(0)\vertex[objet(0)\polygone[i]\idb]\z)
    glColor3f_(0.0,0.0,1.0);
    glVertex3f_( objet(0)\vertex[objet(0)\polygone[i]\idc]\x, objet(0)\vertex[objet(0)\polygone[i]\idc]\y, objet(0)\vertex[objet(0)\polygone[i]\idc]\z)
  Next
  glEnd_()
EndProcedure
Procedure CreateCube2()
  Objet(0)\vertex[0]\x=0;  
  Objet(0)\vertex[0]\y=0;  
  Objet(0)\vertex[0]\z=0; //vertex v0
  Objet(0)\vertex[1]\x=1;  
  Objet(0)\vertex[1]\y=0;  
  Objet(0)\vertex[1]\z=0; //vertex v1
  Objet(0)\vertex[2]\x=1;  
  Objet(0)\vertex[2]\y=0;  
  Objet(0)\vertex[2]\z=1; //vertex v2
  Objet(0)\vertex[3]\x=0;  
  Objet(0)\vertex[3]\y=0;  
  Objet(0)\vertex[3]\z=1; //vertex v3
  Objet(0)\vertex[4]\x=0;  
  Objet(0)\vertex[4]\y=1;  
  Objet(0)\vertex[4]\z=0; //vertex v4
  Objet(0)\vertex[5]\x=1;  
  Objet(0)\vertex[5]\y=1;  
  Objet(0)\vertex[5]\z=0; //vertex v5
  Objet(0)\vertex[6]\x=1;  
  Objet(0)\vertex[6]\y=1;  
  Objet(0)\vertex[6]\z=1; //vertex v6
  Objet(0)\vertex[7]\x=0;  
  Objet(0)\vertex[7]\y=1;  
  Objet(0)\vertex[7]\z=1; //vertex v7
  
  Objet(0)\polygone[0]\ida=0
  Objet(0)\polygone[0]\idb=1
  Objet(0)\polygone[0]\idc=4
  
  Objet(0)\polygone[1]\ida=1
  Objet(0)\polygone[1]\idb=5
  Objet(0)\polygone[1]\idc=4

  Objet(0)\polygone[2]\ida=1
  Objet(0)\polygone[2]\idb=2
  Objet(0)\polygone[2]\idc=5

  Objet(0)\polygone[3]\ida=2
  Objet(0)\polygone[3]\idb=6
  Objet(0)\polygone[3]\idc=5

  Objet(0)\polygone[4]\ida=2
  Objet(0)\polygone[4]\idb=3
  Objet(0)\polygone[4]\idc=6

  Objet(0)\polygone[5]\ida=3
  Objet(0)\polygone[5]\idb=7
  Objet(0)\polygone[5]\idc=6

  Objet(0)\polygone[6]\ida=3
  Objet(0)\polygone[6]\idb=0
  Objet(0)\polygone[6]\idc=7

  Objet(0)\polygone[7]\ida=0
  Objet(0)\polygone[7]\idb=4
  Objet(0)\polygone[7]\idc=7

  Objet(0)\polygone[8]\ida=4
  Objet(0)\polygone[8]\idb=5
  Objet(0)\polygone[8]\idc=7

  Objet(0)\polygone[9]\ida=5
  Objet(0)\polygone[9]\idb=6
  Objet(0)\polygone[9]\idc=7

  Objet(0)\polygone[10]\ida=3
  Objet(0)\polygone[10]\idb=2
  Objet(0)\polygone[10]\idc=0

  Objet(0)\polygone[11]\ida=2
  Objet(0)\polygone[11]\idb=1
  Objet(0)\polygone[11]\idc=0

  
EndProcedure

Publié : lun. 28/nov./2005 18:01
par Polo
Je ne sais pas, mais quelque choses concernant l'openGl : déjà, n'utilise pas glvertex et tout ça, c'est trop lent.
De plus, je te déconseille d'utiliser l'Opengl tout court, microsoft a pour ambition de le supprimer et finira un jour ou l'autre par le faire (en tout cas nativement).
Bon, ok, ça répond pas vraiment à ton problème :)

Publié : lun. 28/nov./2005 18:20
par Progi1984
@polo :
Que veux tu que j'utilise à la place de glvertex ?
OpenGl est génial et utilisable quasi complétement dans PureBasic, alors que Ogre = trop dur, Irrlicht = wrapper pas terminé et DirectX9c= loin d'etre terminé !

Bon, j'ai trouvé le truc :

Code : Tout sélectionner

; Triangle
;
;
; This is the second tutorial of pbgl.
; Here we learn how you can create, rotate, move and scale a triangle.
; ---
; First we create a window:

XIncludeFile "OpenGL.pb" ;Includefile(see http://www.panicblue\xdn.de/pbgl/ link Links)

;Windowsettings
#WindowWidth = 500
#WindowHeight = 400
#WindowFlags = #PB_Window_TitleBar | #PB_Window_MaximizeGadget | #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered
Version = 2

Global hWnd.l,hDc
Declare CreateCube2()
Declare CreateCube(rot.f)

Declare CreateGLWindow()

Procedure GL_Callback(WindowID, Message, wParam, lParam)
  Result = #PB_ProcessPureBasicEvents
  If Message = #WM_SIZE
    glViewport_(0, 0, WindowWidth(), WindowHeight())  ;Resize the OpenGLscene
    Result = 1
  EndIf
  ProcedureReturn Result
EndProcedure

;-Constantes
#Nb_vertex=2000
#Nb_polygones=2000
;-Structures
Structure TVertex
  x.f
  y.f
  z.f
EndStructure
Structure TPolygone
  ida.w
  idb.w
  idc.w
EndStructure
Structure TObjet
  Vertex.TVertex[#Nb_vertex]
  Polygone.TPolygone[#Nb_polygones]
EndStructure

Dim Objet.Tobjet(1000)

;-Tableaux


CreateCube2()
If OpenWindow(0, 0, 0, #WindowWidth, #WindowHeight, #WindowFlags, "PBGL - Tutorial "+Str(Version)) ;Fenster öffnen
  SetWindowCallback(@GL_Callback())
  hWnd = WindowID(0)  ;create a handle to the window
  pfd.PIXELFORMATDESCRIPTOR   ;start opengl
  hDC = GetDC_(hWnd)
  pfd\nSize        = SizeOf(PIXELFORMATDESCRIPTOR)
  pfd\nVersion     = 1
  pfd\dwFlags      = #PFD_SUPPORT_OPENGL | #PFD_DOUBLEBUFFER | #PFD_DRAW_TO_WINDOW
  pfd\iLayerType   = #PFD_MAIN_PLANE
  pfd\iPixelType   = #PFD_TYPE_RGBA
  pfd\cColorBits   = 24  ;colorbuffer(24bit)
  pfd\cDepthBits   = 32  ;depthbuffer
  pixformat = ChoosePixelFormat_(hDC, pfd)
  SetPixelFormat_(hDC, pixformat, pfd)
  hrc = wglCreateContext_(hDC)
  wglMakeCurrent_(hDC, hrc)
  SwapBuffers_(hDC) ;in purebasic you have to call this command once at the start.
  glClearColor_(0.0, 0.0, 1.0, 1.0) ;Backgroundcolor (Parameters: (1/255)*Red, (1/255)*Green, (1/255)*Blue, Alpha)
  glEnable_(#GL_DEPTH_TEST)
  Repeat
    glClear_(#GL_COLOR_BUFFER_BIT | #GL_DEPTH_BUFFER_BIT) ; Delete
    ;Here we can draw
    CreateCube(rot)
    SwapBuffers_(hDC) ;draw
    rot + 1
    Event = WindowEvent() ;We should use WindowEvent, because the Animation shouldn't stop
    Delay(5)
  Until Event = #PB_Event_CloseWindow
  End
EndIf

Procedure CreateGLWindow()

EndProcedure
Procedure CreateCube(rot.f)
  glLoadIdentity_() ;create a new Object
  glTranslatef_(0.0, -0.25, 0.0) ; move 0.25 up
  glRotatef_(rot,0.5, 0.5, 0.5) ;rotate around x, y and z
  glScalef_(0.75, 0.75, 0.75) ;scale with the scalefaktor 0.75
  glBegin_(#GL_TRIANGLES) ;start with the drawing(you can also create quadratics or polygons with #GL_QUADS, ...)
;    glColor3f_(1.0, 0.0, 0.0);The folowing vertices are red
;    glVertex3f_(-0.5 , 0.5 , 0) ;The 3 means the vertex has 3 dimensions and the f means we use floats.
;    glVertex3f_(0.5, 0.5 , 0)
;    glVertex3f_(0.0 , -0.5, 0)
  For i=0 To 11
    glColor3f_(0.0,1.0,0.0)   
    glVertex3f_(objet(0)\vertex[objet(0)\polygone[i]\ida]\x, objet(0)\vertex[objet(0)\polygone[i]\ida]\y, objet(0)\vertex[objet(0)\polygone[i]\ida]\z)
    ;glColor3f_(1.0,1.0,1.0);
    glVertex3f_( objet(0)\vertex[objet(0)\polygone[i]\idb]\x, objet(0)\vertex[objet(0)\polygone[i]\idb]\y, objet(0)\vertex[objet(0)\polygone[i]\idb]\z)
    glColor3f_(0.0,0.0,0.0);
    glVertex3f_( objet(0)\vertex[objet(0)\polygone[i]\idc]\x, objet(0)\vertex[objet(0)\polygone[i]\idc]\y, objet(0)\vertex[objet(0)\polygone[i]\idc]\z)
  Next
  glEnd_()
EndProcedure
Procedure CreateCube2()
  Objet(0)\vertex[0]\x=0;  
  Objet(0)\vertex[0]\y=0;  
  Objet(0)\vertex[0]\z=0; //vertex v0
  Objet(0)\vertex[1]\x=1;  
  Objet(0)\vertex[1]\y=0;  
  Objet(0)\vertex[1]\z=0; //vertex v1
  Objet(0)\vertex[2]\x=1;  
  Objet(0)\vertex[2]\y=0;  
  Objet(0)\vertex[2]\z=1; //vertex v2
  Objet(0)\vertex[3]\x=0;  
  Objet(0)\vertex[3]\y=0;  
  Objet(0)\vertex[3]\z=1; //vertex v3
  Objet(0)\vertex[4]\x=0;  
  Objet(0)\vertex[4]\y=1;  
  Objet(0)\vertex[4]\z=0; //vertex v4
  Objet(0)\vertex[5]\x=1;  
  Objet(0)\vertex[5]\y=1;  
  Objet(0)\vertex[5]\z=0; //vertex v5
  Objet(0)\vertex[6]\x=1;  
  Objet(0)\vertex[6]\y=1;  
  Objet(0)\vertex[6]\z=1; //vertex v6
  Objet(0)\vertex[7]\x=0;  
  Objet(0)\vertex[7]\y=1;  
  Objet(0)\vertex[7]\z=1; //vertex v7
  
  Objet(0)\polygone[0]\ida=0
  Objet(0)\polygone[0]\idb=1
  Objet(0)\polygone[0]\idc=4
  
  Objet(0)\polygone[1]\ida=1
  Objet(0)\polygone[1]\idb=5
  Objet(0)\polygone[1]\idc=4

  Objet(0)\polygone[2]\ida=1
  Objet(0)\polygone[2]\idb=2
  Objet(0)\polygone[2]\idc=5

  Objet(0)\polygone[3]\ida=2
  Objet(0)\polygone[3]\idb=6
  Objet(0)\polygone[3]\idc=5

  Objet(0)\polygone[4]\ida=2
  Objet(0)\polygone[4]\idb=3
  Objet(0)\polygone[4]\idc=6

  Objet(0)\polygone[5]\ida=3
  Objet(0)\polygone[5]\idb=7
  Objet(0)\polygone[5]\idc=6

  Objet(0)\polygone[6]\ida=3
  Objet(0)\polygone[6]\idb=0
  Objet(0)\polygone[6]\idc=7

  Objet(0)\polygone[7]\ida=0
  Objet(0)\polygone[7]\idb=4
  Objet(0)\polygone[7]\idc=7

  Objet(0)\polygone[8]\ida=4
  Objet(0)\polygone[8]\idb=5
  Objet(0)\polygone[8]\idc=7

  Objet(0)\polygone[9]\ida=5
  Objet(0)\polygone[9]\idb=6
  Objet(0)\polygone[9]\idc=7

  Objet(0)\polygone[10]\ida=3
  Objet(0)\polygone[10]\idb=2
  Objet(0)\polygone[10]\idc=0

  Objet(0)\polygone[11]\ida=2
  Objet(0)\polygone[11]\idb=1
  Objet(0)\polygone[11]\idc=0

  
EndProcedure
Procedure CreateCube3(rot.f)
  glLoadIdentity_() ;create a new Object
  glTranslatef_(0.0, 0.25, 0.0) ; move 0.25 up
  glRotatef_(rot.f, 1.0, 1.0, 1.0) ;rotate around x, y and z
  glScalef_(0.75, 0.75, 0.75) ;scale with the scalefaktor 0.75
  glBegin_(#GL_TRIANGLES) ;start with the drawing(you can also create quadratics or polygons with #GL_QUADS, ...)
    glColor3f_(1.0, 0.0, 0.0);The folowing vertices are red
    glVertex3f_(-0.5 , 0.5 , 0) ;The 3 means the vertex has 3 dimensions and the f means we use floats.
    glVertex3f_(0.5, 0.5 , 0)
    glVertex3f_(0.0 , -0.5, 0)
  glEnd_()
EndProcedure

Publié : lun. 28/nov./2005 19:33
par Polo
Progi1984 a écrit :@polo :
Que veux tu que j'utilise à la place de glvertex ?
OpenGl est génial et utilisable quasi complétement dans PureBasic, alors que Ogre = trop dur, Irrlicht = wrapper pas terminé et DirectX9c= loin d'etre terminé !
Qu'est ce qui est loin d'être terminé dans DX9 ? La 3D est parfaitement utilisable, c'est plus facile que l'OpenGL ;)
Sinon, si tu finis par charger des scène complexes, tu appeleras des milliers de fois glvertex, et bonjour les performances ! il faut utiliser des vertex arrays, ou mieux, des vertex buffer, par le biais des extensions (un des trucs d'opengl que je ne supporte pas, l'architecture est vraiment mal foutue :D)

Publié : lun. 28/nov./2005 20:15
par garzul
Je ne sais pas, mais quelque choses concernant l'openGl : déjà, n'utilise pas glvertex et tout ça, c'est trop lent.
De plus, je te déconseille d'utiliser l'Opengl tout court, microsoft a pour ambition de le supprimer et finira un jour ou l'autre par le faire (en tout cas nativement).
Hu ??? !! :)
Heu tu voulait utiliser quoi à la place de glvertex :D ?
Je ne pense pas que opengl finira par disparaitre il est encore bien utiliser alors bon :)

Qu'est ce qui est loin d'être terminé dans DX9 ? La 3D est parfaitement utilisable, c'est plus facile que l'OpenGL Wink
Sinon, si tu finis par charger des scène complexes, tu appeleras des milliers de fois glvertex, et bonjour les performances ! il faut utiliser des vertex arrays, ou mieux, des vertex buffer, par le biais des extensions (un des trucs d'opengl que je ne supporte pas, l'architecture est vraiment mal foutue Very Happy)
heu lol c'est une blague :) ?

D3D c'est la grosse merde niveau code c'est ultra difficile à programmer (ultra le mot est un peu puissant mais bon :D) c'est bourré de pointeur de class etc... l'opengl est 50x fois plus facile sans AUCUN doute ! Sinon j'ai pas compris "la 3D est parfaitement utilisable" :)))

bah lol même si t'apelle des milliers de fois glvertex ca faît quoi :) exemple loader 3DS en OpenGL écrit par moi même -->

http://div0.free.fr/TEMP/test.JPG

http://div0.free.fr/TEMP/etoile.jpg

<-- ici la map effectue une rotation + est appliquer sur la map une texture de 4096*4096 :)

(ceci dit si t'en apelle trop ca ramera surement bien sur :)) mais la avec ces scénes je n'ai AUCUN probléme sur mon pc (gforce fx 5200, 512 de ram)

Heu sinon tu peux utiliser les shaders :)))) (la tu aura tes performances ;)))) OpenGl supporte grace à GLSL ou sinon ta CG :) (vois site de OpenGL) et sinon bah les extensions OpenGL je trouve sont beaucoup plus simple à utiliser que D3D (qui est horrible niveau code)

Publié : lun. 28/nov./2005 20:30
par Polo
Question de gout alors, mais D3d est beaucoup plus puissant :)
Sinon, concernant glvertex/glnormal, c'est les fonctions a éviter, relis mon post, je fait allusion au vertex arrays, qui sont très rapide, et les vbo, encore plus rapide.
Essaye, tu verras, j'ai atteint 1000 FPS en utilisant les VBO avec une scène simple et 150 FPS en utilisant les glvertex :)
Mais de toute façon j'ai plus ou moins laissé tombé opengl...

Publié : lun. 28/nov./2005 20:53
par garzul
Non mais moi je fait en shader donc bon "vertex arrays" etc... au chiotte avec les shaders ;) sinon D3D n'est PAS plus puissant que OpenGl :) (c'est une illusion)
Question de gout alors
:

non non je t'assure que lOpenGL est beaucoup plus facil (niveau facilité hein) :)

Publié : lun. 28/nov./2005 21:05
par Polo
Ben écoute, j'ai fait un moteur 3d en OpenGL, et un autre en DirectX, et je préfère de loin DirectX niveau code :)
Je sais pas trop ce que tu entends par shader, je ne m'y suis pas encore intéressé, mais si ça oblige à utiliser glvertex avec l'OpenGL, c'est que... euh... bon... J'espère que tu ne comptes pas créer un jeu avec ;)
non non je t'assure que lOpenGL est beaucoup plus facil (niveau facilité hein)
Ben, niveau facilité, je sais pas, c'est ce que je croyais au début, mais en fait, depuis que je me suis réellement mis à directX, j'ai changé d'avis :)

Publié : lun. 28/nov./2005 21:13
par Progi1984
Le combat DirectX/OpenGl, un débat encore d'actualité
Me a écrit :DirectX9c= loin d'etre terminé !
Je parlais de la userlib qu'un anglais ou allemand a commencé !
Me a écrit :la 3D est parfaitement utilisable
vis à vis de DirectX

Publié : lun. 28/nov./2005 21:20
par Polo
Ben oui :)
Pour l'userlib, je ne vois absolument pas l'intérêt, vu qu'en fait, il n'y a qu'une fonction essentielle pour Direct3d, le reste c'est juste des interfaces :)
Mais l'avantage, c'est que la documentation est énorme et assez bien faite !
Enfin bon, comme je l'ai dit, chacun ses goûts :)
Mais je maintient que dans tous les cas, il ne faut pas utiliser glvertex quand on peut l'éviter.

Publié : lun. 28/nov./2005 22:32
par garzul
Bah les shaders (implquand les vertex shaders et pixel shader etc...) c'est la progrmmation direct sur le gpu de la cg donc tu peux tout faire et a mon avis essaye les shaders tu va adorer ;) tu pourra tout faire et c'est trés rapide (le plus rapide qui soit) (utilise CG ;))

Pour exemple la Iconoclast pour ces effets mémorable de scénes et de transition utilise TOTALEMENT le language CG pour les shaders (regarde autour de CG)

Publié : lun. 28/nov./2005 23:08
par Progi1984
Ce que je veux, c'est utiliser Pure, donc si vous avez des exemples avec, pourquoi pas ?

Publié : mar. 29/nov./2005 16:55
par Polo
Bof, pour l'instant je préfère rester en mode normal, moi :)

Publié : mar. 29/nov./2005 17:04
par Progi1984
Mode normal ?

Publié : mar. 29/nov./2005 17:43
par Polo
Progi1984 a écrit :Mode normal ?
Ben, du DirectX pur, sans shader ;)
Je ne sais pas ce que tu comptes faire ou utiliser, mais boycotter Ogre est en tout cas une solution sage :)