Skip to content

Commit 39141d0

Browse files
committed
quantize light dir for shadowmaps to reduce shimmering of slowly rotating lights
1 parent 533c152 commit 39141d0

File tree

1 file changed

+18
-8
lines changed

1 file changed

+18
-8
lines changed

sources/libengine/graphics/renderPipeline.cpp

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -293,17 +293,17 @@ namespace cage
293293
prevTransformComponent = camera->prevTransformComponent;
294294
}
295295

296-
Mat4 modelTransform(Entity *e) const
296+
Transform modelTransform(Entity *e) const
297297
{
298298
CAGE_ASSERT(e->has(transformComponent));
299299
if (e->has(prevTransformComponent))
300300
{
301301
const Transform c = e->value<TransformComponent>(transformComponent);
302302
const Transform p = e->value<TransformComponent>(prevTransformComponent);
303-
return Mat4(interpolate(p, c, interpolationFactor));
303+
return interpolate(p, c, interpolationFactor);
304304
}
305305
else
306-
return Mat4(e->value<TransformComponent>(transformComponent));
306+
return e->value<TransformComponent>(transformComponent);
307307
}
308308

309309
UniMesh makeMeshUni(const RenderData &rd) const
@@ -950,7 +950,7 @@ namespace cage
950950
CAGE_ASSERT(ri.mesh->bones == 0);
951951
RenderData rd;
952952
rd.e = e;
953-
rd.model = modelTransform(e);
953+
rd.model = Mat4(modelTransform(e));
954954
rd.color = initializeColor(e->getOrDefault<ColorComponent>());
955955
const uint64 startTime = rd.e->getOrDefault<SpawnTimeComponent>().spawnTime;
956956
rd.animation = Vec4((double)(sint64)(currentTime - startTime) / (double)1'000'000, 1, 0, 0);
@@ -981,7 +981,7 @@ namespace cage
981981
return;
982982
RenderData rd;
983983
rd.e = e;
984-
rd.model = modelTransform(e) * Mat4(Vec3(rt.layout.size * Vec2(-0.5, 0.5), 0));
984+
rd.model = Mat4(modelTransform(e)) * Mat4(Vec3(rt.layout.size * Vec2(-0.5, 0.5), 0));
985985
rd.color = initializeColor(e->getOrDefault<ColorComponent>());
986986
rd.renderLayer = tc.renderLayer;
987987
rd.translucent = true;
@@ -1012,7 +1012,7 @@ namespace cage
10121012
return;
10131013
RenderData rd;
10141014
rd.e = e;
1015-
rd.model = modelTransform(e);
1015+
rd.model = Mat4(modelTransform(e));
10161016
if (Holder<RenderObject> obj = assets->get<AssetSchemeIndexRenderObject, RenderObject>(rc.model))
10171017
{
10181018
prepareObject(rd, std::move(obj));
@@ -1091,7 +1091,7 @@ namespace cage
10911091
return;
10921092
if (e->has<ShadowmapComponent>())
10931093
return;
1094-
UniLight uni = initializeLightUni(modelTransform(e), lc, e->getOrDefault<ColorComponent>(), transform.position);
1094+
UniLight uni = initializeLightUni(Mat4(modelTransform(e)), lc, e->getOrDefault<ColorComponent>(), transform.position);
10951095
if (lc.lightType == LightTypeEnum::Point && !intersects(Sphere(Vec3(uni.position), lc.maxDistance), frustum))
10961096
return;
10971097
lights.push_back(uni);
@@ -1455,7 +1455,17 @@ namespace cage
14551455
shadowmap.lightComponent = lc;
14561456
shadowmap.shadowmapComponent = sc;
14571457
data->resolution = Vec2i(sc.resolution);
1458-
data->model = modelTransform(e);
1458+
1459+
{ // quantize light direction - reduces shimmering of slowly rotating lights
1460+
Transform src = modelTransform(e);
1461+
Vec3 f = src.orientation * Vec3(0, 0, -1);
1462+
f *= 300;
1463+
for (uint32 i = 0; i < 3; i++)
1464+
f[i] = round(f[i]);
1465+
f = normalize(f);
1466+
src.orientation = Quat(f, src.orientation * Vec3(0, 1, 0));
1467+
data->model = Mat4(src);
1468+
}
14591469

14601470
{
14611471
UniShadowedLight &uni = shadowmap.shadowUni;

0 commit comments

Comments
 (0)