diff --git a/WickedEngine/globals.hlsli b/WickedEngine/globals.hlsli index 3429934dd..7b94a12c3 100644 --- a/WickedEngine/globals.hlsli +++ b/WickedEngine/globals.hlsli @@ -19,7 +19,7 @@ TEXTURE2D(texture_transmittancelut, float4, TEXSLOT_TRANSMITTANCELUT); TEXTURE2D(texture_multiscatteringlut, float4, TEXSLOT_MULTISCATTERINGLUT); TEXTURE2DARRAY(texture_shadowarray_2d, float, TEXSLOT_SHADOWARRAY_2D); TEXTURECUBEARRAY(texture_shadowarray_cube, float, TEXSLOT_SHADOWARRAY_CUBE); -TEXTURE2DARRAY(texture_shadowarray_transparent, float4, TEXSLOT_SHADOWARRAY_TRANSPARENT); +TEXTURE2DARRAY(texture_shadowarray_transparent, float3, TEXSLOT_SHADOWARRAY_TRANSPARENT); TEXTURE3D(texture_voxelradiance, float4, TEXSLOT_VOXELRADIANCE); STRUCTUREDBUFFER(EntityTiles, uint, SBSLOT_ENTITYTILES); STRUCTUREDBUFFER(EntityArray, ShaderEntity, SBSLOT_ENTITYARRAY); diff --git a/WickedEngine/lightingHF.hlsli b/WickedEngine/lightingHF.hlsli index 0a65e3f2b..ff68bba17 100644 --- a/WickedEngine/lightingHF.hlsli +++ b/WickedEngine/lightingHF.hlsli @@ -61,7 +61,7 @@ inline float3 shadowCascade(in ShaderEntity light, in float3 shadowPos, in float [loop] for (float x = -range; x <= range; x += 1.0f) { - shadow.x += texture_shadowarray_2d.SampleCmpLevelZero(sampler_cmp_depth, float3(shadowUV + float2(x, y) * light.shadowKernel, light.GetShadowMapIndex() + cascade), realDistance).r; + shadow.x += texture_shadowarray_2d.SampleCmpLevelZero(sampler_cmp_depth, float3(shadowUV + float2(x, y) * light.shadowKernel, light.GetShadowMapIndex() + cascade), realDistance); shadow.y++; } } @@ -73,15 +73,7 @@ inline float3 shadowCascade(in ShaderEntity light, in float3 shadowPos, in float #ifndef DISABLE_TRANSPARENT_SHADOWMAP if (g_xFrame_Options & OPTION_BIT_TRANSPARENTSHADOWS_ENABLED) { - // unfortunately transparents will not receive transparent shadow map - // because we cannot distinguish without using secondary depth buffer for transparents - // but I don't wanna do that, not overly important for now - float4 transparent_shadowmap = texture_shadowarray_transparent.SampleLevel(sampler_linear_clamp, float3(shadowUV, light.GetShadowMapIndex() + cascade), 0).rgba; - // Tint the shadow: - shadow *= transparent_shadowmap.rgb; - // Reduce shadow by caustics (caustics can also increase total light above maximum): - const float causticsStrength = 20; - shadow += transparent_shadowmap.a * causticsStrength; + shadow *= texture_shadowarray_transparent.SampleLevel(sampler_linear_clamp, float3(shadowUV, light.GetShadowMapIndex() + cascade), 0); } #endif //DISABLE_TRANSPARENT_SHADOWMAP @@ -876,4 +868,4 @@ inline float4 EnvironmentReflection_Local(in Surface surface, in ShaderEntity pr return float4(envmapColor, edgeBlend); } -#endif // WI_LIGHTING_HF \ No newline at end of file +#endif // WI_LIGHTING_HF diff --git a/WickedEngine/shadowPS_transparent.hlsl b/WickedEngine/shadowPS_transparent.hlsl index 33d3b9c4a..b2e31a940 100644 --- a/WickedEngine/shadowPS_transparent.hlsl +++ b/WickedEngine/shadowPS_transparent.hlsl @@ -32,22 +32,7 @@ float4 main(VertextoPixel input) : SV_TARGET float opacity = color.a; - color.rgb *= 1 - opacity; - - // Use the alpha channel for refraction caustics effect: - [branch] - if (g_xMaterial.uvset_normalMap >= 0) - { - float3 bumpColor; - - const float2 UV_normalMap = g_xMaterial.uvset_normalMap == 0 ? input.uvsets.xy : input.uvsets.zw; - bumpColor = float3(2.0f * texture_normalmap.Sample(sampler_objectshader, UV_normalMap - g_xMaterial.texMulAdd.ww).rg - 1.0f, 1); - bumpColor.rg *= g_xMaterial.refractionIndex; - bumpColor.rg *= g_xMaterial.normalMapStrength; - bumpColor = normalize(max(bumpColor, float3(0, 0, 0.0001f))); - - color.a = 1 - saturate(dot(bumpColor, float3(0, 0, 1))); - } + color.rgb *= 1 - opacity; // if fully opaque, then black (not let through any light) return color; } diff --git a/WickedEngine/shadowPS_water.hlsl b/WickedEngine/shadowPS_water.hlsl index 4a8bcd5b8..d3c3deae4 100644 --- a/WickedEngine/shadowPS_water.hlsl +++ b/WickedEngine/shadowPS_water.hlsl @@ -32,12 +32,8 @@ float4 main(VertextoPixel input) : SV_TARGET float opacity = color.a; - // Water does not generate shadows to not mess up the smooth falloff on geometry intersections: - // This could be resolved if this shader could sample depth, but the depthbuffer is currently bound - // so leave it at this for the moment - color.rgb = 1; + color.rgb = 1; // disable water shadow because it has already fog - // Use the alpha channel for refraction caustics effect: [branch] if (g_xMaterial.uvset_normalMap >= 0) { @@ -53,7 +49,12 @@ float4 main(VertextoPixel input) : SV_TARGET bumpColor.rg *= g_xMaterial.normalMapStrength; bumpColor = normalize(max(bumpColor, float3(0, 0, 0.0001f))); - color.a = 1 - saturate(abs(dot(bumpColor, float3(0, 0, 1)))); + float caustic = abs(dot(bumpColor, float3(0, 1, 0))); + caustic = saturate(caustic); + caustic = pow(caustic, 2); + caustic *= 20; + + color.rgb += caustic; } return color; diff --git a/WickedEngine/wiEnums.h b/WickedEngine/wiEnums.h index 87126f719..9d633de85 100644 --- a/WickedEngine/wiEnums.h +++ b/WickedEngine/wiEnums.h @@ -421,6 +421,5 @@ enum BSTYPES BSTYPE_ENVIRONMENTALLIGHT, BSTYPE_DECAL, BSTYPE_MULTIPLY, - BSTYPE_TRANSPARENTSHADOWMAP, BSTYPE_COUNT }; diff --git a/WickedEngine/wiRenderer.cpp b/WickedEngine/wiRenderer.cpp index d6440ea29..67c4ddf45 100644 --- a/WickedEngine/wiRenderer.cpp +++ b/WickedEngine/wiRenderer.cpp @@ -28,10 +28,9 @@ #include "wiPlatform.h" #include -#include +#include #include #include -#include using namespace std; using namespace wiGraphics; @@ -721,7 +720,7 @@ SHADERTYPE GetPSTYPE(RENDERPASS renderPass, bool alphatest, bool transparent, Ma case RENDERPASS_SHADOW: if (transparent) { - realPS = PSTYPE_SHADOW_TRANSPARENT; + realPS = shaderType == MaterialComponent::SHADERTYPE_WATER ? PSTYPE_SHADOW_WATER : PSTYPE_SHADOW_TRANSPARENT; } else { @@ -1251,7 +1250,7 @@ void LoadShaders() case RENDERPASS_DEPTHONLY: case RENDERPASS_SHADOW: case RENDERPASS_SHADOWCUBE: - desc.bs = &blendStates[transparency ? BSTYPE_TRANSPARENTSHADOWMAP : BSTYPE_COLORWRITEDISABLE]; + desc.bs = &blendStates[transparency ? BSTYPE_TRANSPARENT : BSTYPE_COLORWRITEDISABLE]; break; default: break; @@ -2362,19 +2361,6 @@ void SetUpStates() bd.AlphaToCoverageEnable = false; bd.IndependentBlendEnable = false; device->CreateBlendState(&bd, &blendStates[BSTYPE_MULTIPLY]); - - - bd.RenderTarget[0].SrcBlend = BLEND_DEST_COLOR; - bd.RenderTarget[0].DestBlend = BLEND_ZERO; - bd.RenderTarget[0].BlendOp = BLEND_OP_ADD; - bd.RenderTarget[0].SrcBlendAlpha = BLEND_ONE; - bd.RenderTarget[0].DestBlendAlpha = BLEND_ONE; - bd.RenderTarget[0].BlendOpAlpha = BLEND_OP_ADD; - bd.RenderTarget[0].BlendEnable = true; - bd.RenderTarget[0].RenderTargetWriteMask = COLOR_WRITE_ENABLE_ALL; - bd.AlphaToCoverageEnable = false; - bd.IndependentBlendEnable = false; - device->CreateBlendState(&bd, &blendStates[BSTYPE_TRANSPARENTSHADOWMAP]); } void ModifySampler(const SamplerDesc& desc, int slot) @@ -3029,6 +3015,7 @@ void RenderMeshes( { const GPUResource* res[] = { material.GetBaseColorMap(), + material.GetNormalMap(), //reminder: transparent shadow might need it! }; device->BindResources(PS, res, TEXSLOT_RENDERER_BASECOLORMAP, arraysize(res), cmd); } @@ -4773,9 +4760,8 @@ void SetShadowProps2D(int resolution, int count, int softShadowQuality) device->CreateTexture(&desc, nullptr, &shadowMapArray_2D); desc.BindFlags = BIND_RENDER_TARGET | BIND_SHADER_RESOURCE; - desc.Format = FORMAT_R8G8B8A8_UNORM; + desc.Format = FORMAT_R11G11B10_FLOAT; desc.layout = IMAGE_LAYOUT_SHADER_RESOURCE; - // RGB: Shadow tint (multiplicative), A: Refraction caustics(additive) desc.clear.color[0] = 1; desc.clear.color[1] = 1; desc.clear.color[2] = 1; diff --git a/WickedEngine/wiVersion.cpp b/WickedEngine/wiVersion.cpp index 77cce7a23..578341dcd 100644 --- a/WickedEngine/wiVersion.cpp +++ b/WickedEngine/wiVersion.cpp @@ -9,7 +9,7 @@ namespace wiVersion // minor features, major updates, breaking API changes const int minor = 50; // minor bug fixes, alterations, refactors, updates - const int revision = 4; + const int revision = 5; const std::string version_string = std::to_string(major) + "." + std::to_string(minor) + "." + std::to_string(revision);