diff --git a/WickedEngine/shaders/captureImpostorPS.hlsl b/WickedEngine/shaders/captureImpostorPS.hlsl index 7df221e90..ba2abb723 100644 --- a/WickedEngine/shaders/captureImpostorPS.hlsl +++ b/WickedEngine/shaders/captureImpostorPS.hlsl @@ -10,11 +10,13 @@ struct ImpostorOutput ImpostorOutput main(PixelInput input) { + float4 uvsets = input.GetUVSets(); + float4 color; [branch] if (GetMaterial().textures[BASECOLORMAP].IsValid()) { - color = GetMaterial().textures[BASECOLORMAP].Sample(sampler_linear_wrap, input.uvsets); + color = GetMaterial().textures[BASECOLORMAP].Sample(sampler_linear_wrap, uvsets); } else { @@ -26,7 +28,7 @@ ImpostorOutput main(PixelInput input) float3 N = normalize(input.nor); float3 P = input.pos3D; - float3x3 TBN = compute_tangent_frame(N, P, input.uvsets.xy); + float3x3 TBN = compute_tangent_frame(N, P, uvsets.xy); [branch] if (GetMaterial().textures[NORMALMAP].IsValid()) @@ -34,7 +36,7 @@ ImpostorOutput main(PixelInput input) [branch] if (GetMaterial().normalMapStrength > 0 && GetMaterial().textures[NORMALMAP].IsValid()) { - float3 normalMap = float3(GetMaterial().textures[NORMALMAP].Sample(sampler_objectshader, input.uvsets).rg, 1); + float3 normalMap = float3(GetMaterial().textures[NORMALMAP].Sample(sampler_objectshader, uvsets).rg, 1); float3 bumpColor = normalMap.rgb * 2 - 1; N = normalize(lerp(N, mul(bumpColor, TBN), GetMaterial().normalMapStrength)); } @@ -44,7 +46,7 @@ ImpostorOutput main(PixelInput input) [branch] if (GetMaterial().textures[SURFACEMAP].IsValid()) { - surfaceMap = GetMaterial().textures[SURFACEMAP].Sample(sampler_linear_wrap, input.uvsets); + surfaceMap = GetMaterial().textures[SURFACEMAP].Sample(sampler_linear_wrap, uvsets); } float4 surface; diff --git a/WickedEngine/shaders/emittedparticleHF.hlsli b/WickedEngine/shaders/emittedparticleHF.hlsli index 29c48e55f..d5a4bab22 100644 --- a/WickedEngine/shaders/emittedparticleHF.hlsli +++ b/WickedEngine/shaders/emittedparticleHF.hlsli @@ -19,11 +19,11 @@ ShaderMaterial EmitterGetMaterial() struct VertextoPixel { float4 pos : SV_POSITION; - float4 tex : TEXCOORD0; + min16float4 tex : TEXCOORD0; float3 P : WORLDPOSITION; - float2 unrotated_uv : UNROTATED_UV; - nointerpolation float frameBlend : FRAMEBLEND; - nointerpolation float size : PARTICLESIZE; + min16float2 unrotated_uv : UNROTATED_UV; + nointerpolation min16float frameBlend : FRAMEBLEND; + nointerpolation min16float size : PARTICLESIZE; nointerpolation uint color : PARTICLECOLOR; }; diff --git a/WickedEngine/shaders/emittedparticleVS.hlsl b/WickedEngine/shaders/emittedparticleVS.hlsl index 6c3a46ebe..08d833109 100644 --- a/WickedEngine/shaders/emittedparticleVS.hlsl +++ b/WickedEngine/shaders/emittedparticleVS.hlsl @@ -43,10 +43,10 @@ VertextoPixel main(uint vid : SV_VertexID, uint instanceID : SV_InstanceID) VertextoPixel Out; Out.P = position; Out.pos = mul(GetCamera().view_projection, float4(position, 1)); - Out.tex = uvsets; - Out.size = size; + Out.tex = min16float4(uvsets); + Out.size = min16float(size); Out.color = pack_rgba(color); - Out.unrotated_uv = BILLBOARD[vertexID % 4].xy * float2(1, -1) * 0.5f + 0.5f; - Out.frameBlend = frameBlend; + Out.unrotated_uv = min16float2(BILLBOARD[vertexID % 4].xy * float2(1, -1) * 0.5f + 0.5f); + Out.frameBlend = min16float(frameBlend); return Out; } diff --git a/WickedEngine/shaders/hairparticleHF.hlsli b/WickedEngine/shaders/hairparticleHF.hlsli index 197dc0a96..cdcf12ce3 100644 --- a/WickedEngine/shaders/hairparticleHF.hlsli +++ b/WickedEngine/shaders/hairparticleHF.hlsli @@ -19,11 +19,11 @@ ShaderMaterial HairGetMaterial() struct VertexToPixel { float4 pos : SV_POSITION; - float2 tex : TEXCOORD; + min16float2 tex : TEXCOORD; nointerpolation float fade : DITHERFADE; uint primitiveID : PRIMITIVEID; float3 pos3D : POSITION3D; - float3 nor : NORMAL; + min16float3 nor : NORMAL; }; #endif // WI_HAIRPARTICLE_HF diff --git a/WickedEngine/shaders/hairparticleVS.hlsl b/WickedEngine/shaders/hairparticleVS.hlsl index 591671eb3..52bf73312 100644 --- a/WickedEngine/shaders/hairparticleVS.hlsl +++ b/WickedEngine/shaders/hairparticleVS.hlsl @@ -24,8 +24,8 @@ VertexToPixel main(uint vid : SV_VERTEXID) Out.pos3D = Out.pos.xyz; Out.pos = mul(GetCamera().view_projection, Out.pos); - Out.nor = normalize(normal); - Out.tex = uvsets.xy; + Out.nor = min16float3(normal); + Out.tex = min16float2(uvsets.xy); return Out; } diff --git a/WickedEngine/shaders/objectGS_voxelizer.hlsl b/WickedEngine/shaders/objectGS_voxelizer.hlsl index 09a01b7c5..ba9538502 100644 --- a/WickedEngine/shaders/objectGS_voxelizer.hlsl +++ b/WickedEngine/shaders/objectGS_voxelizer.hlsl @@ -4,18 +4,18 @@ struct GSInput { float4 pos : SV_POSITION; - float4 color : COLOR; - float4 uvsets : UVSETS; - float3 nor : NORMAL; + min16float4 color : COLOR; + min16float4 uvsets : UVSETS; + min16float3 nor : NORMAL; }; // Note: centroid interpolation is used to avoid floating voxels in some cases struct GSOutput { float4 pos : SV_POSITION; - centroid float4 color : COLOR; - centroid float4 uvsets : UVSETS; - centroid float3 N : NORMAL; + centroid min16float4 color : COLOR; + centroid min16float4 uvsets : UVSETS; + centroid min16float3 N : NORMAL; centroid float3 P : POSITION3D; #ifdef VOXELIZATION_CONSERVATIVE_RASTERIZATION_ENABLED diff --git a/WickedEngine/shaders/objectHF.hlsli b/WickedEngine/shaders/objectHF.hlsli index ebe23001e..97ce17eda 100644 --- a/WickedEngine/shaders/objectHF.hlsli +++ b/WickedEngine/shaders/objectHF.hlsli @@ -290,6 +290,15 @@ struct PixelInput return min16float((instanceIndex_dither >> 24u) / 255.0); } #endif // OBJECTSHADER_USE_DITHERING + +#ifdef OBJECTSHADER_USE_UVSETS + inline float4 GetUVSets() + { + float4 ret = uvsets; + ret.xy = mad(ret.xy, GetMaterial().texMulAdd.xy, GetMaterial().texMulAdd.zw); + return ret; + } +#endif // OBJECTSHADER_USE_UVSETS }; @@ -406,8 +415,7 @@ float4 main(PixelInput input, in bool is_frontface : SV_IsFrontFace) : SV_Target const float2 ScreenCoord = pixel * GetCamera().internal_resolution_rcp; #ifdef OBJECTSHADER_USE_UVSETS - float4 uvsets = input.uvsets; - uvsets.xy = mad(uvsets.xy, GetMaterial().texMulAdd.xy, GetMaterial().texMulAdd.zw); + float4 uvsets = input.GetUVSets(); #endif // OBJECTSHADER_USE_UVSETS #ifndef DISABLE_ALPHATEST diff --git a/WickedEngine/shaders/objectPS_hologram.hlsl b/WickedEngine/shaders/objectPS_hologram.hlsl index e9a4bc25a..317734b55 100644 --- a/WickedEngine/shaders/objectPS_hologram.hlsl +++ b/WickedEngine/shaders/objectPS_hologram.hlsl @@ -4,11 +4,13 @@ [earlydepthstencil] float4 main(PixelInput input) : SV_TARGET { + float4 uvsets = input.GetUVSets(); + float4 color; [branch] if (GetMaterial().textures[BASECOLORMAP].IsValid() && (GetFrame().options & OPTION_BIT_DISABLE_ALBEDO_MAPS) == 0) { - color = GetMaterial().textures[BASECOLORMAP].Sample(sampler_objectshader, input.uvsets); + color = GetMaterial().textures[BASECOLORMAP].Sample(sampler_objectshader, uvsets); color.rgb = max(color.r, max(color.g, color.b)); } else @@ -21,7 +23,7 @@ float4 main(PixelInput input) : SV_TARGET [branch] if (any(emissiveColor) && GetMaterial().textures[EMISSIVEMAP].IsValid()) { - float4 emissiveMap = GetMaterial().textures[EMISSIVEMAP].Sample(sampler_objectshader, input.uvsets); + float4 emissiveMap = GetMaterial().textures[EMISSIVEMAP].Sample(sampler_objectshader, uvsets); emissiveColor *= emissiveMap.rgb * emissiveMap.a; } color.rgb += emissiveColor; diff --git a/WickedEngine/shaders/objectPS_paintradius.hlsl b/WickedEngine/shaders/objectPS_paintradius.hlsl index 00a0aa5c5..1fc56d864 100644 --- a/WickedEngine/shaders/objectPS_paintradius.hlsl +++ b/WickedEngine/shaders/objectPS_paintradius.hlsl @@ -6,7 +6,8 @@ [earlydepthstencil] float4 main(PixelInput input) : SV_TARGET { - const float2 pixel = (xPaintRadUVSET == 0 ? input.uvsets.xy : input.uvsets.zw) * xPaintRadResolution; + float4 uvsets = input.GetUVSets(); + const float2 pixel = (xPaintRadUVSET == 0 ? uvsets.xy : uvsets.zw) * xPaintRadResolution; const float2x2 rot = float2x2( cos(xPaintRadBrushRotation), -sin(xPaintRadBrushRotation), diff --git a/WickedEngine/shaders/objectPS_voxelizer.hlsl b/WickedEngine/shaders/objectPS_voxelizer.hlsl index 0d48f0407..c0c120f42 100644 --- a/WickedEngine/shaders/objectPS_voxelizer.hlsl +++ b/WickedEngine/shaders/objectPS_voxelizer.hlsl @@ -43,19 +43,27 @@ void VoxelAtomicAverage(inout RWTexture3D output, in uint3 dest, in float4 struct PSInput { float4 pos : SV_POSITION; - centroid float4 color : COLOR; - float4 uvsets : UVSETS; - centroid float3 N : NORMAL; + centroid min16float4 color : COLOR; + centroid min16float4 uvsets : UVSETS; + centroid min16float3 N : NORMAL; centroid float3 P : POSITION3D; #ifdef VOXELIZATION_CONSERVATIVE_RASTERIZATION_ENABLED nointerpolation float3 aabb_min : AABB_MIN; nointerpolation float3 aabb_max : AABB_MAX; #endif // VOXELIZATION_CONSERVATIVE_RASTERIZATION_ENABLED + + inline float4 GetUVSets() + { + float4 ret = uvsets; + ret.xy = mad(ret.xy, GetMaterial().texMulAdd.xy, GetMaterial().texMulAdd.zw); + return ret; + } }; void main(PSInput input) { + float4 uvsets = input.GetUVSets(); float3 P = input.P; VoxelClipMap clipmap = GetFrame().vxgi.clipmaps[g_xVoxelizer.clipmap_index]; @@ -87,14 +95,14 @@ void main(PSInput input) // mip level in which alpha is completely gone (helps with trees) lod_bias = -10; } - baseColor *= GetMaterial().textures[BASECOLORMAP].SampleBias(sampler_linear_wrap, input.uvsets, lod_bias); + baseColor *= GetMaterial().textures[BASECOLORMAP].SampleBias(sampler_linear_wrap, uvsets, lod_bias); } float3 emissiveColor = GetMaterial().GetEmissive(); [branch] if (any(emissiveColor) && GetMaterial().textures[EMISSIVEMAP].IsValid()) { - float4 emissiveMap = GetMaterial().textures[EMISSIVEMAP].Sample(sampler_linear_wrap, input.uvsets); + float4 emissiveMap = GetMaterial().textures[EMISSIVEMAP].Sample(sampler_linear_wrap, uvsets); emissiveColor *= emissiveMap.rgb * emissiveMap.a; } diff --git a/WickedEngine/shaders/objectVS_voxelizer.hlsl b/WickedEngine/shaders/objectVS_voxelizer.hlsl index 1c549cf9a..e365f0975 100644 --- a/WickedEngine/shaders/objectVS_voxelizer.hlsl +++ b/WickedEngine/shaders/objectVS_voxelizer.hlsl @@ -5,9 +5,9 @@ struct VSOut { float4 pos : SV_POSITION; - float4 color : COLOR; - float4 uvsets : UVSETS; - float3 N : NORMAL; + min16float4 color : COLOR; + min16float4 uvsets : UVSETS; + min16float3 N : NORMAL; #ifndef VOXELIZATION_GEOMETRY_SHADER_ENABLED float3 P : POSITION3D; #endif // VOXELIZATION_GEOMETRY_SHADER_ENABLED diff --git a/WickedEngine/shaders/shadowPS_alphatest.hlsl b/WickedEngine/shaders/shadowPS_alphatest.hlsl index 439d4412d..f1b6e16c9 100644 --- a/WickedEngine/shaders/shadowPS_alphatest.hlsl +++ b/WickedEngine/shaders/shadowPS_alphatest.hlsl @@ -6,6 +6,6 @@ void main(PixelInput input) [branch] if (GetMaterial().textures[BASECOLORMAP].IsValid()) { - clip(GetMaterial().textures[BASECOLORMAP].Sample(sampler_point_wrap, input.uvsets).a - GetMaterial().alphaTest); + clip(GetMaterial().textures[BASECOLORMAP].Sample(sampler_point_wrap, input.GetUVSets()).a - GetMaterial().alphaTest); } } diff --git a/WickedEngine/shaders/shadowPS_transparent.hlsl b/WickedEngine/shaders/shadowPS_transparent.hlsl index 22f7c68c3..4c859f569 100644 --- a/WickedEngine/shaders/shadowPS_transparent.hlsl +++ b/WickedEngine/shaders/shadowPS_transparent.hlsl @@ -5,11 +5,12 @@ [earlydepthstencil] float4 main(PixelInput input) : SV_TARGET { + float4 uvsets = input.GetUVSets(); float4 color; [branch] if (GetMaterial().textures[BASECOLORMAP].IsValid()) { - color = GetMaterial().textures[BASECOLORMAP].Sample(sampler_objectshader, input.uvsets); + color = GetMaterial().textures[BASECOLORMAP].Sample(sampler_objectshader, uvsets); } else { @@ -28,7 +29,7 @@ float4 main(PixelInput input) : SV_TARGET [branch] if (GetMaterial().textures[TRANSMISSIONMAP].IsValid()) { - float transmissionMap = GetMaterial().textures[TRANSMISSIONMAP].Sample(sampler_objectshader, input.uvsets).r; + float transmissionMap = GetMaterial().textures[TRANSMISSIONMAP].Sample(sampler_objectshader, uvsets).r; transmission *= transmissionMap; } opacity *= 1 - transmission; diff --git a/WickedEngine/shaders/shadowPS_water.hlsl b/WickedEngine/shaders/shadowPS_water.hlsl index 2b7a83955..618283a3d 100644 --- a/WickedEngine/shaders/shadowPS_water.hlsl +++ b/WickedEngine/shaders/shadowPS_water.hlsl @@ -5,13 +5,14 @@ [earlydepthstencil] float4 main(PixelInput input) : SV_TARGET { + float4 uvsets = input.GetUVSets(); float2 pixel = input.pos.xy; float4 color; [branch] if (GetMaterial().textures[BASECOLORMAP].IsValid()) { - color = GetMaterial().textures[BASECOLORMAP].Sample(sampler_objectshader, input.uvsets); + color = GetMaterial().textures[BASECOLORMAP].Sample(sampler_objectshader, uvsets); } else { @@ -23,7 +24,7 @@ float4 main(PixelInput input) : SV_TARGET color.rgb = 1; // disable water shadow because it has already fog - color.rgb += caustic_pattern(input.uvsets.xy * 20, GetFrame().time); + color.rgb += caustic_pattern(uvsets.xy * 20, GetFrame().time); color.a = input.pos.z; // secondary depth diff --git a/WickedEngine/wiVersion.cpp b/WickedEngine/wiVersion.cpp index 93e6d611b..3be164508 100644 --- a/WickedEngine/wiVersion.cpp +++ b/WickedEngine/wiVersion.cpp @@ -9,7 +9,7 @@ namespace wi::version // minor features, major updates, breaking compatibility changes const int minor = 71; // minor bug fixes, alterations, refactors, updates - const int revision = 300; + const int revision = 301; const std::string version_string = std::to_string(major) + "." + std::to_string(minor) + "." + std::to_string(revision);