Effet miroir

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

Effet miroir

Message 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.
Configuration : Windows 11 Famille 64-bit - PB 6.20 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
Micoute
Messages : 2583
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Effet miroir

Message par Micoute »

Intéressant, j'aime bien. Bravo falsam
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
SPH
Messages : 4944
Inscription : mer. 09/nov./2005 9:53

Re: Effet miroir

Message par SPH »

Ouai, ça marche ici aussi. Merci 😋

!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.12LTS- 64 bits
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Effet miroir

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

Re: Effet miroir

Message 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.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Effet miroir

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

Re: Effet miroir

Message 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.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Effet miroir

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

Re: Effet miroir

Message 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.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Effet miroir

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

Re: Effet miroir

Message 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()
Configuration : Windows 11 Famille 64-bit - PB 6.20 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
SPH
Messages : 4944
Inscription : mer. 09/nov./2005 9:53

Re: Effet miroir

Message par SPH »

Le reflet est assez grossier...

!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.12LTS- 64 bits
Avatar de l’utilisateur
falsam
Messages : 7323
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Effet miroir

Message 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 ?
Configuration : Windows 11 Famille 64-bit - PB 6.20 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
SPH
Messages : 4944
Inscription : mer. 09/nov./2005 9:53

Re: Effet miroir

Message par SPH »

Image

!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.12LTS- 64 bits
Avatar de l’utilisateur
falsam
Messages : 7323
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Effet miroir

Message 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.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Répondre