CreateCompositorEffect et sprite3D

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

CreateCompositorEffect et sprite3D

Message par blendman »

salut

Je me demandais si on pouvait créer des effect avec les sprite3D.

Je pense que oui, mais il faudrait créer une caméra, etc..
Le problème est que je n'arrive pas à trouver un exemple pour créer un fx tout simplement.
Savez-vous comment on utilise les specialeffect ?

Merci :).
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: CreateCompositorEffect et sprite3D

Message par G-Rom »

en théorie , non, c'est deux libs différentes.

@+
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: CreateCompositorEffect et sprite3D

Message par blendman »

G-Rom a écrit :en théorie , non, c'est deux libs différentes.
ah mince
Dommage, car pourtant, on sait mixer les 2 dans un jeu.

Sinon, il n'y a pas d'exemple d'utilisation d'un specialeffect dans les sources pb et je n'ai rien trouvé sur le net sur l'utilisation de ça.
Tu sais comment les utiliser ces effects ?
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: CreateCompositorEffect et sprite3D

Message par G-Rom »

Je ne suis pas sur mon poste , mais pour les compositors , c'est ceux d'ogre , tu les trouves un peu partout sur leur forum
( ce que j'ai ne marche qu'avec OpenGL Linux oblige... ;) )
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: CreateCompositorEffect et sprite3D

Message par blendman »

même en openGl ça me va, histoire de voir comment ça marche ^^;

PS : j'ai ubuntu en dualboot, mais faudrait que je l'update car il est un peu vieux, histoire de tester un peu pb sous linux :)
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: CreateCompositorEffect et sprite3D

Message par blendman »

Salut

J'ai trouvé quelques explications sur les compositor ici :
http://www.ogre3d.org/tikiwiki/Composit ... tive_bloom


Du coup, j'ai testé ça avec l'exemple 3D bridge, mais je ne sais pas comment ça marche en purebasic, il manque un exemple dans les exemples 3D :).
Il faut placer ce fichier dans le répertoire des exemples 3D de purebasic.

Code : Tout sélectionner

;
; ------------------------------------------------------------
;
;   PureBasic - PointJoint (Bridge)
;
;    (c) 2011 - Fantaisie Software
;
; ------------------------------------------------------------
;

IncludeFile "Screen3DRequester.pb"

#CameraSpeed = 1
#Nb = 30
Enumeration
#bloom
#motionblur
EndEnumeration

Define.f KeyX, KeyY, MouseX, MouseY
Global effect.a,keypressed.a
Dim Planche(#Nb)

If InitEngine3D()
  
  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Scripts",#PB_3DArchive_FileSystem)
  Add3DArchive("Data/Packs/desert.zip", #PB_3DArchive_Zip)
  Parse3DScripts()
    
  InitSprite()
  InitKeyboard()
  InitMouse()
  
  If Screen3DRequester()
    
    KeyboardMode(#PB_Keyboard_International) 
    
    WorldShadows(#PB_Shadow_Modulative)
        
    ;Materials
    ;
    CreateMaterial(0, LoadTexture(0, "Wood.jpg"))
    GetScriptMaterial(1, "SphereMap/SphereMappedRustySteel")
    CreateMaterial(2, LoadTexture(2, "Dirt.jpg"))
    GetScriptMaterial(3, "Scene/GroundBlend")
    

    ; Ground
    ;
    CreatePlane(3, 10000, 10000, 100, 100, 150, 150)
    CreateEntity(3,MeshID(3),MaterialID(3), 0, -50, 0)
    EntityRenderMode(3, 0) 
    EntityPhysicBody(3, #PB_Entity_StaticBody)
    
    ; Bridge
    CreateCube(1, 1.0)
    For i = 1 To #Nb
      Planche(i)=CreateEntity(#PB_Any, MeshID(1), MaterialID(0))
      ScaleEntity(Planche(i), 2.8, 0.8, 20)
      EntityLocate(Planche(i), i * 3, 0, 0)
      EntityPhysicBody(Planche(i), #PB_Entity_BoxBody, 1.0)
    Next i
    
    Pas.f = 1.5
    PointJoint(Planche(1),  -Pas, 0, -5)
    For i= 1 To #Nb-2
      PointJoint(Planche(i+1),  -Pas, 0, -5, Planche(i), Pas, 0, -5)
    Next i
    PointJoint(Planche(#Nb),  Pas, 0, -5)
    PointJoint(Planche(#Nb-1),  Pas, 0, -5, Planche(#Nb), -Pas, 0, -5)
    
    PointJoint(Planche(1),  -Pas, 0, 5)
    For i= 1 To #Nb-2
      PointJoint(Planche(i+1),  -Pas, 0, 5, Planche(i), Pas, 0, 5)
    Next i
    PointJoint(Planche(#Nb),  Pas, 0, 5)
    PointJoint(Planche(#Nb-1),  Pas, 0, 5, Planche(#Nb), -Pas, 0, 5)
    
    ; Objects
    ;
    CreateSphere(2, 2, 30, 30)
    
    C = Planche(1)
    For i = 1 To #Nb/2
      Perso = CreateEntity(#PB_Any, MeshID(2), MaterialID(1), EntityX(C) +i * 5, EntityY(C)+ i * 2, EntityZ(C))
      EntityPhysicBody(Perso, #PB_Entity_SphereBody, 0.5)
    Next i
    
    For i = 1 To #Nb/2
      Perso = CreateEntity(#PB_Any, MeshID(1), MaterialID(2), EntityX(C) +i * 5, EntityY(C)+ i * 4, EntityZ(C))
      ScaleEntity(Perso, 3, 3, 3)
      EntityPhysicBody(Perso, #PB_Entity_BoxBody, 1.0)
    Next i
    
    ; Camera
    ;
    CreateCamera(0, 0, 0, 100, 100)
    CameraLocate(0, -20, 30, -40)
    CameraLookAt(0, EntityX(C) + 25, EntityY(C) + 10,  EntityZ(C))
    
    ; les effects
    If CreateCompositorEffect(#bloom,CameraID(0),GetCurrentDirectory()+"Data\Scripts\bw.compositor") = 0
      MessageRequester("error","unable to load or create the compositor effect")
    Else
      Debug GetCurrentDirectory()+"Data\Scripts\bw.compositor"      
    EndIf
    
    If CreateCompositorEffect(#motionblur,CameraID(0),GetCurrentDirectory()+"Data\Scripts\motionblur.compositor")=0
      MessageRequester("error","unable to load or create the compositor effect")
    EndIf

    ;SkyBox
    ;
    SkyBox("desert07.jpg")
    
    ; Light
    ;
    CreateLight(0, RGB(255, 255, 255), 100, 800, -500)
    AmbientColor(RGB(20, 20, 20))
    
    Repeat
      Screen3DEvents()
      
      If ExamineMouse()
        MouseX = -MouseDeltaX() * #CameraSpeed * 0.05
        MouseY = -MouseDeltaY() * #CameraSpeed * 0.05
      EndIf
      
      If ExamineKeyboard()
               
        If KeyboardPushed(#PB_Key_Space)
          ApplyEntityImpulse(Planche(#Nb/2), 0, 9, 0)
        EndIf
        If KeyboardPushed(#PB_Key_Return)
          FreeJoint(Planche(#Nb/2))
        EndIf      
        
        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed
        Else
          KeyX = 0
        EndIf
        
        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed
        Else
          KeyY = 0
        EndIf
                
        If KeyboardReleased(#PB_Key_F3)  
          Debug "effet"
          If IsEffect(#bloom)               
            HideEffect(#bloom,1)
          EndIf
        EndIf
        
        If KeyboardReleased(#PB_Key_F2)  
          Debug "pas d'effet"
          If IsEffect(#bloom)               
            HideEffect(#bloom,0)
          EndIf
        EndIf
        
      EndIf
           
      MoveCamera  (0, KeyX, 0, KeyY)
      RotateCamera(0,  MouseY, MouseX, 0, #PB_Relative)
      
      RenderWorld()
      Screen3DStats()
      FlipBuffers()      
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
    
  EndIf
  
Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf

End

Les effets à placer dans le répertoire :
Data\Scripts

Effet bloom (bloom.compositor):

Code : Tout sélectionner

/// Manuel's bloom
/// Needs a scene-sized rtt, but does only one render of the scene
compositor Bloom
{
    technique
    {
        // Temporary textures
        texture scene target_width target_height PF_A8R8G8B8
        texture rt0 128 128 PF_A8R8G8B8
        texture rt1 128 128 PF_A8R8G8B8
 
        target scene
        {
            // Render output from previous compositor (or original scene)
            input previous
        }
        target rt0
        {
            // Start with clear texture
            input none
            // Vertical blur pass
            pass render_quad
            {
                // Renders a fullscreen quad with a material
                material PostFilters/Blur0
                input 0 scene
            }
        }
        target rt1
        {
            // Start with clear texture
            input none
            // Horizontal blur pass
            pass render_quad
            {
                // Renders a fullscreen quad with a material
                material PostFilters/Blur1
                input 0 rt0
            }
        }
        target_output
        {
            // Start with clear output
            input none
            // Draw a fullscreen quad
            pass render_quad
            {
                // Renders a fullscreen quad with a material
                material PostFilters/BloomBlend
                input 0 scene
                input 1 rt1
            }
        }
    }
}
Effet black & white (bw.compositor):

Code : Tout sélectionner

/// Black and white effect
compositor B&W
{
    technique
    {
        // Temporary textures
        texture scene target_width target_height PF_A8R8G8B8
 
        target scene
        {
            // Render output from previous compositor (or original scene)
            input previous
        }
        target_output
        {
            // Start with clear output
            input none
            // Draw a fullscreen quad with the blur
            pass render_quad
            {
                // Renders a fullscreen quad with a material
                material PostFilters/BlackAndWhite
                input 0 scene
            }
        }
    }
}
Effet motion blur (motionblur.compositor) :

Code : Tout sélectionner

/// Manuel's motion blur effect
compositor "Motion Blur"
{
    technique
    {
        // Temporary textures
        texture scene target_width target_height PF_A8R8G8B8
        texture sum target_width target_height PF_A8R8G8B8
        texture temp target_width target_height PF_A8R8G8B8
 
        target scene
        {
            // Render output from previous compositor (or original scene)
            input previous
        }
        target sum
        {
            // Render this target pass only initially, on the first frame that
            // this effect was enabled. This makes sure the sum texture
            // does not start with randomness.
            only_initial on
 
            input previous
        }
        target temp
        {
            // Start with clear texture
            input none
            // Combine scene and sum texture
            pass render_quad
            {
                // Renders a fullscreen quad with a material
                material Ogre/Compositors/Combine
                input 0 scene
                input 1 sum
            }
        }
        target sum
        {
            // Start with clear texture
            input none
            // Copy temporary back to sum
            pass render_quad
            {
                // Renders a fullscreen quad with a material
                material Ogre/Compositors/Copyback
                input 0 temp
            }
        }
        target_output
        {
            // Start with clear output
            input none
            // Draw a fullscreen quad with the blur
            pass render_quad
            {
                // Renders a fullscreen quad with a material
                material Ogre/Compositors/MotionBlur
                input 0 sum
            }
        }
    }
}
Voilà, si quelqu'un a une idée de leur utilisation, n'hésitez pas à poster.
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: CreateCompositorEffect et sprite3D

Message par G-Rom »

Je verrais ca en rentrant ce soir.
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: CreateCompositorEffect et sprite3D

Message par blendman »

salut

G-rom : tu as pu retrouver ton fichier d'exemple ? :)
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: CreateCompositorEffect et sprite3D

Message par G-Rom »

oui , mais a prioris il y a eu de grosse modification de mon code, plus rien ne marche chez moi :/
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: CreateCompositorEffect et sprite3D

Message par blendman »

Ah mince.

Bon, ben, on va attendre que ce soit corrigé dans la prochaine version ^^ .
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Re: CreateCompositorEffect et sprite3D

Message par comtois »

G-Rom a écrit :oui , mais a prioris il y a eu de grosse modification de mon code, plus rien ne marche chez moi :/
lequel ? J'ai un de tes exemples qui fonctionne bien : Gaussian_Blur, faut que je prenne le temps de faire un zip !

[BlendMan] sinon pour info, il te faut les fichiers suivants :

- xxx.compositor
- xxx.material (on retrouve le(s) nom(s) des materials utilisés dans le fichier compositor)
- les shaders (on retrouve le(s) nom(s) des shaders utilisés dans le fichier material)

Autre info, la plupart des exemples d'Ogre ne pourront pas fonctionner avec PureBasic car cg n'est pas supporté. Il faut créer ou utiliser des shaders GLSL (il faut choisir le sous système OpenGL), je crois que les shaders HLSL sont aussi supportés par PB ?
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: CreateCompositorEffect et sprite3D

Message par blendman »

comtois a écrit :J'ai un de tes exemples qui fonctionne bien : Gaussian_Blur, faut que je prenne le temps de faire un zip !
J'ai hâte que tu fasses un zip pour voir ce que ça donne ;).

Penses-tu que ce sera utilisable en openGL avec les sprite3D (oui, je rêve un peu, mais bon :D) ?
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Re: CreateCompositorEffect et sprite3D

Message par comtois »

blendman a écrit :
comtois a écrit :J'ai un de tes exemples qui fonctionne bien : Gaussian_Blur, faut que je prenne le temps de faire un zip !
J'ai hâte que tu fasses un zip pour voir ce que ça donne ;).
Je crois que j'ai le même problème que G-Rom ! J'ai une erreur sur la fonction Parse3DScripts() quand je valide le sous système OpenGL, va falloir que j'analyse d'où vient le problème, donc patience, ça ne sera pas pour aujourd'hui.

ça fonctionne avec ma version de développement, pourtant je n'ai rien modifié là dessus ! Etrange !
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Re: CreateCompositorEffect et sprite3D

Message par comtois »

Une discussion fort intéressante au sujet de la conversion des shaders cg en HLSL pour windows. Je n'ai pas testé, je n'ai malheureusement pas trop le temps en ce moment.

http://www.purebasic.fr/french/viewtopi ... 13&t=10640
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: CreateCompositorEffect et sprite3D

Message par G-Rom »

le problème ne viens pas des shaders , la solution donné dans ton post pour la conversion fonctionne, le problème viens de la factorisation du code source.
j'ai peu de temps pour me penché dessus à fond pour le moment , si le problème n'est pas résolu , je me pencherais dessus quand j'aurais plus de temps. ;)
Répondre