From 41fc925e78ef0037abd54d3ee8bc7c4ea2394358 Mon Sep 17 00:00:00 2001 From: turanszkij Date: Sun, 21 May 2017 23:42:29 +0200 Subject: [PATCH] optimized vertex streams part1 --- WickedEngine/ArchiveVersionHistory.txt | 1 + WickedEngine/WickedEngine_SHADERS.vcxproj | 18 +- .../WickedEngine_SHADERS.vcxproj.filters | 21 +- WickedEngine/cubeShadowGS.hlsl | 5 +- WickedEngine/cubeShadowGS_alphatest.hlsl | 40 ++++ WickedEngine/cubeShadowPS.hlsl | 2 - WickedEngine/cubeShadowPS_alphatest.hlsl | 15 ++ WickedEngine/cubeShadowVS.hlsl | 10 +- WickedEngine/cubeShadowVS_alphatest.hlsl | 23 +++ WickedEngine/envMapVS.hlsl | 2 +- WickedEngine/objectInputLayoutHF.hlsli | 20 +- WickedEngine/objectVS_common.hlsl | 10 +- .../objectVS_common_tessellation.hlsl | 12 +- WickedEngine/objectVS_debug.hlsl | 2 +- WickedEngine/objectVS_positionstream.hlsl | 19 ++ WickedEngine/objectVS_simple.hlsl | 6 +- .../objectVS_simple_tessellation.hlsl | 6 +- WickedEngine/objectVS_voxelizer.hlsl | 4 +- ...{shadowPS.hlsl => shadowPS_alphatest.hlsl} | 0 WickedEngine/shadowVS.hlsl | 8 +- WickedEngine/shadowVS_alphatest.hlsl | 26 +++ WickedEngine/skinningHF.hlsli | 8 +- WickedEngine/waterVS.hlsl | 2 +- WickedEngine/wiArchive.cpp | 2 +- WickedEngine/wiEnums.h | 17 +- WickedEngine/wiGraphicsDevice_DX11.cpp | 4 +- WickedEngine/wiLoader.cpp | 7 +- WickedEngine/wiLoader.h | 16 +- WickedEngine/wiRenderer.cpp | 190 ++++++++++++------ WickedEngine/wiVersion.cpp | 2 +- WickedEngine/windHF.hlsli | 4 +- 31 files changed, 366 insertions(+), 136 deletions(-) create mode 100644 WickedEngine/cubeShadowGS_alphatest.hlsl create mode 100644 WickedEngine/cubeShadowPS_alphatest.hlsl create mode 100644 WickedEngine/cubeShadowVS_alphatest.hlsl create mode 100644 WickedEngine/objectVS_positionstream.hlsl rename WickedEngine/{shadowPS.hlsl => shadowPS_alphatest.hlsl} (100%) create mode 100644 WickedEngine/shadowVS_alphatest.hlsl diff --git a/WickedEngine/ArchiveVersionHistory.txt b/WickedEngine/ArchiveVersionHistory.txt index 88b5b3b76..c9488917d 100644 --- a/WickedEngine/ArchiveVersionHistory.txt +++ b/WickedEngine/ArchiveVersionHistory.txt @@ -1,5 +1,6 @@ This file contains changelog of wiArchive versions +8: refactored vertex wind weight 7: serialized extended mesh properties 6: serialized area light properties 5: serialized color and emissive decal properties diff --git a/WickedEngine/WickedEngine_SHADERS.vcxproj b/WickedEngine/WickedEngine_SHADERS.vcxproj index 8046cf662..22f7996d1 100644 --- a/WickedEngine/WickedEngine_SHADERS.vcxproj +++ b/WickedEngine/WickedEngine_SHADERS.vcxproj @@ -71,12 +71,22 @@ Geometry + + Geometry + 4.0 + Pixel + + Pixel + Vertex + + Vertex + Vertex @@ -351,6 +361,9 @@ Vertex + + Vertex + Vertex @@ -413,12 +426,15 @@ Vertex - + Pixel Vertex + + Vertex + Pixel diff --git a/WickedEngine/WickedEngine_SHADERS.vcxproj.filters b/WickedEngine/WickedEngine_SHADERS.vcxproj.filters index db28377d1..2a03c8acc 100644 --- a/WickedEngine/WickedEngine_SHADERS.vcxproj.filters +++ b/WickedEngine/WickedEngine_SHADERS.vcxproj.filters @@ -231,9 +231,6 @@ PS - - PS - PS @@ -588,6 +585,24 @@ PS + + VS + + + VS + + + GS + + + PS + + + PS + + + VS + diff --git a/WickedEngine/cubeShadowGS.hlsl b/WickedEngine/cubeShadowGS.hlsl index 34eed687e..dd5bd8b78 100644 --- a/WickedEngine/cubeShadowGS.hlsl +++ b/WickedEngine/cubeShadowGS.hlsl @@ -2,14 +2,12 @@ struct GS_CUBEMAP_IN { - float4 Pos : SV_POSITION; // World position - float2 Tex : TEXCOORD0; // Texture coord + float4 Pos : SV_POSITION; }; struct PS_CUBEMAP_IN { float4 Pos : SV_POSITION; float3 pos3D : POSITION3D; - float2 Tex : TEXCOORD0; // Texture coord uint RTIndex : SV_RenderTargetArrayIndex; }; @@ -32,7 +30,6 @@ void main( triangle GS_CUBEMAP_IN input[3], inout TriangleStream { output.Pos = mul(input[v].Pos, xCubeShadowVP[f]); output.pos3D = input[v].Pos.xyz; - output.Tex = input[v].Tex; CubeMapStream.Append(output); } CubeMapStream.RestartStrip(); diff --git a/WickedEngine/cubeShadowGS_alphatest.hlsl b/WickedEngine/cubeShadowGS_alphatest.hlsl new file mode 100644 index 000000000..ca1d39522 --- /dev/null +++ b/WickedEngine/cubeShadowGS_alphatest.hlsl @@ -0,0 +1,40 @@ +#include "globals.hlsli" + +struct GS_CUBEMAP_IN +{ + float4 Pos : SV_POSITION; + float2 Tex : TEXCOORD0; +}; +struct PS_CUBEMAP_IN +{ + float4 Pos : SV_POSITION; + float3 pos3D : POSITION3D; + float2 Tex : TEXCOORD0; + uint RTIndex : SV_RenderTargetArrayIndex; +}; + + +CBUFFER(CubemapRenderCB, CBSLOT_RENDERER_CUBEMAPRENDER) +{ + float4x4 xCubeShadowVP[6]; +} + +[maxvertexcount(18)] +void main(triangle GS_CUBEMAP_IN input[3], inout TriangleStream CubeMapStream) +{ + [unroll] + for (int f = 0; f < 6; ++f) + { + PS_CUBEMAP_IN output; + output.RTIndex = f; + [unroll] + for (int v = 0; v < 3; v++) + { + output.Pos = mul(input[v].Pos, xCubeShadowVP[f]); + output.pos3D = input[v].Pos.xyz; + output.Tex = input[v].Tex; + CubeMapStream.Append(output); + } + CubeMapStream.RestartStrip(); + } +} \ No newline at end of file diff --git a/WickedEngine/cubeShadowPS.hlsl b/WickedEngine/cubeShadowPS.hlsl index 5ac197176..dd91c506a 100644 --- a/WickedEngine/cubeShadowPS.hlsl +++ b/WickedEngine/cubeShadowPS.hlsl @@ -4,12 +4,10 @@ struct VertextoPixel { float4 pos : SV_POSITION; float3 pos3D : POSITION3D; - float2 tex : TEXCOORD0; uint RTIndex : SV_RenderTargetArrayIndex; }; float main(VertextoPixel PSIn) : SV_DEPTHLESSEQUAL { - ALPHATEST(xBaseColorMap.Sample(sampler_linear_wrap,PSIn.tex).a); return distance(PSIn.pos3D.xyz, g_xColor.xyz) * g_xColor.w; // g_xColor.w = 1.0 / range } \ No newline at end of file diff --git a/WickedEngine/cubeShadowPS_alphatest.hlsl b/WickedEngine/cubeShadowPS_alphatest.hlsl new file mode 100644 index 000000000..26e17cdb4 --- /dev/null +++ b/WickedEngine/cubeShadowPS_alphatest.hlsl @@ -0,0 +1,15 @@ +#include "objectHF.hlsli" + +struct VertextoPixel +{ + float4 pos : SV_POSITION; + float3 pos3D : POSITION3D; + float2 tex : TEXCOORD0; + uint RTIndex : SV_RenderTargetArrayIndex; +}; + +float main(VertextoPixel PSIn) : SV_DEPTHLESSEQUAL +{ + ALPHATEST(xBaseColorMap.Sample(sampler_linear_wrap,PSIn.tex).a); + return distance(PSIn.pos3D.xyz, g_xColor.xyz) * g_xColor.w; // g_xColor.w = 1.0 / range +} \ No newline at end of file diff --git a/WickedEngine/cubeShadowVS.hlsl b/WickedEngine/cubeShadowVS.hlsl index 944bdd4f2..3f227bb90 100644 --- a/WickedEngine/cubeShadowVS.hlsl +++ b/WickedEngine/cubeShadowVS.hlsl @@ -4,21 +4,17 @@ struct GS_CUBEMAP_IN { - float4 Pos : SV_POSITION; // World position - float2 Tex : TEXCOORD0; // Texture coord + float4 Pos : SV_POSITION; // World position }; -GS_CUBEMAP_IN main(Input_Shadow input) +GS_CUBEMAP_IN main(Input_Shadow_POS input) { GS_CUBEMAP_IN Out = (GS_CUBEMAP_IN)0; float4x4 WORLD = MakeWorldMatrixFromInstance(input.instance); - float4 pos = input.pos; - - Out.Pos = mul(pos, WORLD); - Out.Tex = input.tex.xy; + Out.Pos = mul(float4(input.pos.xyz, 1), WORLD); return Out; diff --git a/WickedEngine/cubeShadowVS_alphatest.hlsl b/WickedEngine/cubeShadowVS_alphatest.hlsl new file mode 100644 index 000000000..1aaf47044 --- /dev/null +++ b/WickedEngine/cubeShadowVS_alphatest.hlsl @@ -0,0 +1,23 @@ +#include "globals.hlsli" +#include "objectInputLayoutHF.hlsli" + + +struct GS_CUBEMAP_IN +{ + float4 Pos : SV_POSITION; // World position + float2 Tex : TEXCOORD0; // Texture coord +}; + +GS_CUBEMAP_IN main(Input_Shadow_POS_TEX input) +{ + GS_CUBEMAP_IN Out = (GS_CUBEMAP_IN)0; + + + float4x4 WORLD = MakeWorldMatrixFromInstance(input.instance); + + Out.Pos = mul(float4(input.pos.xyz, 1), WORLD); + Out.Tex = input.tex.xy; + + + return Out; +} \ No newline at end of file diff --git a/WickedEngine/envMapVS.hlsl b/WickedEngine/envMapVS.hlsl index c73cf5246..587e6e17a 100644 --- a/WickedEngine/envMapVS.hlsl +++ b/WickedEngine/envMapVS.hlsl @@ -2,7 +2,7 @@ #include "envMapHF.hlsli" -VSOut main(Input input) +VSOut main(Input_Object_ALL input) { VSOut Out = (VSOut)0; diff --git a/WickedEngine/objectInputLayoutHF.hlsli b/WickedEngine/objectInputLayoutHF.hlsli index f8aff96fd..72c6090cc 100644 --- a/WickedEngine/objectInputLayoutHF.hlsli +++ b/WickedEngine/objectInputLayoutHF.hlsli @@ -14,9 +14,14 @@ struct Input_InstancePrev float4 wiPrev1 : MATIPREV1; float4 wiPrev2 : MATIPREV2; }; -struct Input_Shadow + +struct Input_Shadow_POS +{ + float4 pos : POSITION; + Input_Instance instance; +}; +struct Input_Shadow_POS_TEX { - uint id: SV_VertexID; float4 pos : POSITION; float4 tex : TEXCOORD0; Input_Instance instance; @@ -28,16 +33,19 @@ struct Input_Skinning float4 bon : TEXCOORD0; float4 wei : TEXCOORD1; }; -struct Input_Simple +struct Input_Object_POS +{ + float4 pos : POSITION; + Input_Instance instance; +}; +struct Input_Object_POS_TEX { - uint id: SV_VertexID; float4 pos : POSITION; float4 tex : TEXCOORD0; Input_Instance instance; }; -struct Input +struct Input_Object_ALL { - uint id: SV_VertexID; float4 pos : POSITION; float4 nor : NORMAL; float4 tex : TEXCOORD0; diff --git a/WickedEngine/objectVS_common.hlsl b/WickedEngine/objectVS_common.hlsl index 1743d73d8..07a62b874 100644 --- a/WickedEngine/objectVS_common.hlsl +++ b/WickedEngine/objectVS_common.hlsl @@ -2,7 +2,7 @@ -PixelInputType main(Input input) +PixelInputType main(Input_Object_ALL input) { PixelInputType Out = (PixelInputType)0; @@ -13,8 +13,8 @@ PixelInputType main(Input input) Out.instanceColor = input.instance.color_dither.rgb; Out.dither = input.instance.color_dither.a; - float4 pos = input.pos; - float4 posPrev = input.pre; + float4 pos = float4(input.pos.xyz, 1); + float4 posPrev = float4(input.pre.xyz, 1); pos = mul( pos,WORLD ); posPrev = mul(posPrev, WORLDPREV); @@ -23,8 +23,8 @@ PixelInputType main(Input input) Out.clip = dot(pos, g_xClipPlane); float3 normal = mul(normalize(input.nor.xyz), (float3x3)WORLD); - affectWind(pos.xyz, input.tex.w, input.id, g_xFrame_Time); - affectWind(posPrev.xyz, input.tex.w, input.id, g_xFrame_TimePrev); + affectWind(pos.xyz, input.pos.w, g_xFrame_Time); + affectWind(posPrev.xyz, input.pos.w, g_xFrame_TimePrev); //VERTEX OFFSET MOTION BLUR diff --git a/WickedEngine/objectVS_common_tessellation.hlsl b/WickedEngine/objectVS_common_tessellation.hlsl index bbab90d12..5042f1f11 100644 --- a/WickedEngine/objectVS_common_tessellation.hlsl +++ b/WickedEngine/objectVS_common_tessellation.hlsl @@ -12,7 +12,7 @@ struct HullInputType }; -HullInputType main(Input input) +HullInputType main(Input_Object_ALL input) { HullInputType Out = (HullInputType)0; @@ -20,17 +20,17 @@ HullInputType main(Input input) float4x4 WORLD = MakeWorldMatrixFromInstance(input.instance); float4x4 WORLDPREV = MakeWorldMatrixFromInstance(input.instancePrev); - float4 pos = input.pos; - float4 posPrev = input.pre; + float4 pos = float4(input.pos.xyz, 1); + float4 posPrev = float4(input.pre.xyz, 1); - pos = mul( pos,WORLD ); + pos = mul(pos, WORLD); posPrev = mul(posPrev, WORLDPREV); float3 normal = mul(normalize(input.nor.xyz), (float3x3)WORLD); - affectWind(pos.xyz, input.tex.w, input.id, g_xFrame_Time); - affectWind(posPrev.xyz,input.tex.w,input.id, g_xFrame_TimePrev); + affectWind(pos.xyz, input.pos.w, g_xFrame_Time); + affectWind(posPrev.xyz,input.pos.w, g_xFrame_TimePrev); Out.pos=pos.xyz; diff --git a/WickedEngine/objectVS_debug.hlsl b/WickedEngine/objectVS_debug.hlsl index 8103dd964..af0e6de75 100644 --- a/WickedEngine/objectVS_debug.hlsl +++ b/WickedEngine/objectVS_debug.hlsl @@ -2,5 +2,5 @@ float4 main( float4 pos : POSITION ) : SV_POSITION { - return mul(pos, g_xTransform); + return mul(float4(pos.xyz, 1), g_xTransform); } \ No newline at end of file diff --git a/WickedEngine/objectVS_positionstream.hlsl b/WickedEngine/objectVS_positionstream.hlsl new file mode 100644 index 000000000..14ec0810c --- /dev/null +++ b/WickedEngine/objectVS_positionstream.hlsl @@ -0,0 +1,19 @@ +#include "objectHF.hlsli" + + + +float4 main(Input_Object_POS input) : SV_POSITION +{ + PixelInputType_Simple Out = (PixelInputType_Simple)0; + + float4x4 WORLD = MakeWorldMatrixFromInstance(input.instance); + + float4 pos = float4(input.pos.xyz, 1); + + pos = mul(pos, WORLD); + + affectWind(pos.xyz, input.pos.w, g_xFrame_Time); + + + return mul(pos, g_xCamera_VP); +} diff --git a/WickedEngine/objectVS_simple.hlsl b/WickedEngine/objectVS_simple.hlsl index adcee3f6a..ea6c66f04 100644 --- a/WickedEngine/objectVS_simple.hlsl +++ b/WickedEngine/objectVS_simple.hlsl @@ -2,7 +2,7 @@ -PixelInputType_Simple main(Input_Simple input) +PixelInputType_Simple main(Input_Object_POS_TEX input) { PixelInputType_Simple Out = (PixelInputType_Simple)0; @@ -11,13 +11,13 @@ PixelInputType_Simple main(Input_Simple input) Out.instanceColor = input.instance.color_dither.rgb; Out.dither = input.instance.color_dither.a; - float4 pos = input.pos; + float4 pos = float4(input.pos.xyz, 1); pos = mul(pos, WORLD); Out.clip = dot(pos, g_xClipPlane); - affectWind(pos.xyz, input.tex.w, input.id, g_xFrame_Time); + affectWind(pos.xyz, input.pos.w, g_xFrame_Time); Out.pos = mul(pos, g_xCamera_VP); diff --git a/WickedEngine/objectVS_simple_tessellation.hlsl b/WickedEngine/objectVS_simple_tessellation.hlsl index a797cbab6..ad6cc3557 100644 --- a/WickedEngine/objectVS_simple_tessellation.hlsl +++ b/WickedEngine/objectVS_simple_tessellation.hlsl @@ -12,18 +12,18 @@ struct HullInputType }; -HullInputType main(Input input) +HullInputType main(Input_Object_ALL input) { HullInputType Out = (HullInputType)0; float4x4 WORLD = MakeWorldMatrixFromInstance(input.instance); - float4 pos = input.pos; + float4 pos = float4(input.pos.xyz, 1); pos = mul(pos, WORLD); - affectWind(pos.xyz, input.tex.w, input.id, g_xFrame_Time); + affectWind(pos.xyz, input.pos.w, g_xFrame_Time); float3 normal = mul(normalize(input.nor.xyz), (float3x3)WORLD); diff --git a/WickedEngine/objectVS_voxelizer.hlsl b/WickedEngine/objectVS_voxelizer.hlsl index 07d0e948a..f6a237b86 100644 --- a/WickedEngine/objectVS_voxelizer.hlsl +++ b/WickedEngine/objectVS_voxelizer.hlsl @@ -8,13 +8,13 @@ struct VSOut float3 instanceColor : COLOR; }; -VSOut main(Input input, uint instanceID : SV_INSTANCEID) +VSOut main(Input_Object_ALL input, uint instanceID : SV_INSTANCEID) { VSOut Out = (VSOut)0; float4x4 WORLD = MakeWorldMatrixFromInstance(input.instance); - Out.pos = mul(input.pos, WORLD); + Out.pos = mul(float4(input.pos.xyz, 1), WORLD); Out.nor = normalize(mul(input.nor.xyz, (float3x3)WORLD)); Out.tex = input.tex.xy; Out.instanceColor = input.instance.color_dither.rgb; diff --git a/WickedEngine/shadowPS.hlsl b/WickedEngine/shadowPS_alphatest.hlsl similarity index 100% rename from WickedEngine/shadowPS.hlsl rename to WickedEngine/shadowPS_alphatest.hlsl diff --git a/WickedEngine/shadowVS.hlsl b/WickedEngine/shadowVS.hlsl index a4c4094d7..691733949 100644 --- a/WickedEngine/shadowVS.hlsl +++ b/WickedEngine/shadowVS.hlsl @@ -6,20 +6,18 @@ struct VertexOut { float4 pos : SV_POSITION; - float2 tex : TEXCOORD0; }; -VertexOut main(Input_Shadow input) +VertexOut main(Input_Shadow_POS input) { VertexOut Out = (VertexOut)0; float4x4 WORLD = MakeWorldMatrixFromInstance(input.instance); - Out.pos = mul(input.pos, WORLD); - affectWind(Out.pos.xyz, input.tex.w, input.id, g_xFrame_Time); + Out.pos = mul(float4(input.pos.xyz, 1), WORLD); + affectWind(Out.pos.xyz, input.pos.w, g_xFrame_Time); Out.pos = mul(Out.pos, g_xCamera_VP); - Out.tex = input.tex.xy; return Out; diff --git a/WickedEngine/shadowVS_alphatest.hlsl b/WickedEngine/shadowVS_alphatest.hlsl new file mode 100644 index 000000000..a4e224ddc --- /dev/null +++ b/WickedEngine/shadowVS_alphatest.hlsl @@ -0,0 +1,26 @@ +#include "globals.hlsli" +#include "objectInputLayoutHF.hlsli" +#include "windHF.hlsli" + + +struct VertexOut +{ + float4 pos : SV_POSITION; + float2 tex : TEXCOORD0; +}; + +VertexOut main(Input_Shadow_POS_TEX input) +{ + VertexOut Out = (VertexOut)0; + + float4x4 WORLD = MakeWorldMatrixFromInstance(input.instance); + + Out.pos = mul(float4(input.pos.xyz, 1), WORLD); + affectWind(Out.pos.xyz, input.pos.w, g_xFrame_Time); + + Out.pos = mul(Out.pos, g_xCamera_VP); + Out.tex = input.tex.xy; + + + return Out; +} \ No newline at end of file diff --git a/WickedEngine/skinningHF.hlsli b/WickedEngine/skinningHF.hlsli index 7f6433021..504fd6c28 100644 --- a/WickedEngine/skinningHF.hlsli +++ b/WickedEngine/skinningHF.hlsli @@ -23,13 +23,13 @@ inline void Skinning(inout float4 pos, inout float4 posPrev, inout float4 nor, i mp = boneBuffer[(uint)inBon[i]].prev; m3 = (float3x3)m; - p += mul(pos, m)*inWei[i]; - pp += mul(posPrev, mp)*inWei[i]; + p += mul(float4(pos.xyz, 1), m)*inWei[i]; + pp += mul(float4(posPrev.xyz, 1), mp)*inWei[i]; n += mul(nor.xyz, m3)*inWei[i]; } bool w = any(inWei); - pos = w ? p : pos; - posPrev = w ? pp : posPrev; + pos.xyz = w ? p.xyz : pos.xyz; + posPrev.xyz = w ? pp.xyz : posPrev.xyz; nor.xyz = w ? n : nor.xyz; } diff --git a/WickedEngine/waterVS.hlsl b/WickedEngine/waterVS.hlsl index 28d7d2bba..c08db5614 100644 --- a/WickedEngine/waterVS.hlsl +++ b/WickedEngine/waterVS.hlsl @@ -1,6 +1,6 @@ #include "objectHF.hlsli" -PixelInputType main(Input input) +PixelInputType main(Input_Object_ALL input) { PixelInputType Out = (PixelInputType)0; diff --git a/WickedEngine/wiArchive.cpp b/WickedEngine/wiArchive.cpp index 11b23eccd..13c2c00f4 100644 --- a/WickedEngine/wiArchive.cpp +++ b/WickedEngine/wiArchive.cpp @@ -7,7 +7,7 @@ using namespace std; // this should always be only INCREMENTED and only if a new serialization is implemeted somewhere! -uint64_t __archiveVersion = 7; +uint64_t __archiveVersion = 8; // this is the version number of which below the archive is not compatible with the current version uint64_t __archiveVersionBarrier = 1; diff --git a/WickedEngine/wiEnums.h b/WickedEngine/wiEnums.h index 6b3082754..23de481ff 100644 --- a/WickedEngine/wiEnums.h +++ b/WickedEngine/wiEnums.h @@ -106,7 +106,9 @@ enum VSTYPES VSTYPE_OBJECT_COMMON_TESSELLATION, VSTYPE_OBJECT_SIMPLE_TESSELLATION, VSTYPE_SHADOW, - VSTYPE_SHADOWCUBE, + VSTYPE_SHADOW_ALPHATEST, + VSTYPE_SHADOWCUBEMAPRENDER, + VSTYPE_SHADOWCUBEMAPRENDER_ALPHATEST, VSTYPE_LINE, VSTYPE_TRAIL, VSTYPE_WATER, @@ -172,7 +174,7 @@ enum PSTYPES PSTYPE_OBJECT_TEXTUREONLY, PSTYPE_OBJECT_ALPHATESTONLY, - PSTYPE_SHADOW, + PSTYPE_SHADOW_ALPHATEST, PSTYPE_LINE, PSTYPE_TRAIL, PSTYPE_ENVIRONMENTALLIGHT, @@ -186,6 +188,7 @@ enum PSTYPES PSTYPE_TUBELIGHT, PSTYPE_VOLUMELIGHT, PSTYPE_SHADOWCUBEMAPRENDER, + PSTYPE_SHADOWCUBEMAPRENDER_ALPHATEST, PSTYPE_DECAL, PSTYPE_SKY, PSTYPE_SUN, @@ -201,6 +204,7 @@ enum PSTYPES enum GSTYPES { GSTYPE_SHADOWCUBEMAPRENDER, + GSTYPE_SHADOWCUBEMAPRENDER_ALPHATEST, GSTYPE_STREAMOUT, GSTYPE_ENVMAP, GSTYPE_ENVMAP_SKY, @@ -245,10 +249,11 @@ enum CSTYPES // vertex layouts enum VLTYPES { - VLTYPE_OBJECT, - VLTYPE_OBJECT_SIMPLE, - VLTYPE_OBJECT_DEBUG, - VLTYPE_SHADOW, + VLTYPE_OBJECT_POS, + VLTYPE_OBJECT_POS_TEX, + VLTYPE_OBJECT_ALL, + VLTYPE_SHADOW_POS, + VLTYPE_SHADOW_POS_TEX, VLTYPE_LINE, VLTYPE_TRAIL, VLTYPE_STREAMOUT, diff --git a/WickedEngine/wiGraphicsDevice_DX11.cpp b/WickedEngine/wiGraphicsDevice_DX11.cpp index b29df6025..2b8bfa2a5 100644 --- a/WickedEngine/wiGraphicsDevice_DX11.cpp +++ b/WickedEngine/wiGraphicsDevice_DX11.cpp @@ -1401,7 +1401,7 @@ GraphicsDevice_DX11::GraphicsDevice_DX11(wiWindowRegistration::window_type windo } UINT createDeviceFlags = 0; - //createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG; + createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG; D3D_DRIVER_TYPE driverTypes[] = { @@ -3051,7 +3051,7 @@ void GraphicsDevice_DX11::BindVertexBuffers(const GPUBuffer* const *vertexBuffer { assert(count <= 8); ID3D11Buffer* res[8] = { 0 }; - for (UINT i = 0; i < count; ++i) + for (int i = 0; i < count; ++i) { res[i] = vertexBuffers[i] != nullptr ? vertexBuffers[i]->resource_DX11 : nullptr; } diff --git a/WickedEngine/wiLoader.cpp b/WickedEngine/wiLoader.cpp index a50135b59..b6d85dcec 100644 --- a/WickedEngine/wiLoader.cpp +++ b/WickedEngine/wiLoader.cpp @@ -534,7 +534,7 @@ void LoadWiMeshes(const std::string& directory, const std::string& name, const s case 'v': for (int vprop = 0; vprop < VPROP_COUNT; ++vprop) { - currentMesh->vertices[vprop].push_back(XMFLOAT4(0,0,0,1)); + currentMesh->vertices[vprop].push_back(XMFLOAT4(0,0,0,0)); } file >> currentMesh->vertices[VPROP_POS].back().x; file >> currentMesh->vertices[VPROP_POS].back().y; @@ -2347,6 +2347,11 @@ void Mesh::Serialize(wiArchive& archive) archive >> vertices[VPROP_TEX][i]; archive >> vertices[VPROP_BON][i]; archive >> vertices[VPROP_WEI][i]; + + if (archive.GetVersion() < 8) + { + vertices[VPROP_POS][i].w = vertices[VPROP_TEX][i].w; + } } } // indices diff --git a/WickedEngine/wiLoader.h b/WickedEngine/wiLoader.h index 2bd63deaf..c5d3bb62b 100644 --- a/WickedEngine/wiLoader.h +++ b/WickedEngine/wiLoader.h @@ -36,9 +36,9 @@ class wiArchive; enum VERTEXPROPERTY { - VPROP_POS, // pos + VPROP_POS, // pos, wind VPROP_NOR, // normal, vertexao - VPROP_TEX, // texcoord, materialindex, wind + VPROP_TEX, // texcoord, materialindex, unused VPROP_BON, // boneindices VPROP_WEI, // boneweights VPROP_COUNT, @@ -46,15 +46,15 @@ enum VERTEXPROPERTY #define VPROP_PRE VPROP_BON // posprev struct SkinnedVertex { - XMFLOAT4 pos; //pos + XMFLOAT4 pos; //pos, wind XMFLOAT4 nor; //normal, vertex ao - XMFLOAT4 tex; //tex, matIndex, wind + XMFLOAT4 tex; //tex, matIndex, unused XMFLOAT4 bon; //bone indices XMFLOAT4 wei; //bone weights SkinnedVertex(){ - pos=XMFLOAT4(0,0,0,1); + pos=XMFLOAT4(0,0,0,0); nor=XMFLOAT4(0,0,0,1); tex=XMFLOAT4(0,0,0,0); bon=XMFLOAT4(0,0,0,0); @@ -71,13 +71,13 @@ struct SkinnedVertex }; struct Vertex { - XMFLOAT4 pos; //pos + XMFLOAT4 pos; //pos, wind XMFLOAT4 nor; //normal, vertex ao - XMFLOAT4 tex; //tex, matIndex, wind + XMFLOAT4 tex; //tex, matIndex, unused XMFLOAT4 pre; //previous frame position Vertex(){ - pos=XMFLOAT4(0,0,0,1); + pos=XMFLOAT4(0,0,0,0); nor=XMFLOAT4(0,0,0,1); tex=XMFLOAT4(0,0,0,0); pre=XMFLOAT4(0,0,0,0); diff --git a/WickedEngine/wiRenderer.cpp b/WickedEngine/wiRenderer.cpp index dbf09df15..f2a1a8724 100644 --- a/WickedEngine/wiRenderer.cpp +++ b/WickedEngine/wiRenderer.cpp @@ -631,7 +631,7 @@ void wiRenderer::LoadShaders() VertexShaderInfo* vsinfo = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "objectVS_debug.cso", wiResourceManager::VERTEXSHADER, layout, numElements)); if (vsinfo != nullptr) { vertexShaders[VSTYPE_OBJECT_DEBUG] = vsinfo->vertexShader; - vertexLayouts[VLTYPE_OBJECT_DEBUG] = vsinfo->vertexLayout; + vertexLayouts[VLTYPE_OBJECT_POS] = vsinfo->vertexLayout; } } { @@ -654,7 +654,7 @@ void wiRenderer::LoadShaders() VertexShaderInfo* vsinfo = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "objectVS_common.cso", wiResourceManager::VERTEXSHADER, layout, numElements)); if (vsinfo != nullptr){ vertexShaders[VSTYPE_OBJECT_COMMON] = vsinfo->vertexShader; - vertexLayouts[VLTYPE_OBJECT] = vsinfo->vertexLayout; + vertexLayouts[VLTYPE_OBJECT_ALL] = vsinfo->vertexLayout; } } { @@ -672,10 +672,26 @@ void wiRenderer::LoadShaders() VertexShaderInfo* vsinfo = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "objectVS_Simple.cso", wiResourceManager::VERTEXSHADER, layout, numElements)); if (vsinfo != nullptr){ vertexShaders[VSTYPE_OBJECT_SIMPLE] = vsinfo->vertexShader; - vertexLayouts[VLTYPE_OBJECT_SIMPLE] = vsinfo->vertexLayout; + vertexLayouts[VLTYPE_OBJECT_POS_TEX] = vsinfo->vertexLayout; } } + { + VertexLayoutDesc layout[] = + { + { "POSITION", 0, FORMAT_R32G32B32A32_FLOAT, 0, APPEND_ALIGNED_ELEMENT, INPUT_PER_VERTEX_DATA, 0 }, + { "MATI", 0, FORMAT_R32G32B32A32_FLOAT, 2, APPEND_ALIGNED_ELEMENT, INPUT_PER_INSTANCE_DATA, 1 }, + { "MATI", 1, FORMAT_R32G32B32A32_FLOAT, 2, APPEND_ALIGNED_ELEMENT, INPUT_PER_INSTANCE_DATA, 1 }, + { "MATI", 2, FORMAT_R32G32B32A32_FLOAT, 2, APPEND_ALIGNED_ELEMENT, INPUT_PER_INSTANCE_DATA, 1 }, + { "COLOR_DITHER", 0, FORMAT_R32G32B32A32_FLOAT, 2, APPEND_ALIGNED_ELEMENT, INPUT_PER_INSTANCE_DATA, 1 }, + }; + UINT numElements = ARRAYSIZE(layout); + VertexShaderInfo* vsinfo = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "shadowVS.cso", wiResourceManager::VERTEXSHADER, layout, numElements)); + if (vsinfo != nullptr) { + vertexShaders[VSTYPE_SHADOW] = vsinfo->vertexShader; + vertexLayouts[VLTYPE_SHADOW_POS] = vsinfo->vertexLayout; + } + } { VertexLayoutDesc layout[] = { @@ -688,13 +704,12 @@ void wiRenderer::LoadShaders() { "COLOR_DITHER", 0, FORMAT_R32G32B32A32_FLOAT, 2, APPEND_ALIGNED_ELEMENT, INPUT_PER_INSTANCE_DATA, 1 }, }; UINT numElements = ARRAYSIZE(layout); - VertexShaderInfo* vsinfo = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "shadowVS.cso", wiResourceManager::VERTEXSHADER, layout, numElements)); - if (vsinfo != nullptr){ - vertexShaders[VSTYPE_SHADOW] = vsinfo->vertexShader; - vertexLayouts[VLTYPE_SHADOW] = vsinfo->vertexLayout; + VertexShaderInfo* vsinfo = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "shadowVS_alphatest.cso", wiResourceManager::VERTEXSHADER, layout, numElements)); + if (vsinfo != nullptr) { + vertexShaders[VSTYPE_SHADOW_ALPHATEST] = vsinfo->vertexShader; + vertexLayouts[VLTYPE_SHADOW_POS_TEX] = vsinfo->vertexLayout; } } - { VertexLayoutDesc oslayout[] = { @@ -772,7 +787,8 @@ void wiRenderer::LoadShaders() vertexShaders[VSTYPE_ENVMAP_SKY] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "envMap_skyVS.cso", wiResourceManager::VERTEXSHADER))->vertexShader; vertexShaders[VSTYPE_SPHERE] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "sphereVS.cso", wiResourceManager::VERTEXSHADER))->vertexShader; vertexShaders[VSTYPE_CUBE] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "cubeVS.cso", wiResourceManager::VERTEXSHADER))->vertexShader; - vertexShaders[VSTYPE_SHADOWCUBE] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "cubeShadowVS.cso", wiResourceManager::VERTEXSHADER))->vertexShader; + vertexShaders[VSTYPE_SHADOWCUBEMAPRENDER] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "cubeShadowVS.cso", wiResourceManager::VERTEXSHADER))->vertexShader; + vertexShaders[VSTYPE_SHADOWCUBEMAPRENDER_ALPHATEST] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "cubeShadowVS_alphatest.cso", wiResourceManager::VERTEXSHADER))->vertexShader; vertexShaders[VSTYPE_SKY] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "skyVS.cso", wiResourceManager::VERTEXSHADER))->vertexShader; vertexShaders[VSTYPE_WATER] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "waterVS.cso", wiResourceManager::VERTEXSHADER))->vertexShader; vertexShaders[VSTYPE_VOXELIZER] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "objectVS_voxelizer.cso", wiResourceManager::VERTEXSHADER))->vertexShader; @@ -835,8 +851,9 @@ void wiRenderer::LoadShaders() pixelShaders[PSTYPE_LINE] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "linesPS.cso", wiResourceManager::PIXELSHADER)); pixelShaders[PSTYPE_SKY] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "skyPS.cso", wiResourceManager::PIXELSHADER)); pixelShaders[PSTYPE_SUN] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "sunPS.cso", wiResourceManager::PIXELSHADER)); - pixelShaders[PSTYPE_SHADOW] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "shadowPS.cso", wiResourceManager::PIXELSHADER)); + pixelShaders[PSTYPE_SHADOW_ALPHATEST] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "shadowPS_alphatest.cso", wiResourceManager::PIXELSHADER)); pixelShaders[PSTYPE_SHADOWCUBEMAPRENDER] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "cubeShadowPS.cso", wiResourceManager::PIXELSHADER)); + pixelShaders[PSTYPE_SHADOWCUBEMAPRENDER_ALPHATEST] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "cubeShadowPS_alphatest.cso", wiResourceManager::PIXELSHADER)); pixelShaders[PSTYPE_TRAIL] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "trailPS.cso", wiResourceManager::PIXELSHADER)); pixelShaders[PSTYPE_VOXELIZER] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "objectPS_voxelizer.cso", wiResourceManager::PIXELSHADER)); pixelShaders[PSTYPE_VOXEL] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "voxelPS.cso", wiResourceManager::PIXELSHADER)); @@ -2627,7 +2644,7 @@ void wiRenderer::DrawDebugEmitters(Camera* camera, GRAPHICSTHREAD threadID) GetDevice()->EventBegin("DebugEmitters", threadID); GetDevice()->BindPrimitiveTopology(TRIANGLELIST, threadID); - GetDevice()->BindVertexLayout(vertexLayouts[VLTYPE_OBJECT_DEBUG], threadID); + GetDevice()->BindVertexLayout(vertexLayouts[VLTYPE_OBJECT_POS], threadID); GetDevice()->BindRasterizerState(rasterizers[RSTYPE_WIRE_DOUBLESIDED_SMOOTH], threadID); GetDevice()->BindDepthStencilState(depthStencils[DSSTYPE_DEPTHREAD], STENCILREF_EMPTY, threadID); @@ -3207,7 +3224,6 @@ void wiRenderer::DrawForShadowMap(GRAPHICSTHREAD threadID) GetDevice()->UnBindResources(TEXSLOT_SHADOWARRAY_2D, 2, threadID); GetDevice()->BindPrimitiveTopology(TRIANGLELIST, threadID); - GetDevice()->BindVertexLayout(vertexLayouts[VLTYPE_OBJECT], threadID); GetDevice()->BindDepthStencilState(depthStencils[DSSTYPE_DEFAULT], STENCILREF_DEFAULT, threadID); @@ -3580,7 +3596,7 @@ PSTYPES GetPSTYPE(SHADERTYPE shaderType, const Material* const material) } break; case SHADERTYPE_SHADOW: - realPS = PSTYPE_SHADOW; + realPS = PSTYPE_SHADOW_ALPHATEST; break; case SHADERTYPE_SHADOWCUBE: realPS = PSTYPE_SHADOWCUBEMAPRENDER; @@ -3662,38 +3678,38 @@ void wiRenderer::RenderMeshes(const XMFLOAT3& eye, const CulledCollection& culle { GetDevice()->BindVS(vertexShaders[VSTYPE_VOXELIZER], threadID); GetDevice()->BindGS(geometryShaders[GSTYPE_VOXELIZER], threadID); - GetDevice()->BindVertexLayout(vertexLayouts[VLTYPE_OBJECT], threadID); + GetDevice()->BindVertexLayout(vertexLayouts[VLTYPE_OBJECT_ALL], threadID); } else { if (shaderType == SHADERTYPE_SHADOW) { - GetDevice()->BindVS(vertexShaders[VSTYPE_SHADOW], threadID); - GetDevice()->BindVertexLayout(vertexLayouts[VLTYPE_SHADOW], threadID); + GetDevice()->BindVS(vertexShaders[VSTYPE_SHADOW_ALPHATEST], threadID); + GetDevice()->BindVertexLayout(vertexLayouts[VLTYPE_SHADOW_POS_TEX], threadID); } else if (shaderType == SHADERTYPE_SHADOWCUBE) { - GetDevice()->BindVS(vertexShaders[VSTYPE_SHADOWCUBE], threadID); - GetDevice()->BindGS(geometryShaders[GSTYPE_SHADOWCUBEMAPRENDER], threadID); - GetDevice()->BindVertexLayout(vertexLayouts[VLTYPE_SHADOW], threadID); + GetDevice()->BindVS(vertexShaders[VSTYPE_SHADOWCUBEMAPRENDER_ALPHATEST], threadID); + GetDevice()->BindGS(geometryShaders[GSTYPE_SHADOWCUBEMAPRENDER_ALPHATEST], threadID); + GetDevice()->BindVertexLayout(vertexLayouts[VLTYPE_SHADOW_POS_TEX], threadID); } else if (shaderType == SHADERTYPE_ENVMAPCAPTURE) { GetDevice()->BindVS(vertexShaders[VSTYPE_ENVMAP], threadID); GetDevice()->BindGS(geometryShaders[GSTYPE_ENVMAP], threadID); - GetDevice()->BindVertexLayout(vertexLayouts[VLTYPE_OBJECT], threadID); + GetDevice()->BindVertexLayout(vertexLayouts[VLTYPE_OBJECT_ALL], threadID); } else if (shaderType == SHADERTYPE_ALPHATESTONLY || shaderType == SHADERTYPE_TEXTURE) { if (tessellatorRequested) { GetDevice()->BindVS(vertexShaders[VSTYPE_OBJECT_SIMPLE_TESSELLATION], threadID); - GetDevice()->BindVertexLayout(vertexLayouts[VLTYPE_OBJECT], threadID); // tessellator requires normals + GetDevice()->BindVertexLayout(vertexLayouts[VLTYPE_OBJECT_ALL], threadID); // tessellator requires normals } else { GetDevice()->BindVS(vertexShaders[VSTYPE_OBJECT_SIMPLE], threadID); - GetDevice()->BindVertexLayout(vertexLayouts[VLTYPE_OBJECT_SIMPLE], threadID); + GetDevice()->BindVertexLayout(vertexLayouts[VLTYPE_OBJECT_POS_TEX], threadID); } } else @@ -3706,7 +3722,7 @@ void wiRenderer::RenderMeshes(const XMFLOAT3& eye, const CulledCollection& culle { GetDevice()->BindVS(vertexShaders[VSTYPE_OBJECT_COMMON], threadID); } - GetDevice()->BindVertexLayout(vertexLayouts[VLTYPE_OBJECT], threadID); + GetDevice()->BindVertexLayout(vertexLayouts[VLTYPE_OBJECT_ALL], threadID); } } @@ -3838,7 +3854,7 @@ void wiRenderer::RenderMeshes(const XMFLOAT3& eye, const CulledCollection& culle GetDevice()->BindPS(pixelShaders[PSTYPE_OBJECT_TILEDFORWARD], threadID); break; case SHADERTYPE_SHADOW: - GetDevice()->BindPS(pixelShaders[PSTYPE_SHADOW], threadID); + GetDevice()->BindPS(pixelShaders[PSTYPE_SHADOW_ALPHATEST], threadID); break; case SHADERTYPE_SHADOWCUBE: GetDevice()->BindPS(pixelShaders[PSTYPE_SHADOWCUBEMAPRENDER], threadID); @@ -3934,42 +3950,15 @@ void wiRenderer::RenderMeshes(const XMFLOAT3& eye, const CulledCollection& culle mesh->UpdateRenderableInstancesPrev(k, threadID); } - if (!tessellatorRequested && (shaderType == SHADERTYPE_ALPHATESTONLY || shaderType == SHADERTYPE_TEXTURE || shaderType == SHADERTYPE_SHADOW || shaderType == SHADERTYPE_SHADOWCUBE)) + enum class BOUNDVERTEXBUFFERTYPE { - // simple vertex buffers are used in some passes (note: tessellator requires more attributes) - GPUBuffer* vbs[] = { - (mesh->streamoutBuffers[VPROP_POS].IsValid() ? &mesh->streamoutBuffers[VPROP_POS] : &mesh->vertexBuffers[VPROP_POS]), - &mesh->vertexBuffers[VPROP_TEX], - &mesh->instanceBuffer - }; - UINT strides[] = { - sizeof(XMFLOAT4), - sizeof(XMFLOAT4), - sizeof(Instance) - }; - GetDevice()->BindVertexBuffers(vbs, 0, ARRAYSIZE(vbs), strides, threadID); - } - else - { - // common vertex buffers: - GPUBuffer* vbs[] = { - (mesh->streamoutBuffers[VPROP_POS].IsValid() ? &mesh->streamoutBuffers[VPROP_POS] : &mesh->vertexBuffers[VPROP_POS]), - (mesh->streamoutBuffers[VPROP_NOR].IsValid() ? &mesh->streamoutBuffers[VPROP_NOR] : &mesh->vertexBuffers[VPROP_NOR]), - &mesh->vertexBuffers[VPROP_TEX], - (mesh->streamoutBuffers[VPROP_PRE].IsValid() ? &mesh->streamoutBuffers[VPROP_PRE] : &mesh->vertexBuffers[mesh->softBody ? VPROP_PRE : VPROP_POS]), // TODO: rewrite this shit - &mesh->instanceBuffer, - &mesh->instanceBufferPrev, - }; - UINT strides[] = { - sizeof(XMFLOAT4), - sizeof(XMFLOAT4), - sizeof(XMFLOAT4), - sizeof(XMFLOAT4), - sizeof(Instance), - sizeof(InstancePrev), - }; - GetDevice()->BindVertexBuffers(vbs, 0, ARRAYSIZE(vbs), strides, threadID); - } + NOTHING, + POSITION, + POSITION_TEXCOORD, + EVERYTHING, + }; + BOUNDVERTEXBUFFERTYPE boundVBType_Prev = BOUNDVERTEXBUFFERTYPE::NOTHING; + BOUNDVERTEXBUFFERTYPE boundVBType = BOUNDVERTEXBUFFERTYPE::NOTHING; for (MeshSubset& subset : mesh->subsets) { @@ -3977,9 +3966,88 @@ void wiRenderer::RenderMeshes(const XMFLOAT3& eye, const CulledCollection& culle { continue; } - Material* material = subset.material; + if (!tessellatorRequested && (shaderType == SHADERTYPE_ALPHATESTONLY || shaderType == SHADERTYPE_TEXTURE || shaderType == SHADERTYPE_SHADOW || shaderType == SHADERTYPE_SHADOWCUBE)) + { + // simple vertex buffers are used in some passes (note: tessellator requires more attributes) + if ((shaderType == SHADERTYPE_ALPHATESTONLY || shaderType == SHADERTYPE_SHADOW || shaderType == SHADERTYPE_SHADOWCUBE) && material->alphaRef > 1.0f - 1.0f / 256.0f) + { + // bypass texcoord stream for non alphatested shadows and zprepass + boundVBType = BOUNDVERTEXBUFFERTYPE::POSITION; + } + else + { + boundVBType = BOUNDVERTEXBUFFERTYPE::POSITION_TEXCOORD; + } + } + else + { + boundVBType = BOUNDVERTEXBUFFERTYPE::EVERYTHING; + } + + // Only bind vertex buffers when the layout changes + if (boundVBType == BOUNDVERTEXBUFFERTYPE::NOTHING || boundVBType != boundVBType_Prev) + { + // Assemble the required vertex buffer: + switch (boundVBType) + { + case BOUNDVERTEXBUFFERTYPE::POSITION: + //{ + // GPUBuffer* vbs[] = { + // (mesh->streamoutBuffers[VPROP_POS].IsValid() ? &mesh->streamoutBuffers[VPROP_POS] : &mesh->vertexBuffers[VPROP_POS]), + // &mesh->instanceBuffer + // }; + // UINT strides[] = { + // sizeof(XMFLOAT4), + // sizeof(Instance) + // }; + // GetDevice()->BindVertexBuffers(vbs, 0, ARRAYSIZE(vbs), strides, threadID); + //} + //break; + case BOUNDVERTEXBUFFERTYPE::POSITION_TEXCOORD: + { + GPUBuffer* vbs[] = { + (mesh->streamoutBuffers[VPROP_POS].IsValid() ? &mesh->streamoutBuffers[VPROP_POS] : &mesh->vertexBuffers[VPROP_POS]), + &mesh->vertexBuffers[VPROP_TEX], + &mesh->instanceBuffer + }; + UINT strides[] = { + sizeof(XMFLOAT4), + sizeof(XMFLOAT4), + sizeof(Instance) + }; + GetDevice()->BindVertexBuffers(vbs, 0, ARRAYSIZE(vbs), strides, threadID); + } + break; + case BOUNDVERTEXBUFFERTYPE::EVERYTHING: + { + GPUBuffer* vbs[] = { + (mesh->streamoutBuffers[VPROP_POS].IsValid() ? &mesh->streamoutBuffers[VPROP_POS] : &mesh->vertexBuffers[VPROP_POS]), + (mesh->streamoutBuffers[VPROP_NOR].IsValid() ? &mesh->streamoutBuffers[VPROP_NOR] : &mesh->vertexBuffers[VPROP_NOR]), + &mesh->vertexBuffers[VPROP_TEX], + (mesh->streamoutBuffers[VPROP_PRE].IsValid() ? &mesh->streamoutBuffers[VPROP_PRE] : &mesh->vertexBuffers[mesh->softBody ? VPROP_PRE : VPROP_POS]), // TODO: rewrite this shit + &mesh->instanceBuffer, + &mesh->instanceBufferPrev, + }; + UINT strides[] = { + sizeof(XMFLOAT4), + sizeof(XMFLOAT4), + sizeof(XMFLOAT4), + sizeof(XMFLOAT4), + sizeof(Instance), + sizeof(InstancePrev), + }; + GetDevice()->BindVertexBuffers(vbs, 0, ARRAYSIZE(vbs), strides, threadID); + } + break; + default: + assert(0); + break; + } + } + boundVBType_Prev = boundVBType; + bool subsetRenderable = false; @@ -5650,7 +5718,7 @@ void wiRenderer::CreateImpostor(Mesh* mesh) GetDevice()->BindRasterizerState(rasterizers[RSTYPE_DOUBLESIDED], threadID); GetDevice()->BindDepthStencilState(depthStencils[DSSTYPE_DEFAULT], mesh->stencilRef, threadID); GetDevice()->BindPrimitiveTopology(TRIANGLELIST, threadID); - GetDevice()->BindVertexLayout(vertexLayouts[VLTYPE_OBJECT], threadID); + GetDevice()->BindVertexLayout(vertexLayouts[VLTYPE_OBJECT_ALL], threadID); GetDevice()->BindVS(vertexShaders[VSTYPE_OBJECT_COMMON], threadID); GetDevice()->BindPS(pixelShaders[PSTYPE_CAPTUREIMPOSTOR], threadID); diff --git a/WickedEngine/wiVersion.cpp b/WickedEngine/wiVersion.cpp index 53c5f34f1..7aba3210c 100644 --- a/WickedEngine/wiVersion.cpp +++ b/WickedEngine/wiVersion.cpp @@ -9,7 +9,7 @@ namespace wiVersion // minor features, major updates const int minor = 11; // minor bug fixes, alterations, refactors, updates - const int revision = 51; + const int revision = 53; long GetVersion() diff --git a/WickedEngine/windHF.hlsli b/WickedEngine/windHF.hlsli index 2d89d996b..f42933363 100644 --- a/WickedEngine/windHF.hlsli +++ b/WickedEngine/windHF.hlsli @@ -3,8 +3,8 @@ #include "globals.hlsli" -inline void affectWind(inout float3 pos, in float value, in uint randVertex, float time) { - float3 wind = sin(time + (pos.x + pos.y + pos.z))*g_xFrame_WindDirection.xyz*0.1*value; +inline void affectWind(inout float3 pos, in float weight, float time) { + float3 wind = sin(time + (pos.x + pos.y + pos.z))*g_xFrame_WindDirection.xyz*0.1*weight; pos += wind; }