[Résolu] Souci avec le sous system OpenGl

Généralités sur la programmation 3D
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

[Résolu] Souci avec le sous system OpenGl

Message par falsam »

J'ai un souci avec une application 3D de quelques milliers de lignes et le sous system OpenGL.

Toutes mes textures sont noires.

J'ai réduit cette application au stricte nécessaire de manière à reproduire cette erreur de comportement.

:arrow: http://falsam.com/download/purebasic/OSE.zip (Source + Assets)

Au lancement vous devriez avoir un cube avec une texture blanche.

Appliquez lui une autre texture que vous sélectionnerez en cliquant sur le bouton [?]

Le cube sera noir !

Après avoir quitter l'exécution, supprimer le sous system OpenGL et recommencez l'opération.

La texture sera cette fois çi sera correct.

Merci de votre aide.
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%
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Souci avec le sous system OpenGl

Message par falsam »

A priori ce n'est pas un bug avec OpenGL mais un souci avec mon code.

Si dans la procédure EntityUpdate() qui mettra à jour le cube, je remplace

Code : Tout sélectionner

\imagefile  = GetGadgetText(#mfImageFile) 
par

Code : Tout sélectionner

\imagefile = "D:\Purebasic Project\3D\OGRE Scene Editor 0\assets\textures\crate.png"
le cube aura bien la bonne texture.

Et pourtant GetGadgetText(#mfImageFile) retourne bien la valeur "D:\Purebasic Project\3D\OGRE Scene Editor 0\assets\textures\crate.png"

Etrange ....
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%
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Souci avec le sous system OpenGl

Message par djes »

Les espaces ?
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Souci avec le sous system OpenGl

Message par falsam »

Un autre test que je viens de faire.

Dans la procédure ScreenLoad() si je force le changement de texture à la place du sélecteur de texture, là aussi le rendu est normal.

Juste aprés EntityCreate() de la procédure ScreenLoad() j'ai forcé le changement de cette texture de cette maniére

Code : Tout sélectionner

  SetGadgetText(#mfImageFile, "D:\Purebasic Project\3D\OGRE Scene Editor 0\assets\textures\crate.png")
  EntityOperation = 1 ;Mode Modification
  EntityUpdate()
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%
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Souci avec le sous system OpenGl

Message par falsam »

djes a écrit :Les espaces ?
j’espère que non ;)
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%
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Souci avec le sous system OpenGl

Message par djes »

Compare les espaces mémoires des chaînes avec le débogueur pour voir la différence...
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Souci avec le sous system OpenGl

Message par falsam »

djes a écrit :Compare les espaces mémoires des chaînes avec le débogueur pour voir la différence...
Ok mais je te rappelle que sans sous system OpenGL je n'ai pas de souci.
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%
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Souci avec le sous system OpenGl

Message par djes »

Oui, mais il vaut mieux d'abord éliminer les causes «évidentes».
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Souci avec le sous system OpenGl

Message par falsam »

Pas de souci de longueur.
Que je sélectionne le fichier ou que je force avec la valeur de ce fichier, MemorySize() est le même.

Et de toute façon la texture 3D du fichier existe bien.
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%
Avatar de l’utilisateur
venom
Messages : 3072
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: Souci avec le sous system OpenGl

Message par venom »

En effet, avec opengl j’obtiens un cube noir. Alors qu'avec directx9 j'ai bien un cube texturer. (le chemin est sans espace chez moi)






@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Souci avec le sous system OpenGl

Message par djes »

Le plus fort est que ça fonctionne même quand le chemin en dur est faux ;)
En fait, ça fonctionne car il prend la texture qui est chargée au démarrage. Après, ça ne fonctionne pas non plus avec le chemin en dur. Apparemment, le changement dynamique ne fonctionne pas en opengl, même avec des chemins relatifs.

Ligne 273:

Code : Tout sélectionner

    ; Updating the entity
    With Entities()
      \typeMesh   = 1
      Global dd
      ;\imagefile.s  = GetGadgetText(#mfImageFile) 
      ;ShowMemoryViewer(@Entities()\imagefile, 256)
      If dd = 0
        \imagefile = "grass.png" ;pas besoin de mettre le chemin
      Else
        \imagefile = "crate.png"
      EndIf
      dd=1-dd
      ;ShowMemoryViewer(@Entities()\imagefile, 256)
      GadgetToolTip(#mfImageView, \imagefile)      
    EndWith
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Souci avec le sous system OpenGl

Message par falsam »

djes a écrit :Le plus fort est que ça fonctionne même quand le chemin en dur est faux
Ha non ca c'est normal et c'est lié au fonctionnement d'OGRE.

le ou les chemins d'accés des medias sont définis avec la fonction Add3DArchive()
Exemple : Add3DArchive("assets\textures\", #PB_3DArchive_FileSystem)

A partir de là pour charger une texture on utilisera le nom du fichier sans son chemin
Exemple : LoadTexture(#PB_Any, "crate.png")

Dans ma variable \imagefile je met le chermin complet pour l'affichage 2d de la texture.
\imagefile = "D:\Purebasic Project\3D\OGRE Scene Editor 0\assets\textures\crate.png"

Pour le rendu 3D de la texture je garde que le nom du fichier avec la fonction GetFilePart() puis j'utilise LoadTexture() pour charger la texture.

Code : Tout sélectionner

filePart = GetFilePart(\imagefile)
LoadTexture(#PB_Any, FilePart)
Tout ca ne m'aide pas à résoudre ce souci :wink:
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%
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Souci avec le sous system OpenGl

Message par falsam »

J'ai crée un code plus court qui permet ou pas de choisir une texture. Cette fois ci, mode Opengl ou pas la texture apparaît correctement.

Le sous system OpenGL n'est donc pas en cause. J'ai un souci avec l'écriture de mon code précédent qui n'affiche pas la texture si compilation OpenGL.

Mais ou ??????
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%
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Souci avec le sous system OpenGl

Message par falsam »

OOops j'ai oublié de poster le code

Code : Tout sélectionner

EnableExplicit

IncludePath "core"

Enumeration window
  #mf 
EndEnumeration

Declare Start()
Declare Exit()

If InitEngine3D(#PB_Engine3D_DebugLog ) And  InitKeyboard() And InitSprite() And InitMouse() And InitSound()
  Start()
Else
  MessageRequester("Information", "Erreur init 3D")
  End
EndIf  

Start()

Procedure Start()      
  Protected header, camera, light, mesh, texture, material, entity, fileName.s, filePath.s 
  Protected assetsDir.s = #PB_Compiler_Home + "Examples\3D\Data\Textures\"
  
  OpenWindow(#mf, 0, 0, 1024, 768, "test", #PB_Window_SystemMenu | #PB_Window_MaximizeGadget | #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered | #PB_Window_SizeGadget)
  OpenWindowedScreen(WindowID(#mf), 0, 0, 1024 , 768)    
  BindEvent(#PB_Event_CloseWindow, @exit())
  
  ; Add3DArchive & Parse
  Add3DArchive(assetsDir, #PB_3DArchive_FileSystem)
  Parse3DScripts()
  
  ; [2D]  
  Header = CreateSprite(#PB_Any, 1024, 32, #PB_Sprite_AlphaBlending)
  
  ; [3D]      
  Camera = CreateCamera(#PB_Any, 0, 0, 100, 100)
  CameraBackColor(Camera, RGB(169, 169, 169))
  MoveCamera(Camera, 2, 4, 8)
  CameraLookAt(Camera, 0, 0, 0)
  
  Light = CreateLight(#PB_Any, RGB(255, 255, 255), -2000, 2000, 1000)
  
  ; Préparation de l'entité
  mesh = CreateCube(#PB_Any, 2)
  
  fileName.s = OpenFileRequester("Select image ...", assetsDir, "Image (png, jpg)|*.png;*.jpg", 0)
  If fileName =""
    fileName = assetsDir + "caisse.png"
  EndIf
  
  filePath = GetFilePart(fileName)  
  texture  = LoadTexture(#PB_Any, filePath)
  material = CreateMaterial(#PB_Any, TextureID(texture))
  entity   = CreateEntity(#PB_Any, MeshID(mesh), MaterialID(material))    
  
  ;-Loop
  Repeat
    Repeat : Until WindowEvent() = 0
    FlipBuffers()  
    
    ExamineKeyboard()
    If KeyboardReleased(#PB_Key_Escape)
      exit()
    EndIf
   
    RenderWorld()
    
    If StartDrawing(SpriteOutput(Header))
      Box(0, 0, SpriteWidth(Header), SpriteHeight(Header), RGBA(0, 0, 0, 0))
      DrawingMode(#PB_2DDrawing_AlphaChannel)
      Box(0, 0, SpriteWidth(Header), SpriteHeight(Header), RGBA(0, 0, 0, 110))
      DrawingMode(#PB_2DDrawing_Transparent)
      
      ; FPS
      DrawText(5, 5, "FPS: " + Str(Engine3DStatus(#PB_Engine3D_CurrentFPS)))
      StopDrawing()
    EndIf
    DisplayTransparentSprite(header, 0, 0)
  ForEver
EndProcedure

Procedure Exit()
  End
EndProcedure
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%
G-Rom
Messages : 3627
Inscription : dim. 10/janv./2010 5:29

Re: Souci avec le sous system OpenGl

Message par G-Rom »

Les sprites de PB ne font pas bon ménage avec Ogre & Opengl , le mieux est de sauvegardé l'état d'opengl avant le displaysprite et de "popé" ensuite l'état :
je pense que cela devrais fonctionné :

Code : Tout sélectionner

    glPushAttrib_(#GL_ALL_ATTRIB_BITS)
    DisplayTransparentSprite(Header, 0, 0) 
    glPopAttrib_()
si GL_ALL_ATTRIB_BITS n'est pas déclaré , la constante vaut : $000FFFFF
Répondre