Mark Sibly 7 yıl önce
ebeveyn
işleme
0685362d1e

+ 2 - 27
modules/mojo3d/render/renderer.monkey2

@@ -451,43 +451,18 @@ Class Renderer
 		_gdevice.Scissor=t_scissor
 	End
 	
-	Method FlipEffectBuffers()
-		
-		If _direct Return
-		
-		Local rsize:=_gdevice.Viewport.Size
-		Local rtarget:=_gdevice.RenderTarget
-		Local rtexture:=rtarget.GetColorTexture( 0 )
-		_runiforms.SetTexture( "SourceBuffer",rtexture )
-		_runiforms.SetVec2f( "SourceBufferSize",Cast<Vec2f>( rsize ) )
-		_runiforms.SetVec2f( "SourceBufferScale",Cast<Vec2f>( rsize )/Cast<Vec2f>( rtexture.Size ) )
-		
-		If Not _effectBuffer Or rsize.x>_effectBuffer.Size.x Or rsize.y>_effectBuffer.Size.y
-			_effectTarget?.Discard()
-			_effectBuffer?.Discard()
-			_effectBuffer=New Texture( rsize.x,rsize.y,rtexture.Format,TextureFlags.Dynamic|TextureFlags.Filter )
-			_effectTarget=New RenderTarget( New Texture[]( _effectBuffer ),Null )
-		Endif
-		
-		rtarget=rtarget<>_effectTarget ? _effectTarget Else _renderTarget1
-		
-		_gdevice.RenderTarget=rtarget
-	End
-	
 	Method RenderPostEffects()
 		
-		PostEffect.BeginRendering( _gdevice,Self )
+		PostEffect.BeginRendering( _gdevice,_runiforms )
 		
 		For Local effect:=Eachin _scene.PostEffects
 			
 			If Not effect.Enabled Continue
 			
-			FlipEffectBuffers()
-
 			_gdevice.ColorMask=ColorMask.All
 			_gdevice.DepthMask=False
-			_gdevice.DepthFunc=DepthFunc.Always
 			_gdevice.CullMode=CullMode.None
+			_gdevice.DepthFunc=DepthFunc.Always
 			_gdevice.BlendMode=BlendMode.Opaque
 			_gdevice.RenderPass=0
 			

+ 24 - 5
modules/mojo3d/scene/effects/bloomeffect.monkey2

@@ -36,20 +36,37 @@ Class BloomEffect Extends PostEffect
 	
 	Protected
 	
-	Method OnRender() Override
+	Method OnRender( target:RenderTarget,viewport:Recti ) Override
 		
-		Device.Shader=_shader
+		Local size:=viewport.Size
+		Local source:=target.GetColorTexture( 0 )
+		
+		If Not _target0 Or size.x>_target0.Size.x Or size.y>_target0.Size.y
+			_target0=CreateRenderTarget( size,source.Format,TextureFlags.Dynamic )
+			_target1=CreateRenderTarget( size,source.Format,TextureFlags.Dynamic )
+		Endif
 		
+		Device.Shader=_shader
 		Device.BindUniformBlock( _uniforms )
 		
+		Local rtarget:=_target0
+		
 		For Local i:=0 Until _passes
 			
-			If i Flip()
-			
+			Super.SetRenderTarget( rtarget,New Recti( 0,0,size ) )
 			Device.RenderPass=i ? 2-(i&1) Else 0	'0,1,2,1,2,1,2...
 			
 			RenderQuad()
-		End
+			
+			rtarget=rtarget=_target0 ? _target1 Else _target0
+		Next
+		
+		Super.SetRenderTarget( target,viewport )
+		
+		Device.BlendMode=BlendMode.Additive
+		Device.RenderPass=3
+		
+		RenderQuad()
 	End
 	
 	Private
@@ -57,5 +74,7 @@ Class BloomEffect Extends PostEffect
 	Field _shader:Shader
 	Field _uniforms:UniformBlock
 	Field _passes:Int=4
+	Field _target0:RenderTarget
+	Field _target1:RenderTarget
 	
 End

+ 11 - 2
modules/mojo3d/scene/effects/monochromeeffect.monkey2

@@ -32,10 +32,18 @@ Class MonochromeEffect Extends PostEffect
 
 	Protected
 	
-	Method OnRender() Override
+	Method OnRender( target:RenderTarget,viewport:Recti ) Override
 		
-		Device.Shader=_shader
+		Local size:=viewport.Size
+		Local source:=target.GetColorTexture( 0 )
+		
+		If Not _target Or size.x>_target.Size.x Or size.y>_target.Size.y
+			_target=CreateRenderTarget( size,source.Format,TextureFlags.Dynamic )
+		End
 		
+		Super.SetRenderTarget( _target,New Recti( 0,0,size ) )
+
+		Device.Shader=_shader
 		Device.BindUniformBlock( _uniforms )
 		
 		RenderQuad()
@@ -45,5 +53,6 @@ Class MonochromeEffect Extends PostEffect
 	
 	Field _shader:Shader
 	Field _uniforms:UniformBlock
+	Field _target:RenderTarget
 	
 End

+ 1 - 7
modules/mojo3d/scene/effects/reflectioneffect.monkey2

@@ -16,13 +16,7 @@ Class ReflectionEffect Extends PostEffect
 	
 	Protected
 	
-	Method OnRender() Override
-		
-		Device.Shader=_shader
-		
-		Device.BindUniformBlock( _uniforms )
-		
-		RenderQuad()
+	Method OnRender( target:RenderTarget,viewport:Recti ) Override
 	End
 	
 	Private

+ 20 - 0
modules/mojo3d/scene/materials/watermaterial.monkey2

@@ -16,6 +16,8 @@ Class WaterMaterial Extends Material
 		
 		ColorTexture=Texture.ColorTexture( Color.White )
 		ColorFactor=Color.SeaGreen
+		Metalness=0
+		Roughness=0
 		NormalTextures=New Texture[]( Texture.FlatNormal(),Texture.FlatNormal() )
 		Velocities=New Vec2f[]( New Vec2f( 0,0 ),New Vec2f( 0,0 ) )
 	End
@@ -50,6 +52,24 @@ Class WaterMaterial Extends Material
 		Uniforms.SetColor( "ColorFactor",color )
 	End
 	
+	Property Metalness:Float()
+		
+		Return Uniforms.GetFloat( "Metalness" )
+	
+	Setter( metalness:Float )
+		
+		Uniforms.SetFloat( "Metalness",metalness )
+	End
+	
+	property Roughness:Float()
+		
+		Return Uniforms.GetFloat( "Roughness" )
+	
+	Setter( roughness:Float )
+		
+		Uniforms.SetFloat( "Roughness",roughness )
+	End
+	
 	Property NormalTextures:Texture[]()
 		
 		Return New Texture[]( Uniforms.GetTexture( "NormalTexture0" ),Uniforms.GetTexture( "NormalTexture1" ) )

+ 31 - 12
modules/mojo3d/scene/posteffect.monkey2

@@ -24,31 +24,50 @@ Class PostEffect
 	#end	
 	Method Render()
 		
-		OnRender()
+		OnRender( _gdevice.RenderTarget,_gdevice.Viewport )
 	End
 	
-	Function BeginRendering( device:GraphicsDevice,renderer:Renderer )
-		_device=device
-		_renderer=renderer
+	Function BeginRendering( gdevice:GraphicsDevice,runiforms:UniformBlock )
+
+		_gdevice=gdevice
+		_runiforms=runiforms
 	End
 	
 	Function EndRendering()
+		
+		_gdevice=Null
+		_runiforms=Null
 	End
 
 	Protected
 	
 	#rem monkeydoc @hidden
 	#end	
-	Method OnRender() Abstract
+	Method OnRender( target:RenderTarget,viewport:Recti ) Abstract
 	
 	Property Device:GraphicsDevice()
 		
-		Return _device
+		Return _gdevice
+	End
+	
+	Method CreateRenderTarget:RenderTarget( size:Vec2i,format:PixelFormat,flags:TextureFlags )
+		
+		Local texture:=New Texture( size.x,size.y,format,flags )
+		Local target:=New RenderTarget( New Texture[]( texture ),Null )
+		Return target
 	End
 	
-	Method Flip()
+	Method SetRenderTarget( target:RenderTarget,viewport:Recti )
+		
+		Local rsize:=_gdevice.Viewport.Size
+		Local rtarget:=_gdevice.RenderTarget
+		Local rtexture:=rtarget.GetColorTexture( 0 )
+		_runiforms.SetTexture( "SourceBuffer",rtexture )
+		_runiforms.SetVec2f( "SourceBufferSize",Cast<Vec2f>( rsize ) )
+		_runiforms.SetVec2f( "SourceBufferScale",Cast<Vec2f>( rsize )/Cast<Vec2f>( rtexture.Size ) )
 		
-		_renderer.FlipEffectBuffers()
+		_gdevice.RenderTarget=target
+		_gdevice.Viewport=viewport
 	End
 	
 	Method RenderQuad()
@@ -63,17 +82,17 @@ Class PostEffect
 			New Vertex3f( 0,0,0 ) ) )
 		Endif
 			
-		_device.VertexBuffer=_vertices
+		_gdevice.VertexBuffer=_vertices
 		
-		_device.Render( 4,1 )
+		_gdevice.Render( 4,1 )
 	End
 	
 	#rem monkeydoc @hidden
 	#end	
 	Private
 	
-	Global _device:GraphicsDevice
-	Global _renderer:Renderer
+	Global _gdevice:GraphicsDevice
+	Global _runiforms:UniformBlock
 	
 	Field _enabled:Bool=True
 	

+ 3 - 2
modules/mojo3d/tests/effects.monkey2

@@ -32,9 +32,11 @@ Class MyWindow Extends Window
 		_scene.ClearColor=Color.Black
 		
 		_bloom=New BloomEffect
+		_bloom.Enabled=True
 		_scene.AddPostEffect( _bloom )
 		
 		_mono=New MonochromeEffect
+		_mono.Enabled=False
 		_scene.AddPostEffect( _mono )
 		
 		'create camera
@@ -48,8 +50,7 @@ Class MyWindow Extends Window
 		_light=New Light
 		_light.RotateX( 90 )
 		
-		Local material:=New PbrMaterial( Color.Black )
-		material.EmissiveFactor=New Color( 0,2,0 )
+		Local material:=New PbrMaterial( New Color( 2,1,0,1 ) )
 		
 		_donut=Model.CreateTorus( 2,.5,48,24,material )
 		_donut.AddComponent<RotateBehaviour>().Speed=New Vec3f( .1,.2,.3 )