Page 1 sur 1

Script ou Shader Foliage

Publié : jeu. 11/mai/2023 13:52
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

Re: Script ou Shader Foliage

Publié : jeu. 11/mai/2023 14:13
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é !!

Re: Script ou Shader Foliage

Publié : jeu. 11/mai/2023 14:20
par Guillot
ben enfin falsam ?
il te suffit d'inverser v
ligne 43 : \v = 1-j/n

Re: Script ou Shader Foliage

Publié : jeu. 11/mai/2023 14:24
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é 😉

Re: Script ou Shader Foliage

Publié : jeu. 11/mai/2023 18:03
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