Water & Shadow

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 :

Water & Shadow

Message par falsam »

Suivant le system d'ombrage (shadow) utilisé, l'eau n’apparaît pas et/ou l'ombre des objets disparaît.

Avec cet exemple nous avons bien de l'eau mais le cube ne génère pas son ombre sur le sol.

Code : Tout sélectionner

EnableExplicit

InitEngine3D() 
InitSprite() 

OpenWindow(0, 0, 0, 800, 600, "Shadow", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0), 0, 0, 800, 600, 0, 0, 0)

; Assets directory
Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/Textures", #PB_3DArchive_FileSystem)
Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/Water", #PB_3DArchive_FileSystem)
Add3DArchive(#PB_Compiler_Home + "Examples/3D/Data/Packs/desert.zip", #PB_3DArchive_Zip)

; Light
CreateLight(#PB_Any, RGB(255, 255, 255), 1000, 1000, -500); , #PB_Light_Point)

; Camera
Define Camera = CreateCamera(#PB_Any, 0, 0, 100, 100)
MoveCamera(Camera, -400, 200, 600)
CameraLookAt(Camera, 0, 0, 0)

; Shadow Yes - Water No
;WorldShadows(#PB_Shadow_Modulative, 1000, RGB(105, 105, 105), 2048)       
;WorldShadows(#PB_Shadow_Additive, 1000, RGB(105, 105, 105), 2048) 

; Shadow No - Water Yes
WorldShadows(#PB_Shadow_TextureModulative, 1000, RGB(105, 105, 105), 2048) ; Shadow No - Water Yes
;WorldShadows(#PB_Shadow_TextureAdditive, 1000, RGB(105, 105, 105), 2048)

; Materials
Define Ground_Mat = CreateMaterial(#PB_Any, TextureID(LoadTexture(#PB_Any, "soil_wall.jpg")))
ScaleMaterial(Ground_Mat, 0.5, 0.5)
Define Crate_Mat = CreateMaterial(#PB_Any, TextureID(LoadTexture(#PB_Any, "caisse.png")))

; Meshes
Define Box_Mesh = CreateCube(#PB_Any, 1)

; Entities
Define Ground = CreateEntity(#PB_Any, MeshID(Box_Mesh), MaterialID(Ground_Mat), 0, -15, 0)
ScaleEntity(Ground, 500, 20, 500) 
;EntityRenderMode(Ground, #PB_Shadow_None)

Define Crate = CreateEntity(#PB_Any, MeshID(Box_mesh), MaterialID(Crate_Mat), 0, 45, 0)
ScaleEntity(Crate, 100, 100, 100) 

; Sky
SkyBox("desert07.jpg")

; Water
CreateWater(Camera, 0, -17.5, 0, 0, #PB_World_WaterLowQuality | #PB_World_WaterSmooth | #PB_World_WaterSun)
WaterColor(Camera, RGB(72, 209, 204))

; Loop
Repeat
  RenderWorld()
  FlipBuffers()
Until WindowEvent() = #PB_Event_CloseWindow
■ Pour générer l'ombre du cube sur le sol il faut utiliser la fonction EntityRenderMode() avec le flag #PB_Shadow_None ce qui me parait étrange quand on regarde l'aide associé à cette fonctionnalité.

Décommenter la ligne

Code : Tout sélectionner

EntityRenderMode(Ground, #PB_Entity_None)
et relancer l'exécution pour voir le résultat : L'ombre du cube est bien formée sur le sol.

■ Souci avec l'eau si on utilise le flag #PB_Shadow_Modulative ou #PB_Shadow_Additive avec la fonction WorldShadows()

Commentez la ligne

Code : Tout sélectionner

WorldShadows(#PB_Shadow_TextureModulative, 1000, RGB(105, 105, 105), 2048) ; Shadow No - Water Yes
et decommentez

Code : Tout sélectionner

WorldShadows(#PB_Shadow_Modulative, 1000, RGB(105, 105, 105), 2048)
Relancez l'exécution : Plus d'eau !
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%
crisot
Messages : 98
Inscription : lun. 30/août/2004 21:03

Re: Water & Shadow

Message par crisot »

Ca ne fera pas avancer ton problème, mais ici le rendu est ce qu'il est censé être:

-Pas d'ombre avec le code de base.
-Ombre en décommentant "EntityRenderMode(Ground, #PB_Entity_None)" + eau OK.
-Ombre + eau OK en échangeant les 2 lignes "WorldShadows(...)".

GTX970 + drivers à peu prêt à jour (2 mois maxi).
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Water & Shadow

Message par Ollivier »

Je pense qu'il faut relativiser ce type de problème. En parler, oui, tenter de solutionner si possible, en faire part en bug report aussi, pour augmenter les chances d'analyses et d'amélioration.

Mais, j'ai souvenir d'une 3D Ogre vraiment loopée qui n'était que de la 2D+ en cinématique. Et où le ciel disparaissait aussi simplement que mystérieusement. Ça devait être en version 4.30.

Je me souviens aussi d'un TextureOutput() qui a été banni de l'existence.

Alors, lire une telle observation me fait comprendre la frustration. Cependant, je vous invite à visiter quelques côtes bretonnes par beau temps. Les ombres sont noires pour nos yeux fragiles. Et quand on pénètre ces zones d'ombres, il n'y a pas assez de calculateurs sur la planète pour en prévoir les reflets. Pas sûr que toute une vie vous suffise pour en découvrir les effets possibles en apnée.

Faire la guerre aux images sophistiquées en jeux vidéo, ça cartonne. Mais la réalité toute entière et durable, il faut croire qu'on lui fait la guerre...
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Water & Shadow

Message par falsam »

crisot a écrit :Ca ne fera pas avancer ton problème, mais ici le rendu est ce qu'il est censé être:
Ce qui est perturbant c'est que pour caster de l'ombre il faille dire le contraire de ce que l'on veut :wink:
EntityRenderMode(Ground, #PB_Shadow_None)
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%
crisot
Messages : 98
Inscription : lun. 30/août/2004 21:03

Re: Water & Shadow

Message par crisot »

EntityRenderMode(Ground, #PB_Entity_CastShadow) concerne la capacité d'une entité à *projeter* une ombre, et non pas à la recevoir. C'est à ton entité Crate de projeter son ombre et non à l'entité Ground.

En fait il faut:

Code : Tout sélectionner

EntityRenderMode(Ground,  #PB_Shadow_None)
EntityRenderMode(Crate, #PB_Entity_CastShadow  )
Et là si pour ton Crate tu passes à #PB_Shadow_None ou à #PB_Entity_CastShadow, tu as bien un résultat cohérent avec tes attentes.

Après pourquoi l'entité Ground ne peut pas recevoir d'ombre si elle même en caste une, c'est autre chose à creuser.
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Water & Shadow

Message par falsam »

Si je fais ce que tu dis à savoir

Code : Tout sélectionner

EntityRenderMode(Ground,  #PB_Shadow_None)
EntityRenderMode(Crate, #PB_Entity_CastShadow  )
ca ne fonctionne pas (du moins chez moi). L'ombre de la caisse n’apparaît pas sur le sol.

Petit code de test :

Code : Tout sélectionner

EnableExplicit

InitEngine3D() 
InitSprite() 
InitKeyboard()

OpenWindow(0, 0, 0, 800, 600, "Shadow", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0), 0, 0, 800, 600, 0, 0, 0)

; Assets directory
Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/Textures", #PB_3DArchive_FileSystem)
Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/Water", #PB_3DArchive_FileSystem)
Add3DArchive(#PB_Compiler_Home + "Examples/3D/Data/Packs/desert.zip", #PB_3DArchive_Zip)

; Camera
Define Camera = CreateCamera(#PB_Any, 0, 0, 100, 100)
MoveCamera(Camera, -400, 200, 600)
CameraLookAt(Camera, 0, 0, 0)

; Sky
SkyBox("desert07.jpg")

; Water
CreateWater(Camera, 0, -17.5, 0, 0, #PB_World_WaterLowQuality | #PB_World_WaterSmooth | #PB_World_WaterSun)
WaterColor(Camera, RGB(72, 209, 204))

; Light
CreateLight(#PB_Any, RGB(255, 255, 255), 1000, 1000, -500); , #PB_Light_Point)

; System Shadow
WorldShadows(#PB_Shadow_TextureModulative, 1000, RGB(105, 105, 105), 2048) 

; Materials
Define Ground_Mat = CreateMaterial(#PB_Any, TextureID(LoadTexture(#PB_Any, "soil_wall.jpg")))
ScaleMaterial(Ground_Mat, 0.5, 0.5)
Define Crate_Mat = CreateMaterial(#PB_Any, TextureID(LoadTexture(#PB_Any, "caisse.png")))

; Meshes
Define Box_Mesh = CreateCube(#PB_Any, 1)

; Entities
Define Ground = CreateEntity(#PB_Any, MeshID(Box_Mesh), MaterialID(Ground_Mat), 0, -15, 0)
ScaleEntity(Ground, 500, 20, 500) 
EntityRenderMode(Ground, #PB_Shadow_None)

Define Crate = CreateEntity(#PB_Any, MeshID(Box_Mesh), MaterialID(Crate_Mat), 0, 45, 0)
ScaleEntity(Crate, 100, 100, 100) 
EntityRenderMode(Ground, #PB_Entity_CastShadow)

; Loop
Repeat
  ExamineKeyboard()
  RenderWorld()
  FlipBuffers()
Until WindowEvent() = #PB_Event_CloseWindow Or KeyboardReleased(#PB_Key_Escape)
Par contre si je commente la ligne

Code : Tout sélectionner

EntityRenderMode(Ground, #PB_Entity_CastShadow)
alors l'ombre de la caisse est bien portée sur le sol.
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%
crisot
Messages : 98
Inscription : lun. 30/août/2004 21:03

Re: Water & Shadow

Message par crisot »

Oui. Je t'ai dis de mettre:

Code : Tout sélectionner

EntityRenderMode(Ground,  #PB_Shadow_None)
EntityRenderMode(Crate, #PB_Entity_CastShadow)
Tu as mis:

Code : Tout sélectionner

EntityRenderMode(Ground,  #PB_Shadow_None)
EntityRenderMode(Ground, #PB_Entity_CastShadow)
Voilà voilà. C'est bien ta petite boite (Crate) qui caste son ombre. :)
Dernière modification par crisot le mar. 04/juin/2019 16:12, modifié 1 fois.
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Water & Shadow

Message par falsam »

Oops oui erreur de ma part .....

Merci pour ton aide Crisot :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: Water & Shadow

Message par falsam »

@Crisot : Suite à conversation sur le chat de purebasic, un code avec deux cubes superposés avec la gestion des ombres.

Code : Tout sélectionner

EnableExplicit

InitEngine3D() 
InitSprite() 
InitKeyboard()

OpenWindow(0, 0, 0, 800, 600, "Shadow", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0), 0, 0, 800, 600, 0, 0, 0)

; Assets directory
Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/Textures", #PB_3DArchive_FileSystem)
Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/Water", #PB_3DArchive_FileSystem)
Add3DArchive(#PB_Compiler_Home + "Examples/3D/Data/Packs/desert.zip", #PB_3DArchive_Zip)

; Camera
Define Camera = CreateCamera(#PB_Any, 0, 0, 100, 100)
MoveCamera(Camera, -400, 200, 600)
CameraLookAt(Camera, 0, 0, 0)

; Sky
SkyBox("desert07.jpg")

; Water
CreateWater(Camera, 0, -17.5, 0, 0, #PB_World_WaterLowQuality | #PB_World_WaterSmooth | #PB_World_WaterSun)
WaterColor(Camera, RGB(72, 209, 204))

; Light
CreateLight(#PB_Any, RGB(255, 255, 255), 1000, 1000, -500); , #PB_Light_Point)

; System Shadow
WorldShadows(#PB_Shadow_TextureModulative, 1000, RGB(105, 105, 105), 2048) 

; Materials
Define Ground_Mat = CreateMaterial(#PB_Any, TextureID(LoadTexture(#PB_Any, "soil_wall.jpg")))
ScaleMaterial(Ground_Mat, 0.5, 0.5)

Define Crate_Mat = CreateMaterial(#PB_Any, TextureID(LoadTexture(#PB_Any, "caisse.png")))

; Meshes
Define Box_Mesh = CreateCube(#PB_Any, 1)

; Entities
Define Ground = CreateEntity(#PB_Any, MeshID(Box_Mesh), MaterialID(Ground_Mat), 0, -15, 0)
ScaleEntity(Ground, 500, 20, 500) 
EntityRenderMode(Ground, #PB_Shadow_None)

Define Crate0= CreateEntity(#PB_Any, MeshID(Box_Mesh), MaterialID(Crate_Mat), 0, 45, 0)
ScaleEntity(Crate0, 100, 100, 100) 
EntityRenderMode(crate0, #PB_Entity_None)

Define Crate1= CreateEntity(#PB_Any, MeshID(Box_mesh), MaterialID(Crate_Mat), 30, 145, -30)
ScaleEntity(Crate1, 100, 100, 100) 
RotateEntity(Crate1, 0, 45, 0)
EntityRenderMode(crate1, #PB_Entity_CastShadow)

; Loop
Repeat
  ExamineKeyboard()
  RenderWorld()
  FlipBuffers()
Until WindowEvent() = #PB_Event_CloseWindow Or KeyboardReleased(#PB_Key_Escape)
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%
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Water & Shadow

Message par Ollivier »

falsam a écrit :Oops oui erreur de ma part .....
Eh oui ! D'ailleurs, je ne te remercierai jamais assez d'avoir grâcieusement transformé mon découvert en compte positif à 8 chiffres. Falsami errare humanum est !
Répondre