experimenting with g buffer sprites
							parent
							
								
									16ecb5afa6
								
							
						
					
					
						commit
						3338bf3b06
					
				|  | @ -17,6 +17,7 @@ namespace Kav | |||
|         EffectParameter roughnessParam; | ||||
| 
 | ||||
|         EffectParameter uvOffsetAndDimensionsParam; | ||||
|         EffectParameter isSpriteParam; | ||||
| 
 | ||||
|         EffectParameter numTextureRowsParam; | ||||
|         EffectParameter numTextureColumnsParam; | ||||
|  | @ -35,6 +36,8 @@ namespace Kav | |||
|         Vector2 uvOffset; | ||||
|         Vector2 subTextureDimensions; | ||||
| 
 | ||||
|         bool isSprite = false; | ||||
| 
 | ||||
|         int numTextureRows = 1; | ||||
|         int numTextureColumns = 1; | ||||
| 
 | ||||
|  | @ -178,6 +181,16 @@ namespace Kav | |||
|             } | ||||
|         } | ||||
| 
 | ||||
|         public bool IsSprite | ||||
|         { | ||||
|             get { return isSprite; } | ||||
|             set | ||||
|             { | ||||
|                 isSprite = value; | ||||
|                 isSpriteParam.SetValue(isSprite ? 1f : 0f); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         public bool HardwareInstancingEnabled | ||||
|         { | ||||
|             get { return hardwareInstancingEnabled; } | ||||
|  | @ -313,6 +326,7 @@ namespace Kav | |||
|             numTextureColumnsParam = Parameters["NumTextureColumns"]; | ||||
| 
 | ||||
|             uvOffsetAndDimensionsParam = Parameters["UVOffsetAndDimensions"]; | ||||
|             isSpriteParam = Parameters["IsSprite"]; | ||||
| 
 | ||||
|             shaderIndexParam = Parameters["PixelShaderIndex"]; | ||||
|             vertexShaderIndexParam = Parameters["VertexShaderIndex"]; | ||||
|  |  | |||
|  | @ -18,6 +18,8 @@ namespace Kav | |||
| 
 | ||||
|         EffectParameter farPlaneParam; | ||||
| 
 | ||||
|         EffectParameter worldParam; | ||||
|         EffectParameter worldInverseParam; | ||||
|         EffectParameter worldViewProjectionParam; | ||||
| 
 | ||||
|         public Texture2D GPosition { get; set; } | ||||
|  | @ -45,7 +47,7 @@ namespace Kav | |||
|             set | ||||
|             { | ||||
|                 world = value; | ||||
|                 dirtyFlags |= EffectDirtyFlags.WorldViewProj; | ||||
|                 dirtyFlags |= EffectDirtyFlags.WorldViewProj | EffectDirtyFlags.World; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|  | @ -77,7 +79,7 @@ namespace Kav | |||
|         public DeferredPBR_PointLightEffect(DeferredPBR_PointLightEffect cloneSource) : base(cloneSource) | ||||
|         { | ||||
|             CacheEffectParameters(); | ||||
|              | ||||
| 
 | ||||
|             GPosition = cloneSource.GPosition; | ||||
|             GAlbedo = cloneSource.GAlbedo; | ||||
|             GNormal = cloneSource.GNormal; | ||||
|  | @ -112,6 +114,14 @@ namespace Kav | |||
| 
 | ||||
|             farPlaneParam.SetValue(FarPlane); | ||||
| 
 | ||||
|             if ((dirtyFlags & EffectDirtyFlags.World) != 0) | ||||
|             { | ||||
|                 worldParam.SetValue(world); | ||||
|                 worldInverseParam.SetValue(Matrix.Invert(world)); | ||||
| 
 | ||||
|                 dirtyFlags &= ~EffectDirtyFlags.World; | ||||
|             } | ||||
| 
 | ||||
|             if ((dirtyFlags & EffectDirtyFlags.WorldViewProj) != 0) | ||||
|             { | ||||
|                 worldViewProjectionParam.SetValue(world * view * projection); | ||||
|  | @ -135,6 +145,8 @@ namespace Kav | |||
| 
 | ||||
|             farPlaneParam                  = Parameters["FarPlane"]; | ||||
| 
 | ||||
|             worldParam                     = Parameters["World"]; | ||||
|             worldInverseParam              = Parameters["WorldInverse"]; | ||||
|             worldViewProjectionParam       = Parameters["WorldViewProjection"]; | ||||
|         } | ||||
|     } | ||||
|  |  | |||
							
								
								
									
										
											BIN
										
									
								
								Effects/FXB/DeferredPBR_GBufferEffect.fxb (Stored with Git LFS)
								
								
								
								
							
							
						
						
									
										
											BIN
										
									
								
								Effects/FXB/DeferredPBR_GBufferEffect.fxb (Stored with Git LFS)
								
								
								
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								Effects/FXB/DeferredPBR_PointLightEffect.fxb (Stored with Git LFS)
								
								
								
								
							
							
						
						
									
										
											BIN
										
									
								
								Effects/FXB/DeferredPBR_PointLightEffect.fxb (Stored with Git LFS)
								
								
								
								
							
										
											Binary file not shown.
										
									
								
							|  | @ -5,6 +5,7 @@ DECLARE_TEXTURE(NormalTexture, 1); | |||
| DECLARE_TEXTURE(MetallicRoughnessTexture, 2); | ||||
| 
 | ||||
| float4 UVOffsetAndDimensions; | ||||
| float IsSprite; | ||||
| 
 | ||||
| BEGIN_CONSTANTS | ||||
| 
 | ||||
|  | @ -119,7 +120,7 @@ PixelOutput NonePS(PixelInput input) | |||
|     PixelOutput output; | ||||
| 
 | ||||
|     output.gPosition = float4(input.PositionWorld, 1.0); | ||||
|     output.gNormal = float4(normalize(input.NormalWorld), 1.0); | ||||
|     output.gNormal = float4(normalize(input.NormalWorld), IsSprite); | ||||
|     output.gAlbedo = float4(AlbedoValue, 1.0); | ||||
|     output.gMetallicRoughness = float4(MetallicValue, RoughnessValue, 0.0, 1.0); | ||||
| 
 | ||||
|  | @ -131,7 +132,7 @@ PixelOutput AlbedoPS(PixelInput input) | |||
|     PixelOutput output; | ||||
| 
 | ||||
|     output.gPosition = float4(input.PositionWorld, 1.0); | ||||
|     output.gNormal = float4(normalize(input.NormalWorld), 1.0); | ||||
|     output.gNormal = float4(normalize(input.NormalWorld), IsSprite); | ||||
|     output.gAlbedo = SAMPLE_TEXTURE(AlbedoTexture, input.TexCoord); | ||||
|     output.gMetallicRoughness = float4(MetallicValue, RoughnessValue, 0.0, 1.0); | ||||
| 
 | ||||
|  | @ -145,7 +146,7 @@ PixelOutput MetallicRoughnessPS(PixelInput input) | |||
|     PixelOutput output; | ||||
| 
 | ||||
|     output.gPosition = float4(input.PositionWorld, 1.0); | ||||
|     output.gNormal = float4(normalize(input.NormalWorld), 1.0); | ||||
|     output.gNormal = float4(normalize(input.NormalWorld), IsSprite); | ||||
|     output.gAlbedo = float4(AlbedoValue, 1.0); | ||||
|     output.gMetallicRoughness = SAMPLE_TEXTURE(MetallicRoughnessTexture, input.TexCoord); | ||||
| 
 | ||||
|  | @ -157,7 +158,7 @@ PixelOutput NormalPS(PixelInput input) | |||
|     PixelOutput output; | ||||
| 
 | ||||
|     output.gPosition = float4(input.PositionWorld, 1.0); | ||||
|     output.gNormal = float4(GetNormalFromMap(input.PositionWorld, input.TexCoord, input.NormalWorld), 1.0); | ||||
|     output.gNormal = float4(GetNormalFromMap(input.PositionWorld, input.TexCoord, input.NormalWorld), IsSprite); | ||||
|     output.gAlbedo = float4(AlbedoValue, 1.0); | ||||
|     output.gMetallicRoughness = float4(MetallicValue, RoughnessValue, 0.0, 1.0); | ||||
| 
 | ||||
|  | @ -169,7 +170,7 @@ PixelOutput AlbedoMetallicRoughnessPS(PixelInput input) | |||
|     PixelOutput output; | ||||
| 
 | ||||
|     output.gPosition = float4(input.PositionWorld, 1.0); | ||||
|     output.gNormal = float4(normalize(input.NormalWorld), 1.0); | ||||
|     output.gNormal = float4(normalize(input.NormalWorld), IsSprite); | ||||
|     output.gAlbedo = SAMPLE_TEXTURE(AlbedoTexture, input.TexCoord); | ||||
|     output.gMetallicRoughness = SAMPLE_TEXTURE(MetallicRoughnessTexture, input.TexCoord); | ||||
| 
 | ||||
|  | @ -183,7 +184,7 @@ PixelOutput AlbedoNormalPS(PixelInput input) | |||
|     PixelOutput output; | ||||
| 
 | ||||
|     output.gPosition = float4(input.PositionWorld, 1.0); | ||||
|     output.gNormal = float4(GetNormalFromMap(input.PositionWorld, input.TexCoord, input.NormalWorld), 1.0); | ||||
|     output.gNormal = float4(GetNormalFromMap(input.PositionWorld, input.TexCoord, input.NormalWorld), IsSprite); | ||||
|     output.gAlbedo = SAMPLE_TEXTURE(AlbedoTexture, input.TexCoord); | ||||
|     output.gMetallicRoughness = float4(MetallicValue, RoughnessValue, 0.0, 1.0); | ||||
| 
 | ||||
|  | @ -197,7 +198,7 @@ PixelOutput MetallicRoughnessNormalPS(PixelInput input) | |||
|     PixelOutput output; | ||||
| 
 | ||||
|     output.gPosition = float4(input.PositionWorld, 1.0); | ||||
|     output.gNormal = float4(GetNormalFromMap(input.PositionWorld, input.TexCoord, input.NormalWorld), 1.0); | ||||
|     output.gNormal = float4(GetNormalFromMap(input.PositionWorld, input.TexCoord, input.NormalWorld), IsSprite); | ||||
|     output.gAlbedo = float4(AlbedoValue, 1.0); | ||||
|     output.gMetallicRoughness = SAMPLE_TEXTURE(MetallicRoughnessTexture, input.TexCoord); | ||||
| 
 | ||||
|  | @ -209,7 +210,7 @@ PixelOutput AlbedoMetallicRoughnessNormalMapPS(PixelInput input) | |||
|     PixelOutput output; | ||||
| 
 | ||||
|     output.gPosition = float4(input.PositionWorld, 1.0); | ||||
|     output.gNormal = float4(GetNormalFromMap(input.PositionWorld, input.TexCoord, input.NormalWorld), 1.0); | ||||
|     output.gNormal = float4(GetNormalFromMap(input.PositionWorld, input.TexCoord, input.NormalWorld), IsSprite); | ||||
|     output.gAlbedo = SAMPLE_TEXTURE(AlbedoTexture, input.TexCoord); | ||||
|     output.gMetallicRoughness = SAMPLE_TEXTURE(MetallicRoughnessTexture, input.TexCoord); | ||||
| 
 | ||||
|  |  | |||
|  | @ -1,7 +1,7 @@ | |||
| // Assumes you are drawing a sphere!! | ||||
| 
 | ||||
| #include "Macros.fxh" //from FNA | ||||
| #include "Lighting.fxh"  | ||||
| #include "Lighting.fxh" | ||||
| #include "Shadow.fxh" | ||||
| 
 | ||||
| DECLARE_TEXTURE(gPosition, 0); | ||||
|  | @ -13,7 +13,7 @@ DECLARE_CUBEMAP(shadowMap, 4); | |||
| BEGIN_CONSTANTS | ||||
| 
 | ||||
|     float3 EyePosition                      _ps(c0)     _cb(c0); | ||||
|      | ||||
| 
 | ||||
|     float3 PointLightPosition               _ps(c1)     _cb(c1); | ||||
|     float3 PointLightColor                  _ps(c2)     _cb(c2); | ||||
| 
 | ||||
|  | @ -21,6 +21,8 @@ BEGIN_CONSTANTS | |||
| 
 | ||||
| MATRIX_CONSTANTS | ||||
| 
 | ||||
|     float4x4 WorldInverse                   _ps(c4)     _cb(c8); | ||||
|     float4x4 World                          _ps(c8)     _cb(c12); | ||||
|     float4x4 WorldViewProjection _vs(c0)                _cb(c4); | ||||
| 
 | ||||
| END_CONSTANTS | ||||
|  | @ -42,7 +44,7 @@ PixelInput main_vs(VertexInput input) | |||
| 
 | ||||
|     output.Position = mul(input.Position, WorldViewProjection); | ||||
|     output.ScreenPosition = output.Position; | ||||
|      | ||||
| 
 | ||||
|     return output; | ||||
| } | ||||
| 
 | ||||
|  | @ -78,19 +80,25 @@ float4 main_ps(PixelInput input) : SV_TARGET0 | |||
| { | ||||
|     input.ScreenPosition.xy /= input.ScreenPosition.w; | ||||
|     float2 texCoord = 0.5f * float2(input.ScreenPosition.x,-input.ScreenPosition.y) + 0.5f; | ||||
|      | ||||
| 
 | ||||
|     float3 worldPosition = SAMPLE_TEXTURE(gPosition, texCoord).rgb; | ||||
|     float3 normal = SAMPLE_TEXTURE(gNormal, texCoord).xyz; | ||||
|     float4 normalSample = SAMPLE_TEXTURE(gNormal, texCoord); | ||||
|     float3 normal = normalSample.xyz; | ||||
|     float isSprite = normalSample.a; | ||||
|     float3 albedo = SAMPLE_TEXTURE(gAlbedo, texCoord).rgb; | ||||
|     float2 metallicRoughness = SAMPLE_TEXTURE(gMetallicRoughness, texCoord).rg; | ||||
| 
 | ||||
|     float3 objectZNormal = mul(normal, WorldInverse); | ||||
|     objectZNormal.xz *= -1; | ||||
|     float3 invertedZNormalWorld = mul(objectZNormal, World); | ||||
| 
 | ||||
|     return ComputeColor( | ||||
|         worldPosition, | ||||
|         normal, | ||||
|         albedo, | ||||
|         metallicRoughness.r, | ||||
|         metallicRoughness.g | ||||
|     ); | ||||
|     ) + (isSprite * ComputeColor(worldPosition, invertedZNormalWorld, albedo, metallicRoughness.r, metallicRoughness.g)); | ||||
| } | ||||
| 
 | ||||
| Technique DeferredPBR_Point | ||||
|  |  | |||
|  | @ -207,6 +207,8 @@ namespace Kav | |||
|             GraphicsDevice.BlendState = BlendState.AlphaBlend; | ||||
| 
 | ||||
|             Deferred_GBufferEffect.HardwareInstancingEnabled = false; | ||||
|             Deferred_GBufferEffect.IsSprite = true; | ||||
| 
 | ||||
|             Deferred_GBufferEffect.View = camera.View; | ||||
|             Deferred_GBufferEffect.Projection = camera.Projection; | ||||
| 
 | ||||
|  | @ -418,6 +420,7 @@ namespace Kav | |||
|             GraphicsDevice.BlendState = BlendState.Opaque; | ||||
| 
 | ||||
|             Deferred_GBufferEffect.HardwareInstancingEnabled = true; | ||||
|             Deferred_GBufferEffect.IsSprite = false; | ||||
| 
 | ||||
|             Deferred_GBufferEffect.Albedo = drawable.Albedo; | ||||
|             Deferred_GBufferEffect.Metallic = drawable.Metallic; | ||||
|  | @ -465,6 +468,7 @@ namespace Kav | |||
|             GraphicsDevice.DepthStencilState = DepthStencilState.Default; | ||||
|             GraphicsDevice.BlendState = BlendState.Opaque; | ||||
| 
 | ||||
|             Deferred_GBufferEffect.IsSprite = false; | ||||
|             Deferred_GBufferEffect.HardwareInstancingEnabled = false; | ||||
|             Deferred_GBufferEffect.View = camera.View; | ||||
|             Deferred_GBufferEffect.Projection = camera.Projection; | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue