Script ou Shader Foliage
Publié : jeu. 11/mai/2023 13:52
[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.
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épar
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)
J'ai donc remplacé
Code : Tout sélectionner
\u = i/n
\v = j/n
Code : Tout sélectionner
\u = -i/n
\v = -j/n