Demo : Cube en OpenGL

Généralités sur la programmation 3D
Avatar de l’utilisateur
threedslider
Messages : 381
Inscription : dim. 01/juil./2018 22:38

Demo : Cube en OpenGL

Message par threedslider »

Je commence à comprendre pour OpenGL avec Purebasic, c'est pas évident :?

Une démo pour le cube en rotation avec bien sûr en OpenGL ! (Repris avec ancien code que j'ai amélioré )

Code : Tout sélectionner

CompilerIf #PB_Compiler_OS = #PB_OS_Windows
  CompilerIf Subsystem("OpenGL") = #False
    MessageRequester("Error", "Please set the subsystem to OpenGL")
    End
  CompilerEndIf
CompilerEndIf

InitEngine3D()
InitKeyboard()


OpenWindow(0, 0, 0, 800, 600, "OpenGL : Cube for test", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0), 0, 0, 800, 600)


glMatrixMode_(#GL_PROJECTION)
glLoadIdentity_() 
gluPerspective_(45.0, 800/600, 1.0, 60.0)
glMatrixMode_(#GL_MODELVIEW)
glTranslatef_(-1/4, 0, -4)
glShadeModel_(#GL_SMOOTH)
glEnable_(#GL_LIGHT0)
glEnable_(#GL_LIGHTING)
glEnable_(#GL_COLOR_MATERIAL)
glEnable_(#GL_DEPTH_TEST)
glEnable_(#GL_CULL_FACE)   
glViewport_(0, 0, 800, 600)


Repeat
glClearColor_(0.7, 0.7, 0.7, 0) ; background color
  glClear_(#GL_COLOR_BUFFER_BIT | #GL_DEPTH_BUFFER_BIT)
  Repeat
    event = WindowEvent()
    Select Event
      Case #PB_Event_CloseWindow
        quit = 1
     EndSelect
   Until event = 0
   
  
   
   glBegin_(#GL_QUADS)
    glColor3f_(0.3, 0.3, 1.0)
    glNormal3f_( 0.0, 0.0, 1.0)
    glVertex3f_( 0.5, 0.5, 0.5) 
    glVertex3f_(-0.5, 0.5, 0.5)
    glVertex3f_(-0.5,-0.5, 0.5) 
    glVertex3f_( 0.5,-0.5, 0.5)

    glNormal3f_( 0.0, 0.0,-1.0)
    glVertex3f_(-0.5,-0.5,-0.5) 
    glVertex3f_(-0.5, 0.5,-0.5)
    glVertex3f_( 0.5, 0.5,-0.5) 
    glVertex3f_( 0.5,-0.5,-0.5)

    glNormal3f_( 0.0, 1.0, 0.0)
    glVertex3f_( 0.5, 0.5, 0.5) 
    glVertex3f_( 0.5, 0.5,-0.5)
    glVertex3f_(-0.5, 0.5,-0.5)
    glVertex3f_(-0.5, 0.5, 0.5)

    glNormal3f_( 0.0,-1.0, 0.0)
    glVertex3f_(-0.5,-0.5,-0.5)
    glVertex3f_( 0.5,-0.5,-0.5)
    glVertex3f_( 0.5,-0.5, 0.5) 
    glVertex3f_(-0.5,-0.5, 0.5)

    glNormal3f_( 1.0, 0.0, 0.0)
    glVertex3f_( 0.5, 0.5, 0.5) 
    glVertex3f_( 0.5,-0.5, 0.5)
    glVertex3f_( 0.5,-0.5,-0.5) 
    glVertex3f_( 0.5, 0.5,-0.5)

    glNormal3f_(-1.0, 0.0, 0.0)
    glVertex3f_(-0.5,-0.5,-0.5) 
    glVertex3f_(-0.5,-0.5, 0.5)
    glVertex3f_(-0.5, 0.5, 0.5) 
    glVertex3f_(-0.5, 0.5,-0.5)
    glEnd_();
		
	glTranslatef_(1/4,1/4,0)
	glRotatef_(1.0, 0.5, 1.0, 0.2)
	glTranslatef_(-1/4,-1/4,0)
	
 
 FlipBuffers()
 
 ExamineKeyboard()
 
Until KeyboardPushed(#PB_Key_Escape) Or quit = 1
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Demo : Cube en OpenGL

Message par Kwai chang caine »

Joli cube bleu marche nickel ici :D
J'ai juste du rajouter la ligne "InitSprite()"
Merci pour le partage 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
threedslider
Messages : 381
Inscription : dim. 01/juil./2018 22:38

Re: Demo : Cube en OpenGL

Message par threedslider »

Oui initengine3D sert à rien dans mon code...

Sinon, you are welcome ! ^^

Merci d'avoir testé si cela marche bien :)

Happy coding !
Avatar de l’utilisateur
threedslider
Messages : 381
Inscription : dim. 01/juil./2018 22:38

Re: Demo : Cube en OpenGL

Message par threedslider »

Le même code mais avec des couleurs différentes sur chaque faces :)

Code : Tout sélectionner

; Created and improved by threedslider 12/28/2021

CompilerIf #PB_Compiler_OS = #PB_OS_Windows
  CompilerIf Subsystem("OpenGL") = #False
    MessageRequester("Error", "Please set the subsystem to OpenGL")
    End
  CompilerEndIf
CompilerEndIf

InitSprite()
InitKeyboard()


OpenWindow(0, 0, 0, 800, 600, "OpenGL : Cube for test", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0), 0, 0, 800, 600)


glMatrixMode_(#GL_PROJECTION)
glLoadIdentity_() 
gluPerspective_(45.0, 800/600, 1.0, 60.0)
glMatrixMode_(#GL_MODELVIEW)
glTranslatef_(-1/4, 0, -4)
glShadeModel_(#GL_SMOOTH)
glEnable_(#GL_LIGHT0)
glEnable_(#GL_LIGHTING)
glEnable_(#GL_COLOR_MATERIAL)
glEnable_(#GL_DEPTH_TEST)
glEnable_(#GL_CULL_FACE)   
glViewport_(0, 0, 800, 600)


Repeat
glClearColor_(0.7, 0.7, 0.7, 0) ; background color
glClear_(#GL_COLOR_BUFFER_BIT | #GL_DEPTH_BUFFER_BIT)
  Repeat
    event = WindowEvent()
    Select Event
      Case #PB_Event_CloseWindow
        quit = 1
     EndSelect
   Until event = 0
   
  
   
   glBegin_(#GL_QUADS)
    glColor3f_(0.3, 0.3, 1.0)
    glNormal3f_( 0.0, 0.0, 1.0)
    glVertex3f_( 0.5, 0.5, 0.5) 
    glVertex3f_(-0.5, 0.5, 0.5)
    glVertex3f_(-0.5,-0.5, 0.5) 
    glVertex3f_( 0.5,-0.5, 0.5)
    
    glColor3f_(0.0, 0.0, 1.0)
    glNormal3f_( 0.0, 0.0,-1.0)
    glVertex3f_(-0.5,-0.5,-0.5) 
    glVertex3f_(-0.5, 0.5,-0.5)
    glVertex3f_( 0.5, 0.5,-0.5) 
    glVertex3f_( 0.5,-0.5,-0.5)
    
    glColor3f_(1.0, 0.0, 0.0)
    glNormal3f_( 0.0, 1.0, 0.0)
    glVertex3f_( 0.5, 0.5, 0.5) 
    glVertex3f_( 0.5, 0.5,-0.5)
    glVertex3f_(-0.5, 0.5,-0.5)
    glVertex3f_(-0.5, 0.5, 0.5)
    
    glColor3f_(0.0, 1.0, 0.0)
    glNormal3f_( 0.0,-1.0, 0.0)
    glVertex3f_(-0.5,-0.5,-0.5)
    glVertex3f_( 0.5,-0.5,-0.5)
    glVertex3f_( 0.5,-0.5, 0.5) 
    glVertex3f_(-0.5,-0.5, 0.5)
    
    glColor3f_(1.0, 0.0, 1.0)
    glNormal3f_( 1.0, 0.0, 0.0)
    glVertex3f_( 0.5, 0.5, 0.5) 
    glVertex3f_( 0.5,-0.5, 0.5)
    glVertex3f_( 0.5,-0.5,-0.5) 
    glVertex3f_( 0.5, 0.5,-0.5)
    
    glColor3f_(1.0, 1.0, 0.0)
    glNormal3f_(-1.0, 0.0, 0.0)
    glVertex3f_(-0.5,-0.5,-0.5) 
    glVertex3f_(-0.5,-0.5, 0.5)
    glVertex3f_(-0.5, 0.5, 0.5) 
    glVertex3f_(-0.5, 0.5,-0.5)
  glEnd_();
		
	glTranslatef_(1/4,1/4,0)
	glRotatef_(1.0, 0.5, 1.0, 0.2)
	glTranslatef_(-1/4,-1/4,0)
	
 
 FlipBuffers()
 
 ExamineKeyboard()
 
Until KeyboardPushed(#PB_Key_Escape) Or quit = 1
Shadow
Messages : 1373
Inscription : mer. 04/nov./2015 17:39

Re: Demo : Cube en OpenGL

Message par Shadow »

Est ce que on peu utiliser opengl avec de la 2d ?
faire par exemple du 2ddrawing dessus ou même vectordrawing ?

et c'est quoi la différence avec un ecran ?
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
Avatar de l’utilisateur
threedslider
Messages : 381
Inscription : dim. 01/juil./2018 22:38

Re: Demo : Cube en OpenGL

Message par threedslider »

Shadow a écrit : jeu. 03/mars/2022 0:54 Est ce que on peu utiliser opengl avec de la 2d ?
Oui on peut utiliser la 2D comme images/textures en OpenGL.
Shadow a écrit : jeu. 03/mars/2022 0:54 faire par exemple du 2ddrawing dessus ou même vectordrawing ?
Je ne suis pas sûr que la 2ddrawing ou vectordrawing marche avec OpenGL car il a sa propre fonction par contre je pense utiliser ces fonctions (2ddrawing ou vectordrawing) pour l'enregistrer sous format image ensuite utiliser en texture pour OpenGL c'est faisable mais faut bien concevoir son programme.

Shadow a écrit : jeu. 03/mars/2022 0:54 et c'est quoi la différence avec un ecran ?
SI je comprends bien ta question, tu parles de "profondeur" pour le "Z"? Ceci dit la 3D ont de l'axe "X" (de gauche ou droite), "Y" ( de haut ou bas) et "Z" (de l'avant ou arrière) ce qui impliquent en écran de manière par "volume" alors que la 2D ont que "X" et "Y" ce qui impliquent en écran "plat". La différence avec un écran c'est le "Z" disponible ou l'absence de profondeur. J’espère que cela t'aide et que c'est clair aussi si possible ^^.
Shadow
Messages : 1373
Inscription : mer. 04/nov./2015 17:39

Re: Demo : Cube en OpenGL

Message par Shadow »

Merci threedslider pour les explications....
Je voulais aussi parler rapidité....

J'aimerais bien avoir une surface comme le canevas mais qui fonctionnerais
avec la mémoire vidéo, car c'est beaucoup plus rapide !

L'écran c'est pour faire un jeu vidéo, pas des programmes à proprement parlé.
Le canevas c'est très bien, mais ça utilise pas la mémoire vidéo donc plus lent !

Et si en plus tu utilise du vecteur, alors c'est encore pire, c'est assez lents le vecteur, mais plus propre !
Ya pas moyen de faire marcher le 2d ou le vector avec la mémoire vidéo ?
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
Avatar de l’utilisateur
threedslider
Messages : 381
Inscription : dim. 01/juil./2018 22:38

Re: Demo : Cube en OpenGL

Message par threedslider »

A mon avis, si tu recherches la rapidité pour la 2D pour le jeux vidéo c'est d'utiliser soit en OpenGL ou DirectX mais sans la 2ddrawing ou vectordrawing. J'ai pas d'infos pour la mémoire vidéo en utilisant la 2ddrawing sauf si je me trompe pas c'est utiliser la fonction ScreenOutput() ou SpriteOutput() cela accélère très vite je crois.
Avatar de l’utilisateur
threedslider
Messages : 381
Inscription : dim. 01/juil./2018 22:38

Re: Demo : Cube en OpenGL

Message par threedslider »

Et aussi n'oublies pas d'activer les gestion de Threads ^^

j'ai sauvegardé ces codes mais dont le lien je l'ai perdu sur le forum anglais.
Voici ce code comme faire la 2d en OpenGL :

Code : Tout sélectionner

EnableExplicit

UsePNGImageDecoder()
UseJPEGImageDecoder()

;-CONSTANTS
Enumeration
  #MainWindow
  #OpenGLGadget
EndEnumeration

;These two GL constants are used for texture creation. Don't change their values.
#GL_BGR = $80E0
#GL_BGRA = $80E1


;-STRUCTURES
Structure Integer2
  X.i
  Y.i
EndStructure
Global.Integer2 WindowDim
WindowDim\X = 1024
WindowDim\Y = 720


;-GLOBALS
Global.i Image1, Image2
Global.i Texture1, Texture2

;-DEFINES
Define.i Event
Define.i WindowFlags = #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget


;-DECLARES
Declare Render()
Declare Render2DQuad(OGLTexture.i, StartX.d, StartY.d, Width.i, Height.i, Z.d)
Declare SetupOpenGL()
Declare SetupGLTexture(ImageHandle.i)


;-MAIN WINDOW
If OpenWindow(#MainWindow, 0, 0, WindowDim\X, WindowDim\Y, "OpenGL Example", WindowFlags)
  If OpenGLGadget(#OpenGLGadget, 0, 0, WindowDim\X, WindowDim\Y) = 0
    End
  EndIf
  
  ;This procedure sets up the rendering system to mimic the standard Purebasic drawing system.
  SetupOpenGL()
  
  ;Load images.
  Image1 = LoadImage(#PB_Any, #PB_Compiler_Home+"\Examples\3D\Data\Textures\ogrelogo-small.jpg")
  Image2 = LoadImage(#PB_Any, #PB_Compiler_Home+"\Examples\3D\Data\Textures\grass1.png")
  
  ;Now we create textures which can be used for rendering with OpenGL.
  Texture1 = SetupGLTexture(Image1)
  Texture2 = SetupGLTexture(Image2)
  
  ;-MAIN REPEAT
  Repeat
    Event = WaitWindowEvent()
    
    Render()
    SetGadgetAttribute(#OpenGLGadget, #PB_OpenGL_FlipBuffers, #True)

  Until Event = #PB_Event_CloseWindow
EndIf
End

Procedure Render()
  
  ;Clearing buffers and resetting clear color to remove old graphics from the last frame.
  glClear_(#GL_COLOR_BUFFER_BIT | #GL_DEPTH_BUFFER_BIT)
  glClearColor_(0.2, 0.2, 0.2, 1.0)
  
  ;## DRAWING TEXTURES/IMAGES
  ;First enable the Texture system.
  glEnable_(#GL_TEXTURE_2D)
  
  ;This procedure will create a quad and apply a texture to it.
  ;The Texture variable contains the texture created earlier using SetupGLTexture().
  Render2DQuad(Texture1, 0, 0, ImageWidth(Image1), ImageHeight(Image1), -2)
  Render2DQuad(Texture2, 0, 0, ImageWidth(Image2), ImageHeight(Image2), -1) 
  
  ;After all the textures have been displayed disable the texture system.
  ;Otherwise it will conflict with the non texture graphics.
  glDisable_(#GL_TEXTURE_2D)
  
EndProcedure

Procedure Render2DQuad(OGLTexture.i, StartX.d, StartY.d, Width.i, Height.i, Z.d)
  
  ;The texture is first bound which tells OpenGL to use this texture for any future rendering.
  glBindTexture_(#GL_TEXTURE_2D, OGLTexture)
  glBegin_(#GL_QUADS)
    glColor4f_   (1,1,1,1)
    glNormal3f_  (0,0,1.0)
    glTexCoord2f_(1.0,1.0)
    glVertex3f_  (StartX+Width,StartY,Z)
    glTexCoord2f_(0.0,1.0)
    glVertex3f_  (StartX,StartY,Z)
    glTexCoord2f_(0.0,0.0)
    glVertex3f_  (StartX,StartY+Height,Z)
    glTexCoord2f_(1.0,0.0)
    glVertex3f_  (StartX+Width,StartY+Height,Z)
  glEnd_()

EndProcedure

Procedure SetupOpenGL()
  
  glMatrixMode_(#GL_PROJECTION)

  glOrtho_(0.0, WindowDim\X, WindowDim\Y, 0.0, -1000.0, 1000.0)
  
  glMatrixMode_(#GL_MODELVIEW)
  
  glEnable_(#GL_DEPTH_TEST)
  
  glEnable_(#GL_BLEND)
  glBlendFunc_(#GL_SRC_ALPHA, #GL_ONE_MINUS_SRC_ALPHA)
	
EndProcedure

Procedure SetupGLTexture(ImageHandle.i)
  
  Define.i ImageW, ImageH, ImageD
  Define.i MemoryAddress
  Define.i TextureHandle

  If IsImage(ImageHandle) = 0
    ProcedureReturn #False
  EndIf
  
  ImageD = ImageDepth(ImageHandle, #PB_Image_InternalDepth)
  
  StartDrawing(ImageOutput(ImageHandle))
    MemoryAddress = DrawingBuffer()
  StopDrawing()
  
  If MemoryAddress = 0
    ProcedureReturn #False
  EndIf
  
  glGenTextures_(1, @TextureHandle)
  glBindTexture_(#GL_TEXTURE_2D, TextureHandle)
  
  ImageW = ImageWidth(ImageHandle)
  ImageH = ImageHeight(ImageHandle)
  
  If ImageD = 32
    glTexImage2D_(#GL_TEXTURE_2D, 0, 4, ImageW, ImageH, 0, #GL_BGRA, #GL_UNSIGNED_BYTE, MemoryAddress)
  Else
    glTexImage2D_(#GL_TEXTURE_2D, 0, 3, ImageW, ImageH, 0, #GL_BGR, #GL_UNSIGNED_BYTE, MemoryAddress)
  EndIf
  
  glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MIN_FILTER, #GL_LINEAR)
  glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MAG_FILTER, #GL_LINEAR)
  
  ProcedureReturn TextureHandle
  
EndProcedure
Et teste sur ton jeux vidéo ^^
Shadow
Messages : 1373
Inscription : mer. 04/nov./2015 17:39

Re: Demo : Cube en OpenGL

Message par Shadow »

threedslider merci de ton aide, je vais avoir besoin de toi, j'ai peut etre trouver un prochain projet !
Mais dans un autre sujet que ici.
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
Répondre