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;