|
@@ -1,164 +1,21 @@
|
|
|
|
|
|
Namespace mojo3d.graphics
|
|
|
|
|
|
-#rem
|
|
|
-
|
|
|
-Renderpasses:
|
|
|
-
|
|
|
-1 : opaque ambient
|
|
|
-
|
|
|
-2 : opaque shadow depth
|
|
|
-
|
|
|
-3 : transparent
|
|
|
-
|
|
|
-#end
|
|
|
-
|
|
|
-#rem monkeydoc @hidden
|
|
|
-#end
|
|
|
-Class RenderOp
|
|
|
- Field material:Material
|
|
|
- Field vbuffer:VertexBuffer
|
|
|
- Field ibuffer:IndexBuffer
|
|
|
- Field instance:Entity
|
|
|
- Field bones:Mat4f[]
|
|
|
- Field order:Int
|
|
|
- Field count:Int
|
|
|
- Field first:Int
|
|
|
-End
|
|
|
-
|
|
|
-#rem monkeydoc @hidden
|
|
|
-#end
|
|
|
-Class RenderQueue
|
|
|
-
|
|
|
- Property OpaqueOps:Stack<RenderOp>()
|
|
|
-
|
|
|
- Return _opaqueOps
|
|
|
- End
|
|
|
-
|
|
|
- Property TransparentOps:Stack<RenderOp>()
|
|
|
-
|
|
|
- Return _transparentOps
|
|
|
- End
|
|
|
-
|
|
|
- Property ShadowOps:Stack<RenderOp>()
|
|
|
-
|
|
|
- Return _shadowOps
|
|
|
- End
|
|
|
-
|
|
|
- Property AddShadowOps:Bool()
|
|
|
-
|
|
|
- Return _addShadowOps
|
|
|
-
|
|
|
- Setter( addShadowOps:Bool )
|
|
|
-
|
|
|
- _addShadowOps=addShadowOps
|
|
|
- End
|
|
|
-
|
|
|
- Method Clear()
|
|
|
-
|
|
|
- _opaqueOps.Clear()
|
|
|
- _shadowOps.Clear()
|
|
|
- _transparentOps.Clear()
|
|
|
- End
|
|
|
-
|
|
|
- Method AddRenderOp( op:RenderOp )
|
|
|
-
|
|
|
- If op.material.BlendMode<>BlendMode.Opaque
|
|
|
- _transparentOps.Push( op )
|
|
|
- Else
|
|
|
- _opaqueOps.Push( op )
|
|
|
- Endif
|
|
|
-
|
|
|
- If _addShadowOps _shadowOps.Push( op )
|
|
|
- End
|
|
|
-
|
|
|
- Method AddRenderOp( material:Material,vbuffer:VertexBuffer,ibuffer:IndexBuffer,order:Int,count:Int,first:Int )
|
|
|
- Local op:=New RenderOp
|
|
|
- op.material=material
|
|
|
- op.vbuffer=vbuffer
|
|
|
- op.ibuffer=ibuffer
|
|
|
- op.order=order
|
|
|
- op.count=count
|
|
|
- op.first=first
|
|
|
- AddRenderOp( op )
|
|
|
- End
|
|
|
-
|
|
|
- Method AddRenderOp( material:Material,vbuffer:VertexBuffer,ibuffer:IndexBuffer,instance:Entity,order:Int,count:Int,first:Int )
|
|
|
- Local op:=New RenderOp
|
|
|
- op.material=material
|
|
|
- op.vbuffer=vbuffer
|
|
|
- op.ibuffer=ibuffer
|
|
|
- op.instance=instance
|
|
|
- op.order=order
|
|
|
- op.count=count
|
|
|
- op.first=first
|
|
|
- AddRenderOp( op )
|
|
|
- End
|
|
|
-
|
|
|
- Method AddRenderOp( material:Material,vbuffer:VertexBuffer,ibuffer:IndexBuffer,instance:Entity,bones:Mat4f[],order:Int,count:Int,first:Int )
|
|
|
- Local op:=New RenderOp
|
|
|
- op.material=material
|
|
|
- op.vbuffer=vbuffer
|
|
|
- op.ibuffer=ibuffer
|
|
|
- op.instance=instance
|
|
|
- op.bones=bones
|
|
|
- op.order=order
|
|
|
- op.count=count
|
|
|
- op.first=first
|
|
|
- AddRenderOp( op )
|
|
|
- End
|
|
|
-
|
|
|
- Private
|
|
|
-
|
|
|
- Field _opaqueOps:=New Stack<RenderOp>
|
|
|
- Field _transparentOps:=New Stack<RenderOp>
|
|
|
- Field _shadowOps:=New Stack<RenderOp>
|
|
|
-
|
|
|
- Field _addShadowOps:Bool
|
|
|
-End
|
|
|
-
|
|
|
#rem monkeydoc The Renderer class.
|
|
|
#end
|
|
|
Class Renderer
|
|
|
-
|
|
|
+
|
|
|
#rem monkeydoc @hidden
|
|
|
#end
|
|
|
- Method New()
|
|
|
-
|
|
|
- _device=New GraphicsDevice( 0,0 )
|
|
|
-
|
|
|
- _runiforms=New UniformBlock( 1 )
|
|
|
- _iuniforms=New UniformBlock( 2 )
|
|
|
-
|
|
|
- _device.BindUniformBlock( _runiforms )
|
|
|
- _device.BindUniformBlock( _iuniforms )
|
|
|
-
|
|
|
- _csmSplits=New Float[]( 1,20,60,180,1000 )
|
|
|
-
|
|
|
- _quadVertices=New VertexBuffer( New Vertex3f[](
|
|
|
- New Vertex3f( 0,1,0 ),
|
|
|
- New Vertex3f( 1,1,0 ),
|
|
|
- New Vertex3f( 1,0,0 ),
|
|
|
- New Vertex3f( 0,0,0 ) ) )
|
|
|
-
|
|
|
- _defaultEnv=Texture.Load( "asset::textures/env_default.jpg",TextureFlags.FilterMipmap|TextureFlags.Cubemap )
|
|
|
+ Property ShaderDefs:String()
|
|
|
|
|
|
- _skyboxShader=Shader.Open( "skybox" )
|
|
|
- _plightShader=Shader.Open( "point-light" )
|
|
|
- _dlightShader=Shader.Open( "directional-light" )
|
|
|
- _copyShader=Shader.Open( "copy" )
|
|
|
-
|
|
|
- For Local i:=0 Until _nullBones.Length
|
|
|
- _nullBones[i]=New Mat4f
|
|
|
- Next
|
|
|
+ Return _shaderDefs
|
|
|
End
|
|
|
+
|
|
|
+ #rem monkeydoc Size of cascading shadow map texture.
|
|
|
|
|
|
- #rem monkeydoc Size of the cascading shadow map texture.
|
|
|
-
|
|
|
- Must be a power of 2 size.
|
|
|
+ Must be a power of 2 size. Defaults to 1024.
|
|
|
|
|
|
- Defaults to 4096.
|
|
|
-
|
|
|
#end
|
|
|
Property CSMTextureSize:Float()
|
|
|
|
|
@@ -189,32 +46,59 @@ Class Renderer
|
|
|
#end
|
|
|
Function GetCurrent:Renderer()
|
|
|
|
|
|
- Global _current:=New Renderer
|
|
|
+ Global _current:Renderer
|
|
|
+
|
|
|
+ If Not _current
|
|
|
+ Select App.GetConfig( "mojo3d_renderer","" )
|
|
|
+ Case "deferred"
|
|
|
+ _current=New DeferredRenderer
|
|
|
+ Case "forward"
|
|
|
+ _current=New ForwardRenderer( False )
|
|
|
+ Default
|
|
|
+#If __DESKTOP_TARGET__
|
|
|
+ If glexts.GL_draw_buffers
|
|
|
+ _current=New DeferredRenderer
|
|
|
+ Else
|
|
|
+ _current=New ForwardRenderer( True )
|
|
|
+ Endif
|
|
|
+#Endif
|
|
|
+ End
|
|
|
+ If Not _current _current=New ForwardRenderer( False )
|
|
|
+ Endif
|
|
|
|
|
|
Return _current
|
|
|
End
|
|
|
|
|
|
+ Internal
|
|
|
+
|
|
|
#rem monkeydoc @hidden
|
|
|
#end
|
|
|
Method Render( scene:Scene,camera:Camera,device:GraphicsDevice )
|
|
|
+
|
|
|
+ '***** validate stuff *****
|
|
|
+
|
|
|
+ Local size:=device.Viewport.Size
|
|
|
+ size.x=Max( size.x,1920 )
|
|
|
+ size.y=Max( size.y,1080 )
|
|
|
|
|
|
- _renderTarget=device.RenderTarget
|
|
|
- _renderTargetSize=device.RenderTargetSize
|
|
|
- _renderViewport=device.Viewport
|
|
|
+ OnValidateSize( size )
|
|
|
+
|
|
|
+ ValidateCSM()
|
|
|
+
|
|
|
+ _runiforms.SetFloat( "Time",Now() )
|
|
|
+
|
|
|
+ _runiforms.SetTexture( "ShadowTexture",_csmTexture )
|
|
|
+ _runiforms.SetVec4f( "ShadowSplits",New Vec4f( _csmSplits[1],_csmSplits[2],_csmSplits[3],_csmSplits[4] ) )
|
|
|
|
|
|
- ValidateSize( _renderViewport.Size )
|
|
|
+ '***** Set render scene *****
|
|
|
|
|
|
_renderScene=scene
|
|
|
|
|
|
- _runiforms.SetFloat( "Time",Now() )
|
|
|
_runiforms.SetTexture( "SkyTexture",_renderScene.SkyTexture )
|
|
|
|
|
|
_runiforms.SetVec4f( "ClearColor",_renderScene.ClearColor )
|
|
|
_runiforms.SetVec4f( "AmbientDiffuse",_renderScene.AmbientLight )
|
|
|
|
|
|
- _runiforms.SetTexture( "ShadowTexture",_csmTexture )
|
|
|
- _runiforms.SetVec4f( "ShadowSplits",New Vec4f( _csmSplits[1],_csmSplits[2],_csmSplits[3],_csmSplits[4] ) )
|
|
|
-
|
|
|
Local env:Texture
|
|
|
|
|
|
If _renderScene.SkyTexture
|
|
@@ -235,6 +119,8 @@ Class Renderer
|
|
|
|
|
|
model.OnRender( _renderQueue )
|
|
|
Next
|
|
|
+
|
|
|
+ '***** Set render camera *****
|
|
|
|
|
|
_renderCamera=camera
|
|
|
|
|
@@ -253,133 +139,67 @@ Class Renderer
|
|
|
|
|
|
_spriteBuffer.AddSprites( _spriteQueue,_renderScene.Sprites,_renderCamera )
|
|
|
|
|
|
- OnRender()
|
|
|
+ OnRender( scene,camera,device )
|
|
|
|
|
|
_renderCamera=Null
|
|
|
|
|
|
_renderScene=null
|
|
|
End
|
|
|
|
|
|
- '***** INTERNAL *****
|
|
|
-
|
|
|
Protected
|
|
|
|
|
|
- Field _device:GraphicsDevice
|
|
|
- Field _runiforms:UniformBlock
|
|
|
- Field _iuniforms:UniformBlock
|
|
|
-
|
|
|
- Field _csmSize:=4096
|
|
|
- Field _csmSplits:=New Float[]( 1,20,60,180,1000 )
|
|
|
- Field _csmTexture:Texture
|
|
|
- Field _csmTarget:RenderTarget
|
|
|
- Field _quadVertices:VertexBuffer
|
|
|
- Field _skyboxShader:Shader
|
|
|
- Field _plightShader:Shader
|
|
|
- Field _dlightShader:Shader
|
|
|
- Field _copyShader:Shader
|
|
|
-
|
|
|
- Field _defaultEnv:Texture
|
|
|
-
|
|
|
- Field _hdrTexture:Texture 'contains output linear HDR color
|
|
|
- Field _colorTexture:Texture 'contains surface color/M
|
|
|
- Field _normalTexture:Texture 'contains surface normal/R
|
|
|
- Field _depthTexture:Texture 'contains surface depth
|
|
|
- Field _rpass0Target:RenderTarget
|
|
|
- Field _rpass2Target:RenderTarget
|
|
|
-
|
|
|
- Field _renderQueue:=New RenderQueue
|
|
|
- Field _spriteQueue:=New RenderQueue
|
|
|
- Field _spriteBuffer:=New SpriteBuffer
|
|
|
-
|
|
|
- Field _nullBones:=New Mat4f[96]
|
|
|
+ Method OnValidateSize( size:Vec2i ) Virtual
|
|
|
+ End
|
|
|
|
|
|
- Field _renderTarget:RenderTarget
|
|
|
- Field _renderTargetSize:Vec2i
|
|
|
- Field _renderViewport:Recti
|
|
|
- Field _renderScene:Scene
|
|
|
- Field _renderCamera:Camera
|
|
|
- Field _renderLight:Light
|
|
|
+ Method OnRender( scene:Scene,camera:Camera,device:GraphicsDevice ) Virtual
|
|
|
+ End
|
|
|
|
|
|
- Method ValidateSize( size:Vec2i )
|
|
|
+ Method New( shaderDefs:String )
|
|
|
|
|
|
- size.x=Max( size.x,1920 )
|
|
|
- size.y=Max( size.y,1080 )
|
|
|
+ _shaderDefs=shaderDefs
|
|
|
|
|
|
- If Not _hdrTexture Or size.x>_hdrTexture.Size.x Or size.y>_hdrTexture.Size.y
|
|
|
+ _device=New GraphicsDevice( 0,0 )
|
|
|
|
|
|
- SafeDiscard( _hdrTexture )
|
|
|
- SafeDiscard( _colorTexture )
|
|
|
- SafeDiscard( _normalTexture )
|
|
|
- SafeDiscard( _depthTexture )
|
|
|
- SafeDiscard( _rpass0Target )
|
|
|
- SafeDiscard( _rpass2Target )
|
|
|
-
|
|
|
- Const format:=PixelFormat.RGBA32F '32 bit float
|
|
|
-
|
|
|
- _hdrTexture=New Texture( size.x,size.y,format,TextureFlags.Filter|TextureFlags.Dynamic ) 'output hdr image
|
|
|
- _colorTexture=New Texture( size.x,size.y,format,TextureFlags.Filter|TextureFlags.Dynamic ) 'metalness in 'a'
|
|
|
- _normalTexture=New Texture( size.x,size.y,format,TextureFlags.Filter|TextureFlags.Dynamic ) 'roughness in 'a'
|
|
|
- _depthTexture=New Texture( size.x,size.y,PixelFormat.Depth32F,TextureFlags.Dynamic )
|
|
|
-
|
|
|
- _rpass0Target=New RenderTarget( New Texture[]( _hdrTexture,_colorTexture,_normalTexture ),_depthTexture )
|
|
|
- _rpass2Target=New RenderTarget( New Texture[]( _hdrTexture ),Null )
|
|
|
-
|
|
|
- _runiforms.SetTexture( "ColorBuffer",_colorTexture )
|
|
|
- _runiforms.SetTexture( "NormalBuffer",_normalTexture )
|
|
|
- _runiforms.SetTexture( "DepthBuffer",_depthTexture )
|
|
|
+ _runiforms=New UniformBlock( 1 )
|
|
|
+ _iuniforms=New UniformBlock( 2 )
|
|
|
|
|
|
- Endif
|
|
|
+ _device.BindUniformBlock( _runiforms )
|
|
|
+ _device.BindUniformBlock( _iuniforms )
|
|
|
|
|
|
- If Not _csmTexture Or _csmSize<>_csmTexture.Size.x
|
|
|
-
|
|
|
- SafeDiscard( _csmTexture )
|
|
|
- SafeDiscard( _csmTarget )
|
|
|
-
|
|
|
- _csmTexture=New Texture( _csmSize,_csmSize,PixelFormat.Depth32F,TextureFlags.Dynamic )
|
|
|
- _csmTarget=New RenderTarget( Null,_csmTexture )
|
|
|
-
|
|
|
- Endif
|
|
|
-
|
|
|
- End
|
|
|
+ _csmSplits=New Float[]( 1,20,60,180,1000 )
|
|
|
|
|
|
- Method OnRender()
|
|
|
+ _defaultEnv=Texture.Load( "asset::textures/env_default.jpg",TextureFlags.FilterMipmap|TextureFlags.Cubemap )
|
|
|
|
|
|
- _device.RenderTarget=_rpass0Target
|
|
|
- _device.Viewport=New Recti( 0,0,_renderViewport.Size )
|
|
|
- _device.Scissor=_device.Viewport
|
|
|
+ _skyboxShader=Shader.Open( "skybox",_shaderDefs )
|
|
|
|
|
|
- RenderBackground()
|
|
|
-
|
|
|
- RenderAmbient()
|
|
|
+ End
|
|
|
|
|
|
- _device.RenderTarget=_rpass2Target
|
|
|
-
|
|
|
- _runiforms.SetVec2f( "BufferCoordScale",Cast<Vec2f>( _renderViewport.Size )/Cast<Vec2f>( _hdrTexture.Size ) )
|
|
|
-
|
|
|
- For Local light:=Eachin _renderScene.Lights
|
|
|
-
|
|
|
- If light.Type=LightType.Point Continue
|
|
|
+ Property Device:GraphicsDevice()
|
|
|
+
|
|
|
+ Return _device
|
|
|
+ End
|
|
|
+
|
|
|
+ Property RenderUniforms:UniformBlock()
|
|
|
+
|
|
|
+ Return _runiforms
|
|
|
+ End
|
|
|
+
|
|
|
+ Method RenderQuad()
|
|
|
|
|
|
- _renderLight=light
|
|
|
-
|
|
|
- RenderCSMShadows()
|
|
|
+ Global _vertices:VertexBuffer
|
|
|
+
|
|
|
+ If Not _vertices
|
|
|
+ _vertices=New VertexBuffer( New Vertex3f[](
|
|
|
+ New Vertex3f( 0,1,0 ),
|
|
|
+ New Vertex3f( 1,1,0 ),
|
|
|
+ New Vertex3f( 1,0,0 ),
|
|
|
+ New Vertex3f( 0,0,0 ) ) )
|
|
|
+ Endif
|
|
|
|
|
|
- RenderLight()
|
|
|
- Next
|
|
|
-
|
|
|
- _renderLight=null
|
|
|
-
|
|
|
- _device.RenderTarget=_rpass0Target
|
|
|
-
|
|
|
- RenderSprites()
|
|
|
-
|
|
|
- _device.RenderTarget=_rpass2Target
|
|
|
-
|
|
|
- RenderEffects()
|
|
|
-
|
|
|
- RenderCopy()
|
|
|
+ _device.VertexBuffer=_vertices
|
|
|
+ _device.Render( 4,1 )
|
|
|
End
|
|
|
-
|
|
|
+
|
|
|
Method RenderBackground()
|
|
|
|
|
|
If _renderScene.SkyTexture
|
|
@@ -394,11 +214,10 @@ Class Renderer
|
|
|
_device.DepthFunc=DepthFunc.Always
|
|
|
_device.BlendMode=BlendMode.Opaque
|
|
|
_device.CullMode=CullMode.None
|
|
|
+ _device.Shader=_skyboxShader
|
|
|
_device.RenderPass=0
|
|
|
|
|
|
- _device.VertexBuffer=_quadVertices
|
|
|
- _device.Shader=_skyboxShader
|
|
|
- _device.Render( 4,1 )
|
|
|
+ RenderQuad()
|
|
|
|
|
|
Else
|
|
|
_device.ColorMask=ColorMask.All
|
|
@@ -410,17 +229,40 @@ Class Renderer
|
|
|
|
|
|
End
|
|
|
|
|
|
+ Method RenderOpaqueOps()
|
|
|
+
|
|
|
+ RenderRenderOps( _renderQueue.OpaqueOps,_renderCamera.InverseMatrix,_renderCamera.ProjectionMatrix )
|
|
|
+ End
|
|
|
+
|
|
|
+ Method RenderSpriteOps()
|
|
|
+
|
|
|
+ RenderRenderOps( _spriteQueue.TransparentOps,_renderCamera.InverseMatrix,_renderCamera.ProjectionMatrix )
|
|
|
+ End
|
|
|
+
|
|
|
+ #rem
|
|
|
Method RenderAmbient()
|
|
|
|
|
|
_device.ColorMask=ColorMask.All
|
|
|
_device.DepthMask=True
|
|
|
_device.DepthFunc=DepthFunc.LessEqual
|
|
|
+ _device.BlendMode=BlendMode.Opaque
|
|
|
_device.RenderPass=1
|
|
|
-
|
|
|
+
|
|
|
RenderRenderOps( _renderQueue.OpaqueOps,_renderCamera.InverseMatrix,_renderCamera.ProjectionMatrix )
|
|
|
End
|
|
|
|
|
|
- Method RenderCSMShadows()
|
|
|
+ Method RenderSprites()
|
|
|
+
|
|
|
+ _device.ColorMask=ColorMask.All
|
|
|
+ _device.DepthMask=False
|
|
|
+ _device.DepthFunc=DepthFunc.LessEqual
|
|
|
+ _device.RenderPass=0
|
|
|
+
|
|
|
+ RenderRenderOps( _spriteQueue.TransparentOps,_renderCamera.InverseMatrix,_renderCamera.ProjectionMatrix )
|
|
|
+ End
|
|
|
+ #end
|
|
|
+
|
|
|
+ Method RenderCSMShadows( light:Light )
|
|
|
|
|
|
'Perhaps use a different device for CSM...?
|
|
|
'
|
|
@@ -438,9 +280,9 @@ Class Renderer
|
|
|
_device.DepthFunc=DepthFunc.LessEqual
|
|
|
_device.BlendMode=BlendMode.Opaque
|
|
|
_device.CullMode=CullMode.Back
|
|
|
- _device.RenderPass=2
|
|
|
+ _device.RenderPass=4
|
|
|
|
|
|
- Local invLightMatrix:=_renderLight.InverseMatrix
|
|
|
+ Local invLightMatrix:=light.InverseMatrix
|
|
|
Local viewLight:=invLightMatrix * _renderCamera.Matrix
|
|
|
|
|
|
For Local i:=0 Until _csmSplits.Length-1
|
|
@@ -483,7 +325,7 @@ Class Renderer
|
|
|
|
|
|
_device.Scissor=_device.Viewport
|
|
|
|
|
|
- If _renderLight.ShadowsEnabled
|
|
|
+ If light.ShadowsEnabled
|
|
|
RenderRenderOps( _renderQueue.ShadowOps,invLightMatrix,lightProj )
|
|
|
Endif
|
|
|
|
|
@@ -493,96 +335,44 @@ Class Renderer
|
|
|
_device.Viewport=t_viewport
|
|
|
_device.Scissor=t_scissor
|
|
|
End
|
|
|
+
|
|
|
+ Private
|
|
|
|
|
|
- Method RenderLight()
|
|
|
+ Field _shaderDefs:String
|
|
|
|
|
|
- _runiforms.SetVec4f( "LightColor",_renderLight.Color )
|
|
|
- _runiforms.SetFloat( "LightRange",_renderLight.Range )
|
|
|
- _runiforms.SetMat4f( "LightViewMatrix",_renderCamera.InverseMatrix * _renderLight.Matrix )
|
|
|
-
|
|
|
- _runiforms.SetMat4f( "InverseProjectionMatrix",-_renderCamera.ProjectionMatrix )
|
|
|
-
|
|
|
- _device.ColorMask=ColorMask.All
|
|
|
- _device.DepthMask=False
|
|
|
- _device.DepthFunc=DepthFunc.Always
|
|
|
- _device.BlendMode=BlendMode.Additive
|
|
|
- _device.CullMode=CullMode.None
|
|
|
- _device.RenderPass=3
|
|
|
-
|
|
|
- Select _renderLight.Type
|
|
|
- Case LightType.Directional
|
|
|
-
|
|
|
- _device.Shader=_dlightShader
|
|
|
- _device.VertexBuffer=_quadVertices
|
|
|
- _device.Render( 4,1,0 )
|
|
|
-
|
|
|
- Case LightType.Point
|
|
|
-
|
|
|
- _device.Shader=_plightShader
|
|
|
- _device.VertexBuffer=_quadVertices
|
|
|
- _device.Render( 4,1,0 )
|
|
|
- End
|
|
|
-
|
|
|
- End
|
|
|
-
|
|
|
- Method RenderSprites()
|
|
|
+ Field _device:GraphicsDevice
|
|
|
+ Field _runiforms:UniformBlock
|
|
|
+ Field _iuniforms:UniformBlock
|
|
|
|
|
|
- _device.ColorMask=ColorMask.All
|
|
|
- _device.DepthMask=False
|
|
|
- _device.DepthFunc=DepthFunc.LessEqual
|
|
|
- _device.RenderPass=0
|
|
|
+ Field _csmSize:=4096
|
|
|
+ Field _csmSplits:=New Float[]( 1,20,60,180,1000 )
|
|
|
+ Field _csmTexture:Texture
|
|
|
+ Field _csmTarget:RenderTarget
|
|
|
+ Field _skyboxShader:Shader
|
|
|
|
|
|
- RenderRenderOps( _spriteQueue.TransparentOps,_renderCamera.InverseMatrix,_renderCamera.ProjectionMatrix )
|
|
|
- End
|
|
|
+ Field _defaultEnv:Texture
|
|
|
|
|
|
- Method RenderEffects()
|
|
|
-
|
|
|
- _device.ColorMask=ColorMask.All
|
|
|
- _device.DepthMask=False
|
|
|
- _device.DepthFunc=DepthFunc.Always
|
|
|
- _device.CullMode=CullMode.None
|
|
|
-
|
|
|
- _device.VertexBuffer=_quadVertices
|
|
|
+ Field _renderQueue:=New RenderQueue
|
|
|
+ Field _spriteQueue:=New RenderQueue
|
|
|
+ Field _spriteBuffer:=New SpriteBuffer
|
|
|
+
|
|
|
+ Field _renderScene:Scene
|
|
|
+ Field _renderCamera:Camera
|
|
|
+
|
|
|
+ Method ValidateCSM()
|
|
|
|
|
|
- For Local effect:=Eachin _renderScene.PostEffects
|
|
|
+ If Not _csmTexture Or _csmSize<>_csmTexture.Size.x
|
|
|
|
|
|
- If Not effect.Enabled Continue
|
|
|
+ SafeDiscard( _csmTexture )
|
|
|
+ SafeDiscard( _csmTarget )
|
|
|
|
|
|
- _device.BlendMode=BlendMode.Opaque
|
|
|
- _device.RenderPass=0
|
|
|
+ _csmTexture=New Texture( _csmSize,_csmSize,PixelFormat.Depth32F,TextureFlags.Dynamic )
|
|
|
+ _csmTarget=New RenderTarget( Null,_csmTexture )
|
|
|
|
|
|
- effect.Render( _device )
|
|
|
- Next
|
|
|
+ Endif
|
|
|
|
|
|
End
|
|
|
-
|
|
|
- Method RenderCopy()
|
|
|
-
|
|
|
- Local source:=_device.RenderTarget.GetColorTexture( 0 )
|
|
|
-
|
|
|
- _runiforms.SetTexture( "SourceTexture",source )
|
|
|
- _runiforms.SetVec2f( "SourceCoordScale",Cast<Vec2f>( _renderViewport.Size )/Cast<Vec2f>( source.Size ) )
|
|
|
|
|
|
- _device.RenderTarget=_renderTarget
|
|
|
- _device.Resize( _renderTargetSize )
|
|
|
- _device.Viewport=_renderViewport
|
|
|
- _device.Scissor=_device.Viewport
|
|
|
- _device.ColorMask=ColorMask.All
|
|
|
- _device.DepthMask=False
|
|
|
- _device.DepthFunc=DepthFunc.Always
|
|
|
- _device.BlendMode=BlendMode.Opaque
|
|
|
- _device.CullMode=CullMode.None
|
|
|
- _device.RenderPass=0
|
|
|
-
|
|
|
- _device.VertexBuffer=_quadVertices
|
|
|
- _device.Shader=_copyShader
|
|
|
-
|
|
|
- _device.Render( 4,1 )
|
|
|
-
|
|
|
- _device.RenderTarget=Null
|
|
|
- _device.Resize( Null )
|
|
|
- End
|
|
|
-
|
|
|
Method RenderRenderOps( ops:Stack<RenderOp>,viewMatrix:AffineMat4f,projMatrix:Mat4f )
|
|
|
|
|
|
_runiforms.SetMat4f( "ViewMatrix",viewMatrix )
|
|
@@ -616,7 +406,7 @@ Class Renderer
|
|
|
|
|
|
_device.Shader=material.Shader
|
|
|
_device.BindUniformBlock( material.Uniforms )
|
|
|
- _device.BlendMode=material.BlendMode
|
|
|
+ If material.BlendMode<>BlendMode.Opaque _device.BlendMode=material.BlendMode
|
|
|
_device.CullMode=material.CullMode
|
|
|
|
|
|
Endif
|