Page 1 sur 2

Effet miroir

Publié : jeu. 16/févr./2023 12:02
par falsam
C'est un essai de reflection de l'environnement 3D.
Testé avec PB 5.73 et PB 6.0

■ Objectif: Création d'un sol miroir sur lequel se projette le ciel, un cube et une sphére.

■ Comment ca fonctionne ?
Une caméra principale.

:arrow: Ajout d'une caméra miroir.
- Création d'une texture qui sera le reflet de la caméra miroir.
- Création d'une matière (Material) basée sur cette texture de projection.
- Active la texturation projective en spécifiant la camera miroir à utiliser.

:arrow: Le reflet final se projetant sur le sol, on ajoute la matière du sol à la matière précédente.

:arrow: La mise à jour du rendu se fera dans la boucle de rendering de votre code.

■ Code commenté. Escape ou bouton milieu de la souris pour quitter

Code : Tout sélectionner

; Effet miroir
; 
; PureBasic 5.73,  6.0

EnableExplicit

; Caméras
Define Camera, CameraMirror, CameraTexture, Rot.f

; Entités
Define Mesh, Material, Ground, Sphere, Cube

; DeltaTime
Global dt.f

; Initialisatio environnement 3D
ExamineDesktops()
InitEngine3D(#PB_Engine3D_DebugLog) : InitSprite() : InitKeyboard() : InitMouse()
OpenScreen(DesktopWidth(0), DesktopHeight(0), 32, "Effet mirroir")

; Localisation des assets
Add3DArchive(#PB_Compiler_Home + "examples\3D\Data\Textures", #PB_3DArchive_FileSystem)
Add3DArchive(#PB_Compiler_Home + "Examples/3D/Data/Packs/desert.zip", #PB_3DArchive_Zip)

; Un peu de lumiere
CreateLight(#PB_Any, RGB(255, 255, 255), 10, 10, 10)

SkyBox("desert07.jpg")

; Camera principale
Camera = CreateCamera(#PB_Any, 0, 0, 100, 100)

; Camera mirroir
CameraMirror = CreateCamera(#PB_Any, 0, 0, 100,100)

; Texture associé à la camera mirroir qui sera plaquée sur le sol
CameraTexture = CreateRenderTexture(#PB_Any, CameraID(CameraMirror), 512, 512, #PB_Texture_AutomaticUpdate)

; Création du material basé sur la texture caméra
Material = CreateMaterial(#PB_Any, TextureID(CameraTexture))

; Active la texturation projective en spécifiant la camera à utiliser.
SetMaterialAttribute(Material, #PB_Material_ProjectiveTexturing, CameraMirror)

; Ajoute une nouvelle couche à notre material
AddMaterialLayer(Material,TextureID(LoadTexture(#PB_Any, "MRAMOR6X6.jpg")), #PB_Material_Modulate)

; Création des différents entités (Sol, Sphere, Cube)
Mesh = CreatePlane(#PB_Any, 100, 100, 1, 1, 4, 4)
Ground = CreateEntity(#PB_Any, MeshID(Mesh), MaterialID(Material))

Mesh = CreateSphere(#PB_Any, 5)
Material = CreateMaterial(#PB_Any, TextureID(LoadTexture(#PB_Any, "RustySteel.jpg")))
Sphere = CreateEntity(#PB_Any, MeshID(Mesh), MaterialID(Material))
MoveEntity(Sphere, -10, 5, 0)

Mesh = CreateCube(#PB_Any, 6)
Material = CreateMaterial(#PB_Any, TextureID(LoadTexture(#PB_Any, "caisse.png")))
Cube = CreateEntity(#PB_Any, MeshID(Mesh), MaterialID(Material))
MoveEntity(Cube, 10, 5, 0)

; Boucle 3D
Repeat
  ExamineKeyboard()
  ExamineMouse()
  
  ; Rotation des entités
  RotateEntity(Sphere, 20*dt, 20*dt, 20*dt, #PB_Relative)
  RotateEntity(Cube, 20*dt, 20*dt, 20*dt, #PB_Relative)
  
  ; Rotation de la camera principale
  Rot + 0.3*dt
  MoveCamera(Camera, Cos(Rot)*50, 15, Sin(Rot)*50, #PB_Absolute)
  CameraLookAt(Camera, 0, 0, 0)
  
  ; Affichage de la camera miroir sur le sol  
  CameraReflection(CameraMirror, Camera, EntityID(Ground))
  
  ; Rendering
  dt = RenderWorld()/1000
  FlipBuffers()    
Until KeyboardReleased(#PB_Key_Escape) Or MouseButton(#PB_MouseButton_Middle)
25 Février 2023 - Ouverture full screen.

Re: Effet miroir

Publié : jeu. 16/févr./2023 16:21
par Micoute
Intéressant, j'aime bien. Bravo falsam

Re: Effet miroir

Publié : jeu. 16/févr./2023 23:24
par SPH
Ouai, ça marche ici aussi. Merci 😋

Re: Effet miroir

Publié : ven. 17/févr./2023 1:10
par G-Rom

Code : Tout sélectionner

InitEngine3D(#PB_Engine3D_DebugLog) : InitSprite() : InitKeyboard() : InitMouse()
OpenWindow(0, 0, 0, 0, 0, "", #PB_Window_Maximize | #PB_Window_BorderLess)
OpenWindowedScreen(WindowID(0),0, 0, WindowWidth(0) , WindowHeight(0)) 
ca ne marche pas ici, il faut utilisé le bon vieux examinedesktop()
Attention a la taille de la texture et l'update auto , ca peu faire ramé grave une petite config.

Re: Effet miroir

Publié : ven. 17/févr./2023 15:13
par falsam
Bonjour G-Rom. Merci d'avoir jeter un oeil sur ce test de reflection.
G-Rom a écrit : ven. 17/févr./2023 1:10 il faut utilisé le bon vieux examinedesktop()
je n'avais pas de souci d'affichage dans ce petit code de test. Je vais attendre un peu plus de remontés de test :wink:
G-Rom a écrit : ven. 17/févr./2023 1:10 Attention a la taille de la texture et l'update auto , ca peu faire ramé grave une petite config.
C'est les texture qui se trouvent dans le dossier d'installation de PureBasic. Si chez certains ca rame, c'est peut être parce qu'ils n'ont pas d'ordinateurs dédiés aux jeux. Les éditeurs de jeux proposent dans leurs paramétrages de désactiver les effets d'ombres et de reflets.

Re: Effet miroir

Publié : ven. 17/févr./2023 16:31
par G-Rom
falsam a écrit : ven. 17/févr./2023 15:13:
G-Rom a écrit : ven. 17/févr./2023 1:10 Attention a la taille de la texture et l'update auto , ca peu faire ramé grave une petite config.
C'est les texture qui se trouvent dans le dossier d'installation de PureBasic. Si chez certains ca rame, c'est peut être parce qu'ils n'ont pas d'ordinateurs dédiés aux jeux. Les éditeurs de jeux proposent dans leurs paramétrages de désactiver les effets d'ombres et de reflets.
Je parlais de la texture de rendu , celle offscreen qui permet le reflet , tu peut la faire plus petite que la taille de ton écran pour avoir de meilleurs perfs sur les petites config.

Re: Effet miroir

Publié : ven. 17/févr./2023 16:43
par falsam
G-Rom a écrit : ven. 17/févr./2023 16:31Je parlais de la texture de rendu
Tu as raison. Une texture de projection de la taille de l'écran doit pénaliser les petite configurations. Ta configuration ne risque pas de tousser :mrgreen:

Ceci dit il ne faut pas trop réduire la taille de la texture de projection. Ca sera au détriment de la qualité de la projection. En dessous de 512x512 c'est très moche.

Re: Effet miroir

Publié : ven. 17/févr./2023 16:50
par G-Rom
Effectivement en 512 cela peut être moche, mais une réflexion parfaite n'existe pas, tu pourrais récupéré la texture de rendu et appliqué une passe de gaussian blur , avec un masque légèrement bruité après pour laisser passé la réflexion ou pas effet garanti :)

Re: Effet miroir

Publié : lun. 20/févr./2023 16:26
par falsam
Modification du code.
- Modification sur la façon d'ouvrir la fenêtre principale.
- Ajout d'un delta time.
- Diminution de la taille de la texture de reflection. 512x512 au lieu de la taille du screen.

Pouvez vous tester à nouveau le code du premier message et me faire part de votre ressenti. D'avance merci.

Re: Effet miroir

Publié : lun. 20/févr./2023 17:17
par G-Rom
toujours le même soucis de rendu plus petit , vire le #pb_maximise et c'est résolu.
quand a l'utilisation du dt... :D je te laisse lire l'autre topic : viewtopic.php?p=214692#p214692

Re: Effet miroir

Publié : sam. 25/févr./2023 15:34
par falsam
G-Rom a écrit : lun. 20/févr./2023 17:17 toujours le même soucis de rendu plus petit , vire le #pb_maximise et c'est résolu.
La fenêtre principale ne servant à rien. Autant la supprimer :wink:

Modification du code figurant dans le premier message. Utilisation de OpenScreen() au lieu de OpenWindowedScreen()

Re: Effet miroir

Publié : sam. 25/févr./2023 15:41
par SPH
Le reflet est assez grossier...

Re: Effet miroir

Publié : sam. 25/févr./2023 15:46
par falsam
SPH a écrit : sam. 25/févr./2023 15:41 Le reflet est assez grossier...
C'est surement la faute de G-Rom :mrgreen:

Tu peux augmenter la taille de la texture de reflection pour voir si c'est mieux.

Code : Tout sélectionner

; Texture associé à la camera mirroir qui sera plaquée sur le sol
CameraTexture = CreateRenderTexture(#PB_Any, CameraID(CameraMirror), 512, 512, #PB_Texture_AutomaticUpdate)
remplace par exemple par

Code : Tout sélectionner

; Texture associé à la camera mirroir qui sera plaquée sur le sol
CameraTexture = CreateRenderTexture(#PB_Any, CameraID(CameraMirror), 1024, 800, #PB_Texture_AutomaticUpdate)
Ceci dit, tu aurais un screenshoot s'il te plait ?

Re: Effet miroir

Publié : sam. 25/févr./2023 16:00
par SPH
Image

Re: Effet miroir

Publié : sam. 25/févr./2023 16:07
par falsam
C'est affreux ce crénelage du reflet !!! Ca doit être mieux avec une texture de reflection en 1024 x 800 ou de la taille du screen. Avec ta configuration ca ne doit pas être un souci.