Page 1 sur 2

[Résolu] Souci avec le sous system OpenGl

Publié : jeu. 04/juil./2019 18:44
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.

Re: Souci avec le sous system OpenGl

Publié : jeu. 04/juil./2019 18:49
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 ....

Re: Souci avec le sous system OpenGl

Publié : jeu. 04/juil./2019 19:09
par djes
Les espaces ?

Re: Souci avec le sous system OpenGl

Publié : jeu. 04/juil./2019 19:10
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()

Re: Souci avec le sous system OpenGl

Publié : jeu. 04/juil./2019 19:10
par falsam
djes a écrit :Les espaces ?
j’espère que non ;)

Re: Souci avec le sous system OpenGl

Publié : jeu. 04/juil./2019 19:12
par djes
Compare les espaces mémoires des chaînes avec le débogueur pour voir la différence...

Re: Souci avec le sous system OpenGl

Publié : jeu. 04/juil./2019 19:13
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.

Re: Souci avec le sous system OpenGl

Publié : jeu. 04/juil./2019 19:16
par djes
Oui, mais il vaut mieux d'abord éliminer les causes «évidentes».

Re: Souci avec le sous system OpenGl

Publié : jeu. 04/juil./2019 19:25
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.

Re: Souci avec le sous system OpenGl

Publié : jeu. 04/juil./2019 19:40
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)






@++

Re: Souci avec le sous system OpenGl

Publié : jeu. 04/juil./2019 20:08
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

Re: Souci avec le sous system OpenGl

Publié : ven. 05/juil./2019 15:15
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:

Re: Souci avec le sous system OpenGl

Publié : ven. 05/juil./2019 16:18
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 ??????

Re: Souci avec le sous system OpenGl

Publié : ven. 05/juil./2019 16:43
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

Re: Souci avec le sous system OpenGl

Publié : ven. 05/juil./2019 16:59
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