diff --git a/WickedEngine/WickedEngine.vcxproj b/WickedEngine/WickedEngine.vcxproj index 0bef988d2..8f5fde7c1 100644 --- a/WickedEngine/WickedEngine.vcxproj +++ b/WickedEngine/WickedEngine.vcxproj @@ -1126,6 +1126,20 @@ + + Pixel + Pixel + Pixel + Pixel + 4.1 + 4.1 + 4.1 + 4.1 + shaders/%(Filename).cso + shaders/%(Filename).cso + shaders/%(Filename).cso + shaders/%(Filename).cso + 4.1 4.1 diff --git a/WickedEngine/WickedEngine.vcxproj.filters b/WickedEngine/WickedEngine.vcxproj.filters index 876c81b46..1706e1de5 100644 --- a/WickedEngine/WickedEngine.vcxproj.filters +++ b/WickedEngine/WickedEngine.vcxproj.filters @@ -2148,6 +2148,9 @@ shaders\image + + shaders\lighting + diff --git a/WickedEngine/dirLightHF.hlsli b/WickedEngine/dirLightHF.hlsli index a357484e2..ba39fc133 100644 --- a/WickedEngine/dirLightHF.hlsli +++ b/WickedEngine/dirLightHF.hlsli @@ -1,3 +1,6 @@ +#ifndef _DIRLIGHT_HF_ +#define _DIRLIGHT_HF_ + #include "toonHF.hlsli" // dir light constant buffer is global @@ -22,10 +25,11 @@ inline float shadowCascade(float4 shadowPos, float2 ShTex, Texture2D shad float scale = g_xDirLight_mBiasResSoftshadow.y; float retVal = 1; - [branch]if(g_xDirLight_mBiasResSoftshadow.z){ +#ifdef DIRECTIONALLIGHT_SOFT + //[branch]if(g_xDirLight_mBiasResSoftshadow.z) + { float samples = 0.0f; - float range = 0.5f; - if(g_xDirLight_mBiasResSoftshadow.z==2.0f) range = 1.5f; + static const float range = 1.5f; for (float y = -range; y <= range; y += 1.0f) for (float x = -range; x <= range; x += 1.0f) { @@ -35,7 +39,10 @@ inline float shadowCascade(float4 shadowPos, float2 ShTex, Texture2D shad retVal *= sum / samples; } - else retVal *= offset_lookup(shadowTexture, sampler_cmp_depth, ShTex, float2(0, 0), scale, realDistance); + //else +#else + retVal *= offset_lookup(shadowTexture, sampler_cmp_depth, ShTex, float2(0, 0), scale, realDistance); +#endif return retVal; } @@ -75,4 +82,14 @@ inline float dirLight(in float3 pos3D, in float3 normal, inout float4 color, in difLight *= shadows[0]; } return difLight; -} \ No newline at end of file +} + + +// MACROS + +#define DEFERRED_DIRLIGHT_MAIN \ + float lighting = dirLight(pos3D,normal,color,toonshaded); \ + color.rgb *= lighting; \ + applySpecular(color, color*lighting, normal, eyevector, g_xDirLight_direction.xyz, 1, specular_power, specular, toonshaded); + +#endif // _DIRLIGHT_HF_ \ No newline at end of file diff --git a/WickedEngine/dirLightPS.hlsl b/WickedEngine/dirLightPS.hlsl index 52703c2c5..f296a8a6b 100644 --- a/WickedEngine/dirLightPS.hlsl +++ b/WickedEngine/dirLightPS.hlsl @@ -5,43 +5,9 @@ float4 main( VertexToPixel PSIn ) : SV_TARGET { - float4 color = float4(g_xDirLight_col.rgb,1); - float2 screenPos = float2(1,-1) * PSIn.pos2D.xy / PSIn.pos2D.w / 2.0f + 0.5f; - float depth = depthMap.SampleLevel(sampler_point_clamp,screenPos,0); - //clip(depth<1?1:-1); + DEFERREDLIGHT_MAKEPARAMS(g_xDirLight_col) - //[branch]if(depth materialMap:register(t2); static const float specularMaximumIntensity = 1; + + +// MACROS + +// C : (float4) light color +#define DEFERREDLIGHT_MAKEPARAMS(C) \ + float4 color = float4(C.rgb,1); \ + float2 screenPos = float2(1, -1) * PSIn.pos2D.xy / PSIn.pos2D.w / 2.0f + 0.5f; \ + float depth = depthMap.SampleLevel(sampler_point_clamp, screenPos, 0); \ + float4 norU = normalMap.SampleLevel(sampler_point_clamp,screenPos,0); \ + bool unshaded = isUnshaded(norU.w); \ + float4 material = materialMap.SampleLevel(sampler_point_clamp,screenPos,0); \ + float specular = material.w*specularMaximumIntensity; \ + uint specular_power = material.z; \ + float3 normal = norU.xyz; \ + bool toonshaded = isToon(norU.w); \ + float3 pos3D = getPosition(screenPos, depth); \ + float3 eyevector = normalize(g_xCamera_CamPos - pos3D.xyz); + +#define DEFERREDLIGHT_RETURN \ + return max(unshaded? 1 : color, 0.0f); + + + #endif // _LIGHTHF_ diff --git a/WickedEngine/pointLightHF.hlsli b/WickedEngine/pointLightHF.hlsli index 8f87761d0..07a34576e 100644 --- a/WickedEngine/pointLightHF.hlsli +++ b/WickedEngine/pointLightHF.hlsli @@ -1,5 +1,5 @@ -#ifndef _POINTLIGHTHF_ -#define _POINTLIGHTHF_ +#ifndef _POINTLIGHT_HF_ +#define _POINTLIGHT_HF_ #include "globals.hlsli" TextureCube xTextureSh:register(t7); @@ -30,4 +30,4 @@ inline float pointLight(in float3 pos3D, in float3 normal, out float3 lightDir, return saturate(attenuation*lightint); } -#endif // _POINTLIGHTHF_ +#endif // _POINTLIGHT_HF_ diff --git a/WickedEngine/pointLightPS.hlsl b/WickedEngine/pointLightPS.hlsl index 45ff56aa7..3dc9cbbbf 100644 --- a/WickedEngine/pointLightPS.hlsl +++ b/WickedEngine/pointLightPS.hlsl @@ -3,50 +3,15 @@ float4 main(VertexToPixel PSIn) : SV_TARGET -{ - float4 light = float4(lightColor.rgb,1); - float2 screenPos = float2(1,-1) * PSIn.pos2D.xy / PSIn.pos2D.w / 2.0f + 0.5f; - float depth = depthMap.SampleLevel(sampler_point_clamp,screenPos,0); +{ + DEFERREDLIGHT_MAKEPARAMS(lightColor) - [branch]if(depth xTextureSh:register(t4); @@ -62,4 +65,6 @@ inline float spotLight(in float3 pos3D, in float3 normal, out float attenuation, return l; -} \ No newline at end of file +} + +#endif // _SPOTLIGHT_HF_ diff --git a/WickedEngine/spotLightPS.hlsl b/WickedEngine/spotLightPS.hlsl index 894400644..617301e59 100644 --- a/WickedEngine/spotLightPS.hlsl +++ b/WickedEngine/spotLightPS.hlsl @@ -4,51 +4,14 @@ float4 main(VertexToPixel PSIn) : SV_TARGET { - float4 light = float4(lightColor.rgb,1); - float2 screenPos = float2(1,-1) * PSIn.pos2D.xy / PSIn.pos2D.w / 2.0f + 0.5f; - float depth = depthMap.SampleLevel(sampler_point_clamp,screenPos,0); - //clip(depth<1?1:-1); + DEFERREDLIGHT_MAKEPARAMS(lightColor) - + float attenuation; + float3 lightToPixel; + float lightInt = spotLight(pos3D, normal, attenuation, lightToPixel, toonshaded); + color *= lightInt; + applySpecular(color, color * lightInt, normal, eyevector, lightToPixel, 1, specular_power, specular, toonshaded); + color *= attenuation; - - [branch]if(depthshadow = true; lights.back()->shadowMaps_dirLight.resize(3); lights.back()->shadowBias = 9.99995464e-005f; - for (int i = 0; i < 3; ++i) - { - lights.back()->shadowMaps_dirLight[i].Initialize( - wiRenderer::SHADOWMAPRES, wiRenderer::SHADOWMAPRES - , 0, true - ); - } + //for (int i = 0; i < 3; ++i) + //{ + // lights.back()->shadowMaps_dirLight[i].Initialize( + // wiRenderer::SHADOWMAPRES, wiRenderer::SHADOWMAPRES + // , 0, true + // ); + //} } break; case 'S': diff --git a/WickedEngine/wiRenderer.cpp b/WickedEngine/wiRenderer.cpp index 201ad2469..077b966a9 100644 --- a/WickedEngine/wiRenderer.cpp +++ b/WickedEngine/wiRenderer.cpp @@ -825,6 +825,7 @@ void wiRenderer::LoadBasicShaders() pixelShaders[PSTYPE_BLACKOUT] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "effectPS_blackout.cso", wiResourceManager::PIXELSHADER)); pixelShaders[PSTYPE_TEXTUREONLY] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "effectPS_textureonly.cso", wiResourceManager::PIXELSHADER)); pixelShaders[PSTYPE_DIRLIGHT] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "dirLightPS.cso", wiResourceManager::PIXELSHADER)); + pixelShaders[PSTYPE_DIRLIGHT_SOFT] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "dirLightSoftPS.cso", wiResourceManager::PIXELSHADER)); pixelShaders[PSTYPE_POINTLIGHT] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "pointLightPS.cso", wiResourceManager::PIXELSHADER)); pixelShaders[PSTYPE_SPOTLIGHT] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "spotLightPS.cso", wiResourceManager::PIXELSHADER)); pixelShaders[PSTYPE_VOLUMELIGHT] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "volumeLightPS.cso", wiResourceManager::PIXELSHADER)); @@ -1891,7 +1892,28 @@ void wiRenderer::DrawLights(Camera* camera, DeviceContext context BindVS(vertexShaders[VSTYPE_DIRLIGHT + type],context); - BindPS(pixelShaders[PSTYPE_DIRLIGHT + type],context); + + switch (type) + { + case 0: + if (SOFTSHADOW) + { + BindPS(pixelShaders[PSTYPE_DIRLIGHT_SOFT], context); + } + else + { + BindPS(pixelShaders[PSTYPE_DIRLIGHT], context); + } + break; + case 1: + BindPS(pixelShaders[PSTYPE_POINTLIGHT], context); + break; + case 2: + BindPS(pixelShaders[PSTYPE_SPOTLIGHT], context); + break; + default: + break; + } for(Cullable* c : culledObjects){ @@ -2146,7 +2168,7 @@ void wiRenderer::DrawForShadowMap(DeviceContext context) if (l->shadow) { l->shadowMap_index = -1; - l->lastSquaredDistMulThousand = (long)(wiMath::DistanceEstimated(l->translation, cam->translation) * 1000); + l->lastSquaredDistMulThousand = (long)(wiMath::DistanceSquared(l->translation, cam->translation) * 1000); switch (l->type) { case Light::SPOT: @@ -2172,6 +2194,13 @@ void wiRenderer::DrawForShadowMap(DeviceContext context) CulledList culledObjects; CulledCollection culledRenderer; + auto texDesc = l->shadowMaps_dirLight[index].GetDesc(); + if (texDesc.Height != SHADOWMAPRES) + { + // Create the shadow map + l->shadowMaps_dirLight[index].Initialize(SHADOWMAPRES, SHADOWMAPRES, 0, true); + } + l->shadowMaps_dirLight[index].Activate(context); const float siz = l->shadowCam[index].size * 0.5f;