Page 1 sur 1

CreateCompositorEffect et sprite3D

Publié : lun. 16/avr./2012 18:16
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 :).

Re: CreateCompositorEffect et sprite3D

Publié : lun. 16/avr./2012 18:20
par G-Rom
en théorie , non, c'est deux libs différentes.

@+

Re: CreateCompositorEffect et sprite3D

Publié : mar. 17/avr./2012 8:27
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 ?

Re: CreateCompositorEffect et sprite3D

Publié : mar. 17/avr./2012 16:46
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... ;) )

Re: CreateCompositorEffect et sprite3D

Publié : mar. 17/avr./2012 17:15
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 :)

Re: CreateCompositorEffect et sprite3D

Publié : mer. 18/avr./2012 7:47
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.

Re: CreateCompositorEffect et sprite3D

Publié : mer. 18/avr./2012 9:45
par G-Rom
Je verrais ca en rentrant ce soir.

Re: CreateCompositorEffect et sprite3D

Publié : dim. 22/avr./2012 10:19
par blendman
salut

G-rom : tu as pu retrouver ton fichier d'exemple ? :)

Re: CreateCompositorEffect et sprite3D

Publié : dim. 22/avr./2012 11:18
par G-Rom
oui , mais a prioris il y a eu de grosse modification de mon code, plus rien ne marche chez moi :/

Re: CreateCompositorEffect et sprite3D

Publié : dim. 22/avr./2012 12:18
par blendman
Ah mince.

Bon, ben, on va attendre que ce soit corrigé dans la prochaine version ^^ .

Re: CreateCompositorEffect et sprite3D

Publié : dim. 22/avr./2012 14:37
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 ?

Re: CreateCompositorEffect et sprite3D

Publié : dim. 22/avr./2012 14:44
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) ?

Re: CreateCompositorEffect et sprite3D

Publié : dim. 22/avr./2012 15:16
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 !

Re: CreateCompositorEffect et sprite3D

Publié : mer. 25/avr./2012 19:48
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

Re: CreateCompositorEffect et sprite3D

Publié : mer. 25/avr./2012 21:10
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. ;)