Dessin sur écrans qui se swap

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
SPH
Messages : 4722
Inscription : mer. 09/nov./2005 9:53

Dessin sur écrans qui se swap

Message par SPH »

Salut a tous et toutes, :D

Ca alors, SPH qui poste un code !! Ca faisait longtemps...

Bon, je voudrais savoir une chose : quand on dessine (par exemple un triangle) sur un écran et qu'on swap l'écran, ce 2eme écran n'a pas ce triangle. Il faut le redessiner une fois.
Comment faire que le dessin s'applique sur les 2 écrans qui se swap ?

Code : Tout sélectionner

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Code de démonstration OpenGL   ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; PB6.0 - SPH(2023) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


;EnableExplicit

;-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

If ExamineDesktops()
  ddw=DesktopWidth(0)
  ddh=DesktopHeight(0)
Else
  ddw=1024
  ddh=768
EndIf

;-STRUCTURES
Structure Integer2
  X.i
  Y.i
EndStructure
Global.Integer2 WindowDim
WindowDim\X = ddw
WindowDim\Y = ddh


;-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
win=OpenWindow(#MainWindow, 0, 0,ddw,ddh, "Titre",#PB_Window_Maximize|#PB_Window_BorderLess)
If win=0
  MessageRequester("Erreur","OpenWindow() impossible")
  End
EndIf

screenGL=OpenGLGadget(#OpenGLGadget,0,0,ddw,ddh)
If screenGL=0
  MessageRequester("Erreur","OpenGLGadget() impossible")
  End
EndIf


SetupOpenGL()

AddKeyboardShortcut(0,  #PB_Shortcut_Escape, 666) ; quitter

glOrtho_(0,ddw,ddh,0,-1,1)
glMatrixMode_(#GL_MODELVIEW)
glLoadIdentity_()
glClear_(0)

;*********************************************************************************************************************************

;;;;;;;;;;;
timer=ElapsedMilliseconds()

glClearColor_(0,0,0, 1.0)
; ShowCursor_(0)
;-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#################;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;### D E B U T ###;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#################;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Repeat
  
  ;glClear_(#GL_COLOR_BUFFER_BIT | #GL_DEPTH_BUFFER_BIT)
  
  
  ;*****
  Repeat
    Event = WindowEvent()
    
    Select Event
      Case #PB_Event_Gadget
        Select EventGadget()
          Case 1
            Resx = GetGadgetAttribute(1, #PB_OpenGL_MouseX)
            Resy = GetGadgetAttribute(1, #PB_OpenGL_MouseY)
            ;;;;;;;         
            Select EventType()
                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;             
            EndSelect
        EndSelect
      Case #PB_Event_Menu
        Select EventMenu()
          Case 666
            timer=ElapsedMilliseconds()-timer
            End
        EndSelect
    EndSelect
    
  Until Event = 0
  
  
  ;##############################################
  ;##############################################
  ;##############################################
  ;##############################################
  
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  ;;;;;;;; Traçage de vos polygones ;;;;;;;;
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  
  For i=1 To 1
    glBegin_(#GL_POLYGON);
    glBlendFunc_(#GL_SRC_ALPHA,#GL_ONE_MINUS_SRC_ALPHA)
    glColor4f_(Random(255)/255,Random(255)/255,Random(255)/255,Random(255)/255)
    
    For u=1 To 5
      glVertex2f_(Random(ddw),Random(ddh));
    Next u
    
    glEnd_()                      ; 
  Next i
  ;;;;;;;;;;;;;;;
  
  SetGadgetAttribute(#OpenGLGadget, #PB_OpenGL_FlipBuffers, #True)
  Delay(100)
ForEver

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)
  glClearColor_(0,0,0,1)
  
  ;## 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
http://HexaScrabble.com/
!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.00 - 64 bits
brossden
Messages : 818
Inscription : lun. 26/janv./2004 14:37

Re: Dessin sur écrans qui se swap

Message par brossden »

OUI bof pas terrible pour les yeux !
Denis

Bonne Jounée à tous
Avatar de l’utilisateur
SPH
Messages : 4722
Inscription : mer. 09/nov./2005 9:53

Re: Dessin sur écrans qui se swap

Message par SPH »

C'était un exemple :idea:
http://HexaScrabble.com/
!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.00 - 64 bits
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Dessin sur écrans qui se swap

Message par Ar-S »

Je ne pige pas ta demande. Qu'appelles tu swapper sur l'autre ecran ?
Si je lance ton exemple sur mon écran 0 (en enlevant le windows_bordeless) et que je fais passer la fenêtre sur l’écran 1, les triangles sont toujours là.. T'es pas claire.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
cage
Messages : 506
Inscription : ven. 16/oct./2015 18:22
Localisation : France
Contact :

Re: Dessin sur écrans qui se swap

Message par cage »

C'est sur, il n'est pas Claire mais SPH :)
■ Win10 64-bit (Intel Celeron CPU N2920 @ 1.86GHz, 4,0GB RAM, Intel HD Graphics) & PB 6.00 LTS
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Gérard sur le forum Anglais
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr
Avatar de l’utilisateur
SPH
Messages : 4722
Inscription : mer. 09/nov./2005 9:53

Re: Dessin sur écrans qui se swap

Message par SPH »

Je ne suis pas Claire ! Suis-je clair ? :D
---
Bon, explication :
Quand on dessine sur un écran, on dessine "dans le noir" jusqu'au FlipBuffers où là, l'ordi swappe l'écran. Le prochain dessin se fera aussi dans le noir puis le processus se poursuit...

Compris ?
http://HexaScrabble.com/
!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.00 - 64 bits
brossden
Messages : 818
Inscription : lun. 26/janv./2004 14:37

Re: Dessin sur écrans qui se swap

Message par brossden »

En plus simple :
Il utilise une fenêtre masquée pour faire sont dessin, puis affiche cette fenêtre et inversement !
Ça ne sert à rien si ce n'est être pénible !
Denis

Bonne Jounée à tous
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Dessin sur écrans qui se swap

Message par falsam »

Tu ne fais pas appel à ta procédure Render(). Peut être que le souci d'affichage vient de là.

En jetant un oeil sur ton code, que je vois pas un appel OpenGL à l'équivalent de la fonction ClearScreen() de PureBasic.

Modifie ton Delay(100) par un Delay(1000). Le dessin précédent ne disparait pas.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
nemerod
Messages : 34
Inscription : mer. 24/août/2022 0:58

Re: Dessin sur écrans qui se swap

Message par nemerod »

SPH a écrit : mer. 08/nov./2023 8:51 Salut a tous et toutes, :D

Ca alors, SPH qui poste un code !! Ca faisait longtemps...

Bon, je voudrais savoir une chose : quand on dessine (par exemple un triangle) sur un écran et qu'on swap l'écran, ce 2eme écran n'a pas ce triangle. Il faut le redessiner une fois.
Comment faire que le dessin s'applique sur les 2 écrans qui se swap ?

Code : Tout sélectionner

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Code de démonstration OpenGL   ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; PB6.0 - SPH(2023) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


;EnableExplicit

;-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

If ExamineDesktops()
  ddw=DesktopWidth(0)
  ddh=DesktopHeight(0)
Else
  ddw=1024
  ddh=768
EndIf

;-STRUCTURES
Structure Integer2
  X.i
  Y.i
EndStructure
Global.Integer2 WindowDim
WindowDim\X = ddw
WindowDim\Y = ddh


;-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
win=OpenWindow(#MainWindow, 0, 0,ddw,ddh, "Titre",#PB_Window_Maximize|#PB_Window_BorderLess)
If win=0
  MessageRequester("Erreur","OpenWindow() impossible")
  End
EndIf

screenGL=OpenGLGadget(#OpenGLGadget,0,0,ddw,ddh)
If screenGL=0
  MessageRequester("Erreur","OpenGLGadget() impossible")
  End
EndIf


SetupOpenGL()

AddKeyboardShortcut(0,  #PB_Shortcut_Escape, 666) ; quitter

glOrtho_(0,ddw,ddh,0,-1,1)
glMatrixMode_(#GL_MODELVIEW)
glLoadIdentity_()
glClear_(0)

;*********************************************************************************************************************************

;;;;;;;;;;;
timer=ElapsedMilliseconds()

glClearColor_(0,0,0, 1.0)
; ShowCursor_(0)
;-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#################;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;### D E B U T ###;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#################;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Repeat
  
  ;glClear_(#GL_COLOR_BUFFER_BIT | #GL_DEPTH_BUFFER_BIT)
  
  
  ;*****
  Repeat
    Event = WindowEvent()
    
    Select Event
      Case #PB_Event_Gadget
        Select EventGadget()
          Case 1
            Resx = GetGadgetAttribute(1, #PB_OpenGL_MouseX)
            Resy = GetGadgetAttribute(1, #PB_OpenGL_MouseY)
            ;;;;;;;         
            Select EventType()
                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;             
            EndSelect
        EndSelect
      Case #PB_Event_Menu
        Select EventMenu()
          Case 666
            timer=ElapsedMilliseconds()-timer
            End
        EndSelect
    EndSelect
    
  Until Event = 0
  
  
  ;##############################################
  ;##############################################
  ;##############################################
  ;##############################################
  
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  ;;;;;;;; Traçage de vos polygones ;;;;;;;;
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  
  For i=1 To 1
    glBegin_(#GL_POLYGON);
    glBlendFunc_(#GL_SRC_ALPHA,#GL_ONE_MINUS_SRC_ALPHA)
    glColor4f_(Random(255)/255,Random(255)/255,Random(255)/255,Random(255)/255)
    
    For u=1 To 5
      glVertex2f_(Random(ddw),Random(ddh));
    Next u
    
    glEnd_()                      ; 
  Next i
  ;;;;;;;;;;;;;;;
  
  SetGadgetAttribute(#OpenGLGadget, #PB_OpenGL_FlipBuffers, #True)
  Delay(100)
ForEver

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)
  glClearColor_(0,0,0,1)
  
  ;## 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

tien tien, il semble que tous le monde n'a pas comprit la demande, je vais donc faire une traduction, @SPH corrige moi si besoin

SPH demande >
je voudrai faire du dessin avec openGL mais vue que je passe par un openscreen, le openscreen a par defaut et naturelement 2 buffer qui de swap (échange les image, affiché et l'autre qui peu etre édité), se que je voudrai c'est faire que mes operation sois dupliqué sur les 2 buffer en meme temps, donc sois avec 1 seul buffer unique, donc pas de flipbuffer, un peu comme un canvas ou image unique que j'affiche
soit avoir la possibilité de cloné le buffer edité avec le buffer affiché, donc changé par exemple, un pointeur memoir pour n'avoir que 1 seul buffer unique mais commun au 2 frame, donc ne plus avoir de mise en tampon et ne plus faire de flipbuffer

réponse pour SPH >
alors je tes les proposé sur discord, mais il est possible si j'ai bonne memoir de passé outre les flipbuffer et d'avoir que 1 seul fenetre comme tu dit pour que tes operation de rendu fais avec openGL sois affiché directement sans devoir cloné l'image d'un buffer a l'autre
un canvas a si je me tromps pas avec les dernier version de PB, la possibilité d'avoir du openGL et donc un start et stop drawing pour le openGL 3D devrai répondre a la question

PS: désolé pour les autre, mais le message qu'il a fais a eu une réponse sur le discord le jours meme quant il a partagé le lien du poste avec nous
nemerod
Messages : 34
Inscription : mer. 24/août/2022 0:58

Re: Dessin sur écrans qui se swap

Message par nemerod »

falsam a écrit : ven. 10/nov./2023 20:54 Tu ne fais pas appelles à ta procédure Render(). Peut être que le souci d'affichage vient de là.

En jetant un oeil sur ton code, que je vois pas un appel OpenGL à l'équivalent de la fonction ClearScreen() de PureBasic.

Modifie ton Delay(100) par un Delay(1000). Le dessin précédent ne disparait pas.
alors justement pour le ClearScreen avec openGL c'est la fonction glClear et glClearColor, il la meme commenté dans le code pour le voir
ligne 71 du code principal
ligne 78 du code principal
ligne 146 de la procedure Render ligne 143
ligne 148 de la procedure Render ligne 143

pour se qui est du flipbuffer c'est aussi la meme chose, mais c'est via le SetGadgetAttribute argument 2 constant #PB_OpenGL_FlipBuffers
ligne 136 dans la boucle REPEAT:FOREVER du code principal
Avatar de l’utilisateur
SPH
Messages : 4722
Inscription : mer. 09/nov./2005 9:53

Re: Dessin sur écrans qui se swap

Message par SPH »

nemerod a écrit : mer. 15/nov./2023 19:55
SPH a écrit : mer. 08/nov./2023 8:51 Salut a tous et toutes, :D

Ca alors, SPH qui poste un code !! Ca faisait longtemps...

Bon, je voudrais savoir une chose : quand on dessine (par exemple un triangle) sur un écran et qu'on swap l'écran, ce 2eme écran n'a pas ce triangle. Il faut le redessiner une fois.
Comment faire que le dessin s'applique sur les 2 écrans qui se swap ?


tien tien, il semble que tous le monde n'a pas comprit la demande, je vais donc faire une traduction, @SPH corrige moi si besoin

SPH demande >
je voudrai faire du dessin avec openGL mais vue que je passe par un openscreen, le openscreen a par defaut et naturelement 2 buffer qui de swap (échange les image, affiché et l'autre qui peu etre édité), se que je voudrai c'est faire que mes operation sois dupliqué sur les 2 buffer en meme temps, donc sois avec 1 seul buffer unique, donc pas de flipbuffer, un peu comme un canvas ou image unique que j'affiche
soit avoir la possibilité de cloné le buffer edité avec le buffer affiché, donc changé par exemple, un pointeur memoir pour n'avoir que 1 seul buffer unique mais commun au 2 frame, donc ne plus avoir de mise en tampon et ne plus faire de flipbuffer
Nemerod : Tu as parfaitement résumé ce que je demandais !!! :arrow: :idea:
Je n'ai jamais fait de canvas. Peux tu me le faire (en exemple) ?
http://HexaScrabble.com/
!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.00 - 64 bits
nemerod
Messages : 34
Inscription : mer. 24/août/2022 0:58

Re: Dessin sur écrans qui se swap

Message par nemerod »

SPH a écrit : mer. 15/nov./2023 21:00
nemerod a écrit : mer. 15/nov./2023 19:55
SPH a écrit : mer. 08/nov./2023 8:51 Salut a tous et toutes, :D

Ca alors, SPH qui poste un code !! Ca faisait longtemps...

Bon, je voudrais savoir une chose : quand on dessine (par exemple un triangle) sur un écran et qu'on swap l'écran, ce 2eme écran n'a pas ce triangle. Il faut le redessiner une fois.
Comment faire que le dessin s'applique sur les 2 écrans qui se swap ?


tien tien, il semble que tous le monde n'a pas comprit la demande, je vais donc faire une traduction, @SPH corrige moi si besoin

SPH demande >
je voudrai faire du dessin avec openGL mais vue que je passe par un openscreen, le openscreen a par defaut et naturelement 2 buffer qui de swap (échange les image, affiché et l'autre qui peu etre édité), se que je voudrai c'est faire que mes operation sois dupliqué sur les 2 buffer en meme temps, donc sois avec 1 seul buffer unique, donc pas de flipbuffer, un peu comme un canvas ou image unique que j'affiche
soit avoir la possibilité de cloné le buffer edité avec le buffer affiché, donc changé par exemple, un pointeur memoir pour n'avoir que 1 seul buffer unique mais commun au 2 frame, donc ne plus avoir de mise en tampon et ne plus faire de flipbuffer
Nemerod : Tu as parfaitement résumé ce que je demandais !!! :arrow: :idea:
Je n'ai jamais fait de canvas. Peux tu me le faire (en exemple) ?
global QUOTE_DEEP+1
debug QUOTE_DEEP;3
debug "qui sera le prochaine a faire une citation et gardé tous les message pour avoir une citation défini par récurrence"

alors c'est pas que je veux pas, mais je suis désolé, mais j'utilise pas vraiment openGL, en temps normal tous devrai etre noté dans la doc
donc pour la parti 3D de openGL c'est mort pour moi, j'ai fais l'impasse

tu peu aussi voir pour passé via un CanvasGadget a la place de OpenGLGadget

j'utilise surtout le CanvasGadget avec la lib 2D drawing, si se n'est une image qui n'est pas prévus pour etre affiché sur le screen mais qui fais buffer pour des operation de masse, ton bonheur devrai se trouvé dans le CanvasGadget

apres, je sais pas si openGL passe sur un CanvasGadget, la c'est terre inconnu pour moi, mais si on veux etre un minimum logique, le openGL c'est des fonction de dessin avancé qui place des pixel selon se que on lui demande, donc en tout logique, le OpenGLGadget a 2 buffer, mais en affiche que 1 puis l'autre a chaque flip, alors que le canvas c'est 1 buffer affiché, mais une copie du buffer le temps que tu édite le canvas et une fois fais, il l'affiche direct et garde une copy pour une future edition, donc faut juste trouvé au niveau de openGL une fonction qui permé de définir un buffer personnalisé ou un truc dans le style, je sais qu'avec des image, je fais joujou avec les pointer dans tous sense, surtout quant je change la resolution en direct live de l'image sans changé le contenu, ou pour tous simplement faire 3 tonne de startdrawing en meme temps sur plusieur element sans fais de stopdrawing, donc au niveau de l'api de openGL il devrai y avoir un truc pour n'avoir que buffer si se n'est de mettre un buffer custom comme une image ou un canvas si se n'est un sprite

voila une section vierge avec un canvas

Code : Tout sélectionner

Global qqx.q  =0800:Global tqx:tqx=qqx>>1;taille de la surface par defaut, et demi valeur axe X
Global qqy.q  =0600:Global tqy:tqy=qqy>>1;meme chose mais axe Y
Global gmx.q  =0000;variable global souri position X
Global gmy.q  =0000;meme chose mais Y
Global foc.q  =0000;move windows

Procedure.q pmb(X,Y,LX,LY);test zone position (BOX_2D     +MOUSE      (retour 0 ou 1 si dans la zone))
  !mov rax,[v_gmx]
  !mov rbx,[v_gmy]
  !sub rax,[p.v_X]
  !sub rbx,[p.v_Y]
  !mov rcx,[p.v_LX]
  !mov rdx,[p.v_LY]
  !sub rcx,rax
  !sub rdx,rbx
  !dec rcx
  !dec rdx
  !or  rcx,rdx
  !or  rcx,rbx
  !or  rcx,rax
  !sar rcx,31
  !shl ebx,16
  !mov rax,rcx
  !inc rax    ;0 ou 1
  ProcedureReturn ;via eax (0=out / 1=in )
EndProcedure
Procedure.q pmg(mmm)
  !xor rax,rax
  !MOV rcx,[p.v_mmm]
  !MOV al,cl
  !shl rax,8
  !MOV al,cl
  !shl rax,8
  !MOV al,cl
  ProcedureReturn
EndProcedure

OpenWindow(0,170,100,qqx,qqy,"demo et base avec un canvas pour SPH",#PB_Window_BorderLess)
CanvasGadget(0,0,0,qqx,qqy)
RemoveKeyboardShortcut(0,#PB_Shortcut_All)
Repeat:eee=WindowEvent()
  gmx=(DesktopMouseX()-WindowX(0,1));souri   position X absolu
  gmy=(DesktopMouseY()-WindowY(0,1));sourire position Y absolu
  Select eee
    Case $000
      If foc=1:ResizeWindow(0,DesktopMouseX()-tmx,DesktopMouseY()-tmy,#PB_Ignore,#PB_Ignore):EndIf
      If StartDrawing(CanvasOutput(0)):DrawingMode(#PB_2DDrawing_AlphaBlend)
        ;====================
        ; MAIN FRAME
        Box(0,0,qqx,qqy,$ff000000);clear screen (remove me if you want keep last frame)
        
        
        
        ;fais tes dessin et rendu ici
        
        
        
        
        
        ;====================
        ; MAIN TITRE & BORDER
        DrawingMode(#PB_2DDrawing_AlphaBlend|#PB_2DDrawing_Transparent)
        DrawText(26,4,GetWindowTitle(0),$ffffffff,$00000000);texte titre
        temp=$80ffffff|(pmb(qqx-24,0,24,24)*$ff000000);check hover close button
        For a = 3 To 18:Box((qqx-24)+a,a,2,2,temp):Box((qqx-03)-a,a,2,2,temp):Next;close button drawing
        For a = 0 To 15:Box(0,a,qqx,1,pmg((15-a)<<4)|$70ff0000):Next;visuel bar de titre top 16px
        Box(    0,    16,qqx  ,     8,$70ff0000);visuel bar de titre to 24px
        Box(    4,     4,   16,    16,$7000ff00);ICON 16x16 custom here
        Box(    0,    24,    1,qqy-24,$70ff0000);side bordel
        Box(qqx-1,    24,    1,qqy-24,$70ff0000);side bordel
        Box(    1,qqy- 1,qqx-2,     1,$70ff0000);bottom border
        
          
        StopDrawing()
      EndIf
      Delay(16)
    Case $202:foc=0
    Case $201,$203;clic gauche / double clic gauche
      tmx=gmx:foc=pmb(     0,  0,qqx-24, 24);ultra compact IF for title bar + close button test and temp cursor location
      tmy=gmy:eee=pmb(qqx-24,  0,    24, 24)*#PB_Event_CloseWindow
      
    Case $100;:Debug EventlParam()
      temp=EventwParam()
      Select temp
        Case $26,$5a;UP     / Z;
        Case $28,$53;DOWN   / S;
        Case $27,$51;GAUCHE / Q;
        Case $25,$44;DROIT  / D;
        Case $1B;ECHAP  ;
          eee=#PB_Event_CloseWindow
        Case $0D;ENTER;
        Case $60;NUMPAD_0;
        Case $09;TAB     ;
        Case $DE;²       ;
        Case $70;F1      ;
        Case $71;F2      ;
        Case $72;F3      ;
        Case $73;F4      ;
        Case $74;F5      ;
        Case $75;F6      ;
        Case $76;F7      ;
        Case $77;F8      ;
        Case $78;F9      ;
        Case $79;F10     ;
        Case $7a;F11     ;
        Case $7b;F12     ;
        Default;:Debug temp
      EndSelect
    Default
  EndSelect
Until eee=#PB_Event_CloseWindow
;EDIT: oui je sais, je me suis donné la penne de faire le openwindows en borderless et de faire moi meme une barre de titre transparent pour se qu'il y a dans l'application le tous avec un petit visuel sous la forme de dégradé de couleur, et il y a meme l'icon pour coupé le programme avec le visuel qui va avec en discretion, la couleur des bordure peu etre custom par autre chose que du bleu pure, et oui je sais, made in nemerod GPT, ne sois pas étonné si tu sais pas comment il marche vraiment pour les element qui demande en temps normal un IF, c'est la magie nemerod
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Dessin sur écrans qui se swap

Message par Ollivier »

@nemerod

non non : il n'y a pas de liens entre le canvas et l'un ou l'autre des écrans "screen" et "opengl".

À la limite, tu peux avoir un lien entre OpenGLgadget et OpenScreen, si (et seulement si) le sous-système utilisé (par les fonctions de screen) est "opengl" (a contrario du/des sous-système(s) "directx").

Note : le sous-système est précisé par le programmeur dans les options de compilation.

Je t'invite franchement à tenter le screen. Question de créativité, ça peut te convenir beaucoup. C'est nettement plus rapide (c'est le but du screen - comme de l'opengl).

Fais une procédure qui simplifie TransformSprite() et dessine dans des sprites : tu vas voir le moulin à purée.

@sph

Il me semble qu'il y a une option de "double buffering" à désactiver quelquepart.

Quand il n'y avait pas de fonction openGLgadget(), il fallait ouvrir et lier un écran openGL à une fenêtre pour que ça s'affiche. Et là, on choisissait le double-buffering ou pas.

Soit l'option openGL est modifiable à la volée.
Soit non, dans ce cas, tu l'as derrière l'oreille.
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Dessin sur écrans qui se swap

Message par Ollivier »

source du texte

<<

Single Buffering

Single buffering works by sending the image OpenGL has generated to the graphics card and then to the monitor as soon as you call glFlush(). In an ideal world, the monitor would show this in real-time as soon as it was sent from the graphics card. Unfortunately in the real-world we have monitor refresh times, this is the speed at which the monitor pushes out a complete image on the screen. If you send images to the monitor outside of its refresh rate, then you are going to be missing quite a few frames as the graphics card can push out images much faster than the monitor can receive them. Because of these two devices are not acting in sync, you find that you don’t see a lot of what is going on and you end up with a garbled mess on the screen.

>>

Traduction en français : << le cinglant tampon, c'est-à-dire le contraire du double-buffering, pardon, le contraire du double tampon, ça sent un petit parfum pas écolo. En effet, the sync, la synchro, ce fabuleux douanier qui vient stopper les hardeurs... Stopper les ardeurs des dessins qui arrivent à fond de balle sur un écran qui se met à jour plus lentement... Etc, conclusion, ça pue. >>
Répondre