Aktuelle Zeit: 28.03.2024, 11:23

Alle Zeiten sind UTC + 1 Stunde




Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
BeitragVerfasst: 30.05.2008, 21:59 
Offline
Benutzeravatar

Registriert: 16.05.2008, 14:54
Beiträge: 4
Wohnort: Eutin
Ich arbeite im Moment an einer Klasse die das Nutzen von Postprocessing Shadern in Irrlicht etwas komfortabler machen soll.
Außerdem möchte ich auch gerne eine Postprocessing Shader Sammlung erstellen.
Bisher habe ich einen Shader zum Invertieren der Farben und Bloom erstellt. Beide Effekte gibt es in einer Version mit GLSL und in einer Version mit HLSL. Der Bloom Effekt besteht aus vier Shadern die hintereinander ausgeführt den den Bloomeffekt bewirken.

Wenn ihr irgendwelche Postprocessing Shader Wünsche oder Verbessrungsvorschläge habt, teilt mir diese bitte mit :)

Vor dem Benutzen empfehle ich sehr die ReadMe zu lesen.
Das ganze veröffentliche ich unter der MIT-Lizenz.

Hier ist der Download: http://files.filefront.com/Irrlicht+PostProcessing+Class/;10422053;/fileinfo.html


Und hier sind noch zwei Screenshots des Bloomeffektes:
Bild
Bild

Ich hoffe es gefällt und dass ihr damit etwas anfangen könnt :)

_________________


Nach oben
 Profil  
 
BeitragVerfasst: 12.05.2009, 16:06 
Offline

Registriert: 20.03.2009, 10:02
Beiträge: 50
T'schuldigung dass ich einen alten Thread ausgrabe, aber ich habe da eine Frage:

Kann mir jemand erklären wie man mehrere Shader hintereinander ausführt? Im C++ Quelltext lese ich da leider nur spanisch oder böhmisch. Ein bisschen Pseudo-Code wäre hilfreich ...

Danke!!


Nach oben
 Profil  
 
BeitragVerfasst: 13.05.2009, 16:23 
Offline

Registriert: 20.03.2009, 10:02
Beiträge: 50
Ich habe nun den Quelltext soweit kapiert dass ich ihn nach BlitzMax übersetzen konnte. Es funktioniert auch fast! Problem ist dass ich nur das Ergebnis angezeigt bekomme, aber nicht die Kombination aus Original und Shader-Berechnung. Keine Ahnung ob ihr das lesen könnt, aber ich paste einfach mal den BMax Code, aber zuerst das Bild:

Bild

Code:
SuperStrict

Framework sedm.simpleirr

Type TPostProcessing_SetShaderConstants Extends IShaderConstantSetCallBack
   Global shaderparameters:Float[8]
   
   Method OnSetConstants(services:IMaterialRendererServices, userdata:Int)
      services.setPixelShaderConstantFromName("vecValues", Self.shaderparameters, 8)
   
      If userdata = 1
         'Set Textures For openGL Shaders
         Local texture1:Float = 0.0
         Local texture2:Float = 0.0
         services.setPixelShaderConstantFromName("texture1", VarPtr(texture1), 1)
         services.setPixelShaderConstantFromName("texture2", VarPtr(texture2), 1)
      EndIf
   End Method
   
   Function setShaderParameters(paras:Float[])
      shaderparameters = paras
   End Function
   
   Function generate:IShaderConstantSetCallBack()
      Return New TPostProcessing_SetShaderConstants
   EndFunction
End Type

rem
   Class which manages postprocessing effects
   
   To apply the effect, run
   driver->setRenderTarget(postprocessing->getFirstMap(), true, true, video::SColor(255,150,180,255));
   
   or similar before you render anything and run
   
   driver->setRenderTarget(0);
   postprocessing->renderEffect();
   
   to actually run the shaders and render the result to the screen.
end rem
Type TPostProcessing
   Field shadercallback:TPostProcessing_SetShaderConstants
   Field scenemgr:ISceneManager
   Field Driver:IVideoDriver
   Field vertices:Array_S3DVertex
   Field indices:Array_u16
   Field material:SMaterial
   Field matid:Int
   Field shaderparameters:Float[8]
   Field prevstage:TPostProcessing
   Field nextstage:TPostProcessing
   Field firstmap:ITexture
   Field secondmap:ITexture
   Field gpu:IGPUProgrammingServices
   
   rem
      Constructor
      smgr      : Scene manager which is used for the post progressing
      filename_gl   : Path to the GLSL script
      filename_dx   : Path to the HLSL script
      type_ps      : Type of the pixel shader
      res_x      : Horizontal resolution of the used texture
      res_y      : Vertical resolution of the used texture
   end rem
   Function PostProcessing:TPostProcessing(smgr:ISceneManager, filename_gl:String, filename_dx:String, type_ps:Int, res_x:Int, res_y:Int)
      Local pp:TPostProcessing = New TPostProcessing
      
      pp.Driver         = smgr.getVideoDriver()
      pp.shadercallback   = TPostProcessing_SetShaderConstants(IShaderConstantSetCallBack.Create(TPostProcessing_SetShaderConstants.generate))
      pp.vertices         = Array_S3DVertex.createWithSize(4)
      pp.indices         = Array_u16.createWithSize(6)
      pp.material         = SMaterial.Create()
      
      If pp.Driver.getDriverType() = EDT_OPENGL Or pp.Driver.getDriverType() = EDT_DIRECT3D9
         pp.vertices.Insert(S3DVertexDefault.createFromVals(-1.0, -1.0, 0.0, 1.0, 1.0, 0.0, _SCOLOR(0,0,0,0), 0.0, 1.0), 0)
         pp.vertices.Insert(S3DVertexDefault.createFromVals(-1.0,  1.0, 0.0, 1.0, 1.0, 0.0, _SCOLOR(0,0,0,0), 0.0, 0.0), 1)
         pp.vertices.Insert(S3DVertexDefault.createFromVals( 1.0,  1.0, 0.0, 1.0, 1.0, 0.0, _SCOLOR(0,0,0,0), 1.0, 0.0), 2)
         pp.vertices.Insert(S3DVertexDefault.createFromVals( 1.0, -1.0, 0.0, 1.0, 1.0, 0.0, _SCOLOR(0,0,0,0), 1.0, 1.0), 3)
         
         pp.indices.Insert(0, 0)
         pp.indices.Insert(1, 1)
         pp.indices.Insert(2, 2)
         pp.indices.Insert(0, 3)
         pp.indices.Insert(2, 4)
         pp.indices.Insert(3, 5)
         
         pp.gpu      = pp.Driver.getGPUProgrammingServices()
         pp.scenemgr   = smgr

         pp.prevstage = Null
         pp.nextstage = Null
         
         Local para:Float[] = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
         pp.setShaderParameters(para)
         pp.shadercallback.setShaderParameters(pp.shaderparameters)

         If pp.Driver.getDriverType() = EDT_OPENGL
            pp.matid = pp.gpu.addHighLevelShaderMaterialFromFiles( ..
               "Shaders/PP_GL_Vertex.fx", ..
               "main", ..
               EVST_VS_1_1, ..
               filename_gl, ..
               "main", ..
               type_ps, ..
               pp.shadercallback, ..
               EMT_SOLID, ..
               1)
         Else
            pp.matid = pp.gpu.addHighLevelShaderMaterialFromFiles( ..
               "Shaders/PP_DX_Vertex.fx", ..
               "main", ..
               EVST_VS_1_1, ..
               filename_dx, ..
               "main", ..
               type_ps, ..
               pp.shadercallback, ..
               EMT_SOLID, ..
               0)
         EndIf
   
         pp.firstmap = pp.Driver.addRenderTargetTexture(_DIMENSION2DI(res_x, res_y))
         pp.secondmap = Null
         pp.material.setWireframe(False)
         pp.material.setLighting(False)
         pp.material.setTexture(0,pp.firstmap);
         'material.TextureLayer[0].TextureWrap = video::ETC_CLAMP;
         pp.material.setMaterialType(pp.matid)
      EndIf
      
      Return pp
   End Function

   rem
      Destructor
   endrem
   Method Delete()
      Self.free()
   End Method
   
   Method free()
      Self.shadercallback = Null
      Self.scenemgr.Deconstructor()
      Self.Driver.Deconstructor()
      Self.vertices.Deconstructor()
      Self.material.Deconstructor()
      Self.shaderparameters = Null
      Self.firstmap.Deconstructor()
      Self.secondmap.Deconstructor()
      Self.gpu.Deconstructor()
      If Self.prevstage <> Null
         Self.prevstage.free()
         Self.prevstage = Null
      End If
      If Self.nextstage <> Null
         Self.nextstage.free()
         Self.nextstage = Null
      EndIf
   End Method

   rem
      Adds another stage and inserts it after this stage
      filename_gl Path to the GLSL script
      filename_dx Path to the HLSL script
      type_ps Type of the pixel shader
      res_x Horizontal resolution of the used texture
      res_y Vertical resolution of the used texture
   end rem
   Method addMaterial:TPostProcessing(filename_gl:String, filename_dx:String, type_ps:Int, res_x:Int, res_y:Int)
      Self.nextstage = TPostProcessing.PostProcessing(Self.scenemgr, filename_gl, filename_dx, type_ps, res_x, res_y)
      Return nextstage
   End Method

   rem
      Renders this postprocessing chain
   end rem
   Method renderEffect()
      Self.Driver.setMaterial(Self.material)

      If Self.nextstage <> Null
         Self.Driver.setRenderTarget(Self.nextstage.getFirstMap(), True, True, _SCOLOR(255,150,180,255))
         Self.Driver.drawIndexedTriangleList(Self.vertices, Self.indices)
         Self.Driver.setRenderTarget()
         Self.nextstage.renderEffect()
      Else
         Self.Driver.setMaterial(Self.material)
         Self.Driver.drawIndexedTriangleList(Self.vertices, Self.indices)
      EndIf
   End Method

   rem
      Sets the second texture
   end rem
   Method setSecondMap(tex:ITexture, mode:Int = ETC_CLAMP)
      Self.secondmap = tex
      Self.material.setTexture(1, Self.secondmap)
      'self.material.TextureLayer[1].TextureWrap = mode
   End Method

   rem
      Sets the parameters of the shader
   endrem
   Method setShaderParameters(para:Float[])
      Self.shaderparameters = para
   End Method

   rem
      Returns a pointer to the material
   end rem
   Method getMaterial:SMaterial()
      Return Self.material
   End Method

   rem
      Returns a pointer to the first texture
   end rem
   Method getFirstMap:ITexture()
      Return Self.firstmap
   End Method
   
   rem
      Returns a pointer to the second texture
   end rem
   Method getSecondMap:ITexture()
      Return Self.secondmap
   End Method
End Type

Local irr:TIrrlicht = TIrrlicht.Init()
irr.Graphics3D(1024, 768)

Local para:Float[8]
Local PP_Test:TPostProcessing = TPostProcessing.PostProcessing(irr.irr_scene, "Shaders/PP_GL_Bloom1.fx","Shaders/PP_DX_Bloom1.fx", EPST_PS_1_4, 512,256)
para[0] = 0.5; PP_Test.setShaderParameters(para)

Local Test2:TPostProcessing = PP_test.addMaterial("Shaders/PP_GL_Bloom2.fx", "Shaders/PP_DX_Bloom2.fx", EPST_PS_2_0, 128, 128)
para[0] = 0.01; Test2.setShaderParameters(para)

Test2 = Test2.addMaterial("Shaders/PP_GL_Bloom3.fx", "Shaders/PP_DX_Bloom3.fx", EPST_PS_2_0, 128, 128)
Test2.setShaderParameters(para)

Test2 = Test2.addMaterial("Shaders/PP_GL_Bloom4.fx", "Shaders/PP_DX_Bloom4.fx", EPST_PS_2_0, 512, 256)
para[0] = 0.7; Test2.setShaderParameters(para)

Test2.setSecondMap(PP_Test.getFirstMap(), ETC_CLAMP)

irr.AddZip("data/data.zip")

Local scene:TScene = TScene.Load("scene.irr")

Local sky:ISceneNode = irr.irr_scene.addSkyBoxSceneNode(irr.irr_video.getTexture("sky/morning_up.jpg"), ..
                                          irr.irr_video.getTexture("sky/morning_down.jpg"), ..
                                          irr.irr_video.getTexture("sky/morning_west.jpg"), ..
                                          irr.irr_video.getTexture("sky/morning_east.jpg"), ..
                                          irr.irr_video.getTexture("sky/morning_north.jpg"), ..
                                          irr.irr_video.getTexture("sky/morning_south.jpg"))
                                          
' die Würfel aus der Scene holen
Local cb:ISceneNode = TScene.FindByName("Cube")
Local ce:TEntity = New TEntity
ce.node=cb
cb.getMaterial(0).setShininess(200.0)

Local cam:ISceneNode = ICameraSceneNode(TScene.FindByName("Camera"))
If Not cam Then RuntimeError "no camera found"
cam.remove()

Local cam2:ICameraSceneNode = irr.irr_scene.addCameraSceneNodeFPS(Null, 100.0, 0.05)
irr.irr_scene.setActiveCamera(cam2)
cam2.setPosition(_VECTOR3DF(0.0, 3.0, -10.0))

'the main loop
Repeat
   If irr.irr_device.run()
      irr.irr_video.BeginScene(True, True, _SCOLOR(255,150,180,255))
            
      'render the scene into the postprocessing texture
      irr.irr_video.setRenderTarget(PP_Test.getFirstMap(), True, True, _SCOLOR(255,150,180,255))
      irr.irr_scene.drawAll()
      irr.irr_video.setRenderTarget()
         
      'render the effect chain
      PP_Test.renderEffect()

      irr.irr_video.EndScene()
   EndIf
Until irr.IsKeyDown(KEY_ESCAPE)
End

Aufgefallen ist mir dass eigentlich niemals die Scene selbst in ein Target gerendert wird, allerdings bin ich etwas ratlos wo ich ansetzen soll um das zu beheben.


Nach oben
 Profil  
 
BeitragVerfasst: 14.05.2009, 12:36 
Offline
Moderator
Benutzeravatar

Registriert: 11.03.2007, 20:25
Beiträge: 556
Wohnort: Frankfurt/Main
Code:
      'render the scene into the postprocessing texture
      irr.irr_video.setRenderTarget(PP_Test.getFirstMap(), True, True, _SCOLOR(255,150,180,255))
      irr.irr_scene.drawAll()

also wenn das nicht das rendern der scene in ein RT ist, beiß ich mir die finger ab.

_________________
yo. life's so bloody short.
Ihr dachtet Schulfernsehn sei die ultimative Folter? Falsch: Fahrstuhlmusik, extra leise.


Nach oben
 Profil  
 
BeitragVerfasst: 15.05.2009, 08:53 
Offline

Registriert: 20.03.2009, 10:02
Beiträge: 50
frodenius hat geschrieben:
also wenn das nicht das rendern der scene in ein RT ist, beiß ich mir die finger ab.


Nee, da habe ich mich ein bisschen unklar ausgedrückt. Was ich meinte: Anscheinend wird keine Textur in Bildschirmauflösung erstellt und der letzte Renderpass wird nicht ausgeführt, denn wie man sieht ist das da oben im Bild nur eine 256er Auflösung und nicht mit dem Original-Render kombiniert.

Spielt jetzt aber auch keine Rolle mehr, der Code von Slin half mir das Multipass Rendering zu verstehen und ich setze das jetzt für mich so um wie ich es besser kann und verstehe ;)


Nach oben
 Profil  
 
BeitragVerfasst: 18.05.2009, 16:29 
Offline

Registriert: 20.03.2009, 10:02
Beiträge: 50
Es hätte mir schon am Screenshot oben auffallen müssen. Dieses FW erzeugt ein Composite in 512x256 ... geht garnicht, wähle ich eine höhere Auflösung wird der Shader in dieser Auflösung ausgeführt (wtf?!?). Kann mir mittlerweile aber auch egal sein, offenbar zieht der BlitzMax Wrapper für Irrlicht die ShaderCallbacks nach einem drawAll() komplett durch ohne die Möglichkeit des Eingreifens zu gewähren. Somit habe ich keine Möglichkeit das letzte Renderergebnis in Originalauflösung auf den Screen zu bringen ...


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de