From b1395babfe9489a31fc0d7de0bb1755a8546a412 Mon Sep 17 00:00:00 2001 From: cosmonaut Date: Tue, 8 Dec 2020 22:20:54 -0800 Subject: [PATCH] offset texture rendering --- Effects/DeferredPBR_GBufferEffect.cs | 29 +++++++++++++++ Effects/FXB/DeferredPBR_GBufferEffect.fxb | 4 +- Effects/HLSL/DeferredPBR_GBufferEffect.fx | 18 +++++++-- Geometry/Interfaces/IGBufferDrawable.cs | 3 ++ Geometry/MeshPart.cs | 3 ++ Renderer.cs | 37 ++++--------------- VertexDeclarations.cs | 6 +++ ...=> PositionTextureOffsetInstanceVertex.cs} | 11 ++++-- 8 files changed, 72 insertions(+), 39 deletions(-) rename Vertices/{PositionInstanceVertex.cs => PositionTextureOffsetInstanceVertex.cs} (58%) diff --git a/Effects/DeferredPBR_GBufferEffect.cs b/Effects/DeferredPBR_GBufferEffect.cs index 335a592..be3e3ff 100644 --- a/Effects/DeferredPBR_GBufferEffect.cs +++ b/Effects/DeferredPBR_GBufferEffect.cs @@ -16,6 +16,9 @@ namespace Kav EffectParameter metallicParam; EffectParameter roughnessParam; + EffectParameter numTextureRowsParam; + EffectParameter numTextureColumnsParam; + EffectParameter vertexShaderIndexParam; EffectParameter shaderIndexParam; @@ -27,6 +30,9 @@ namespace Kav float metallic; float roughness; + int numTextureRows = 1; + int numTextureColumns = 1; + bool albedoTextureEnabled = false; bool metallicRoughnessMapEnabled = false; bool normalMapEnabled = false; @@ -127,6 +133,26 @@ namespace Kav } } + public int NumTextureRows + { + get { return numTextureRows; } + set + { + numTextureRows = value; + numTextureRowsParam.SetValue(numTextureRows); + } + } + + public int NumTextureColumns + { + get { return numTextureColumns; } + set + { + numTextureColumns = value; + numTextureColumnsParam.SetValue(numTextureColumns); + } + } + public bool HardwareInstancingEnabled { get { return hardwareInstancingEnabled; } @@ -248,6 +274,9 @@ namespace Kav metallicParam = Parameters["MetallicValue"]; roughnessParam = Parameters["RoughnessValue"]; + numTextureRowsParam = Parameters["NumTextureRows"]; + numTextureColumnsParam = Parameters["NumTextureColumns"]; + shaderIndexParam = Parameters["PixelShaderIndex"]; vertexShaderIndexParam = Parameters["VertexShaderIndex"]; } diff --git a/Effects/FXB/DeferredPBR_GBufferEffect.fxb b/Effects/FXB/DeferredPBR_GBufferEffect.fxb index 2012ecb..0f379e6 100644 --- a/Effects/FXB/DeferredPBR_GBufferEffect.fxb +++ b/Effects/FXB/DeferredPBR_GBufferEffect.fxb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:240a1d0911f6bba0da34d5a158c5868e52f6612dc055cdc42d8cef2a5f3febaa -size 8908 +oid sha256:ebcbca875c8ce99a59a733d9bf45f35126b22dbee7e2a6378c91088fce2181dc +size 9232 diff --git a/Effects/HLSL/DeferredPBR_GBufferEffect.fx b/Effects/HLSL/DeferredPBR_GBufferEffect.fx index 52f911c..b73b617 100644 --- a/Effects/HLSL/DeferredPBR_GBufferEffect.fx +++ b/Effects/HLSL/DeferredPBR_GBufferEffect.fx @@ -10,6 +10,9 @@ BEGIN_CONSTANTS float MetallicValue _ps(c1) _cb(c1); float RoughnessValue _ps(c2) _cb(c2); + int NumTextureRows _vs(c9) _cb(c3); + int NumTextureColumns _vs(c10) _cb(c4); + MATRIX_CONSTANTS float4x4 World _vs(c0) _cb(c7); @@ -56,8 +59,11 @@ PixelInput main_vs(VertexInput input) return output; } -PixelInput instanced_vs(VertexInput input, float3 Translation : TEXCOORD2) -{ +PixelInput instanced_vs( + VertexInput input, + float3 Translation : TEXCOORD2, + float2 UVOffset : TEXCOORD5 +) { PixelInput output; float4x4 world = float4x4( @@ -65,13 +71,17 @@ PixelInput instanced_vs(VertexInput input, float3 Translation : TEXCOORD2) float4(0, 1, 0, 0), float4(0, 0, 1, 0), float4(Translation.x, Translation.y, Translation.z, 1) - ); + ); float4x4 worldViewProjection = mul(world, ViewProjection); output.PositionWorld = mul(input.Position, world); output.NormalWorld = mul(input.Normal, world); - output.TexCoord = input.TexCoord; + + float2 texCoord; + texCoord.x = (input.TexCoord.x / NumTextureColumns + UVOffset.x); + texCoord.y = (input.TexCoord.y / NumTextureRows + UVOffset.y); + output.TexCoord = texCoord; output.Position = mul(input.Position, worldViewProjection); diff --git a/Geometry/Interfaces/IGBufferDrawable.cs b/Geometry/Interfaces/IGBufferDrawable.cs index bf84905..d6fcae9 100644 --- a/Geometry/Interfaces/IGBufferDrawable.cs +++ b/Geometry/Interfaces/IGBufferDrawable.cs @@ -12,5 +12,8 @@ namespace Kav Texture2D AlbedoTexture { get; } Texture2D NormalTexture { get; } Texture2D MetallicRoughnessTexture { get; } + + int NumTextureRows { get; } + int NumTextureColumns { get; } } } diff --git a/Geometry/MeshPart.cs b/Geometry/MeshPart.cs index 80f52de..a5a6a70 100644 --- a/Geometry/MeshPart.cs +++ b/Geometry/MeshPart.cs @@ -38,6 +38,9 @@ namespace Kav public float Metallic { get; set; } = 0.5f; public float Roughness { get; set; } = 0.5f; + public int NumTextureRows { get; set; } = 1; + public int NumTextureColumns { get; set; } = 1; + public bool DisableAlbedoMap { get; set; } = false; public bool DisableNormalMap { get; set; } = false; public bool DisableMetallicRoughnessMap { get; set; } = false; diff --git a/Renderer.cs b/Renderer.cs index 9b7b0c0..9c97fef 100644 --- a/Renderer.cs +++ b/Renderer.cs @@ -63,14 +63,15 @@ namespace Kav ); } - public static (PositionInstanceVertex[], DynamicVertexBuffer) CreatePositionVertexBuffer( + public static (T[], DynamicVertexBuffer) CreateInstanceVertexBuffer( GraphicsDevice graphicsDevice, int instanceVertexCount - ) { - var positionData = new PositionInstanceVertex[instanceVertexCount]; + ) where T : IVertexType { + var positionData = new T[instanceVertexCount]; + var vertexBuffer = new DynamicVertexBuffer( graphicsDevice, - VertexDeclarations.PositionInstanceDeclaration, + typeof(T), instanceVertexCount, BufferUsage.WriteOnly ); @@ -257,31 +258,6 @@ namespace Kav } } - public static int FillInstanceVertexBuffer( - IEnumerable transforms, - V[] vertexData, - DynamicVertexBuffer dynamicVertexBuffer - ) where V : struct, IVertexType, IHasTranslation - { - int numInstances = 0; - foreach (var transform in transforms) - { - vertexData[numInstances].Translation = transform.Translation; - numInstances += 1; - } - - if (numInstances == 0) { return 0; } - - dynamicVertexBuffer.SetData( - vertexData, - 0, - numInstances, - SetDataOptions.Discard - ); - - return numInstances; - } - public static void RenderInstanced( GraphicsDevice graphicsDevice, T drawable, @@ -391,6 +367,9 @@ namespace Kav Deferred_GBufferEffect.Metallic = drawable.Metallic; Deferred_GBufferEffect.Roughness = drawable.Roughness; + Deferred_GBufferEffect.NumTextureRows = drawable.NumTextureRows; + Deferred_GBufferEffect.NumTextureColumns = drawable.NumTextureColumns; + Deferred_GBufferEffect.AlbedoTexture = drawable.AlbedoTexture; Deferred_GBufferEffect.NormalTexture = drawable.NormalTexture; Deferred_GBufferEffect.MetallicRoughnessTexture = drawable.MetallicRoughnessTexture; diff --git a/VertexDeclarations.cs b/VertexDeclarations.cs index f8b073f..a7349e0 100644 --- a/VertexDeclarations.cs +++ b/VertexDeclarations.cs @@ -8,5 +8,11 @@ namespace Kav ( new VertexElement(0, VertexElementFormat.Vector3, VertexElementUsage.TextureCoordinate, 2) ); + + public static VertexDeclaration PositionTextureOffsetInstanceDeclaration = new VertexDeclaration + ( + new VertexElement(0, VertexElementFormat.Vector3, VertexElementUsage.TextureCoordinate, 2), + new VertexElement(12, VertexElementFormat.Vector2, VertexElementUsage.TextureCoordinate, 5) + ); } } diff --git a/Vertices/PositionInstanceVertex.cs b/Vertices/PositionTextureOffsetInstanceVertex.cs similarity index 58% rename from Vertices/PositionInstanceVertex.cs rename to Vertices/PositionTextureOffsetInstanceVertex.cs index f173cef..a4831fd 100644 --- a/Vertices/PositionInstanceVertex.cs +++ b/Vertices/PositionTextureOffsetInstanceVertex.cs @@ -5,24 +5,27 @@ using Microsoft.Xna.Framework.Graphics; namespace Kav { [StructLayout(LayoutKind.Sequential, Pack = 1)] - public struct PositionInstanceVertex : IVertexType, IHasTranslation + public struct PositionTextureOffsetInstanceVertex : IVertexType { VertexDeclaration IVertexType.VertexDeclaration { get { - return VertexDeclarations.PositionInstanceDeclaration; + return VertexDeclarations.PositionTextureOffsetInstanceDeclaration; } } public Vector3 Translation { get; set; } + public Vector2 UVOffset { get; set; } public static readonly VertexDeclaration VertexDeclaration; - public PositionInstanceVertex( - Vector3 translation + public PositionTextureOffsetInstanceVertex( + Vector3 translation, + Vector2 uvOffset ) { Translation = translation; + UVOffset = uvOffset; } } }