Script ou Shader Foliage

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 :

Script ou Shader Foliage

Message par falsam »

[PB 6.02 (x64)]

Script Material ou Shader je ne sais pas trop quel terme utiliser.

Je joue aujourd'hui avec le script/shader foliage qui permet de simuler l'influence du vent par exemple sur une touffe d'herbe ou de fleurs.

Le code que je vous présente a pour objectif d'afficher 200 touffes d'herbes sur une surface de 9x9 unités.
Le souci que je rencontre est que la texture utilisée "grass1.png" est à l'envers au moment de l'exécution du code.

La procédure de création des meshs mesh_foliage sur lequels seront appliquées ces textures est de Guillot.

Voici le code de test. Qu'importe la qualité des textures. Ce qui m'intéresse c'est la solution au souci que je soulève.

Code : Tout sélectionner

EnableExplicit

; Compteur de touffes d'herbes
Define i

Procedure.f POM(v.f)
  ProcedureReturn (Random(v*1000)-v*500)/500
EndProcedure

Procedure.f Min(v1.f, v2.f)
  If v1 < v2
    ProcedureReturn v1
  Else
    ProcedureReturn v2
  EndIf
EndProcedure

; Influence du vent 
Procedure mesh_foliage(mesh, size.f, n=8, flexibility.f = 10)
  Protected.f n2.l=n/2, cx, cy, cz
  Protected i, j, jn
  Protected fq.f = min(250/size,255)
  Protected Phase.f = Random(200)
  Protected Dim t.MeshVertex(n,n)
  
  For j=0 To n 
    jn=j/n
    For i=0 To n
      With t(i,j) 
        cx   = (i-n2)/n * size
        cy   = (j)/n * size
        
        \x = cx
        \y = cy
        \z = 0
        
        \NormalX = 0
        \NormalY = 1
        \NormalZ = 0
        
        \u   = i/n
        \v   = j/n
        
        \Color=RGBA(fq, min((cx*cx + cy*cy) * flexibility, 255),phase,0)
      EndWith 
    Next
  Next
  CreateDataMesh(mesh,t())
  BuildMeshTangents(mesh)
EndProcedure

InitEngine3D(#PB_Engine3D_DebugLog) : InitSprite() : InitKeyboard()

OpenWindow(0, 0,0, 800, 600, "Touffe d'herbes - [Esc] quit",#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0), 0, 0, 800, 600, 0, 0, 0)

Add3DArchive(#PB_Compiler_Home + "examples/3D/Data/Textures", #PB_3DArchive_FileSystem)
Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/Scripts/MaterialScriptsGeneric", #PB_3DArchive_FileSystem )
Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/Packs/desert.zip", #PB_3DArchive_Zip)
Parse3DScripts()

; Camera
CreateCamera(0, 0, 0, 100, 100) : MoveCamera(0, 0, 2, -8) : CameraLookAt(0, 0, 0, 0)

; Lumiere
CreateLight(0, RGB(255, 255, 255), -10, 10, -10)
AmbientColor(RGB(255, 245, 238))

; Ciel
SkyBox("desert07.jpg")

; Ground
LoadTexture(10, "Dirt.jpg")
CreateMaterial(10, TextureID(10))
CreatePlane(10, 10, 10, 1, 1, 5, 5)
CreateEntity(10, MeshID(10), MaterialID(10))

; Herbes
LoadTexture(20, "grass1.png")
CreateMaterial(20, TextureID(20))
GetScriptMaterial(20, "foliage")
MaterialTextureAliases(20, TextureID(20), 0, 0, 0)
MaterialCullingMode(20, #PB_Material_NoCulling)

; Affichage de 200 touffes dherbes
For i = 0 To 199
  mesh_foliage(20+i, 1, 10, 3)
  CreateEntity(20+i, MeshID(20+i), MaterialID(20), POM(3), 0, POM(3))
  RotateEntity(20+i, 0, POM(180), 0)
Next

; Loop
Repeat
  While WindowEvent() : Wend
  ExamineKeyboard()  
  RenderWorld()
  FlipBuffers()    
Until KeyboardReleased(#PB_Key_Escape)
La solution est peut être de jouer sur les coordonnées UV mais je souhaite être certain que ce soit la bonne solution.
J'ai donc remplacé

Code : Tout sélectionner

\u   = i/n
\v   = j/n
par

Code : Tout sélectionner

\u   = -i/n
\v   = -j/n
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
falsam
Messages : 7323
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Script ou Shader Foliage

Message par falsam »

Un autre souci rencontré.

Si j'active la gestion des ombres avec

Code : Tout sélectionner

WorldShadows(#PB_Shadow_Additive)
L'herbe est grillé !!
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
Guillot
Messages : 672
Inscription : jeu. 25/juin/2015 16:18

Re: Script ou Shader Foliage

Message par Guillot »

ben enfin falsam ?
il te suffit d'inverser v
ligne 43 : \v = 1-j/n
Avatar de l’utilisateur
falsam
Messages : 7323
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Script ou Shader Foliage

Message par falsam »

Evidement bien sur 🙃
J'ai bien fait de soumettre ce souci. Merci pour ta réponse rapide.

Ceci dit l'herbe est toujours grillé 😉
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
Guillot
Messages : 672
Inscription : jeu. 25/juin/2015 16:18

Re: Script ou Shader Foliage

Message par Guillot »

ouai, moi les ombres, j'y touche pas trop
j'avais vu un exemple d'alpharejection avec ombre sur le forum anglais
peut etre avec un autre tyoe de shadow

PS : si tu veux faire beaucoup d'herbe, mets en plusieurs par entité, (ogre est tres limité au niveau du nombre d'entirée)
note : CreateDataMesh(mesh,t()) :mesh peut prendre la valeur -2: qui correnpond à l'ajout dans createmesh (je crois pas que ce soit dans la doc...)
mais moi, je me contenterai de 2 triangles
Répondre