Correct normal bias for entities

Remove use of magic constants.
Apply cameraOffset
Calculate distance projected on SM plane
This commit is contained in:
Dmitry Kostenko 2022-02-20 00:04:48 +01:00 committed by x2048
parent 25c1974e0d
commit 4801bdf45a
4 changed files with 14 additions and 15 deletions

View File

@ -3,6 +3,7 @@ uniform vec3 dayLight;
uniform vec3 eyePosition; uniform vec3 eyePosition;
uniform float animationTimer; uniform float animationTimer;
uniform vec4 emissiveColor; uniform vec4 emissiveColor;
uniform vec3 cameraOffset;
varying vec3 vNormal; varying vec3 vNormal;
@ -110,10 +111,13 @@ void main(void)
// Calculate normal offset scale based on the texel size adjusted for // Calculate normal offset scale based on the texel size adjusted for
// curvature of the SM texture. This code must be change together with // curvature of the SM texture. This code must be change together with
// getPerspectiveFactor or any light-space transformation. // getPerspectiveFactor or any light-space transformation.
float distanceToPlayer = length((eyePosition - worldPosition).xyz) / f_shadowfar; vec3 eyeToVertex = worldPosition - eyePosition + cameraOffset;
// Distance from the vertex to the player
float distanceToPlayer = length(eyeToVertex - v_LightDirection * dot(eyeToVertex, v_LightDirection)) / f_shadowfar;
// perspective factor estimation according to the
float perspectiveFactor = distanceToPlayer * bias0 + bias1; float perspectiveFactor = distanceToPlayer * bias0 + bias1;
float texelSize = 1.0 / f_textureresolution; float texelSize = f_shadowfar * perspectiveFactor * perspectiveFactor /
texelSize *= f_shadowfar * perspectiveFactor / (bias1 / perspectiveFactor - texelSize * bias0) * 0.15; (f_textureresolution * bias1 - perspectiveFactor * bias0);
float slopeScale = clamp(pow(1.0 - cosLight*cosLight, 0.5), 0.0, 1.0); float slopeScale = clamp(pow(1.0 - cosLight*cosLight, 0.5), 0.0, 1.0);
normalOffsetScale = texelSize * slopeScale; normalOffsetScale = texelSize * slopeScale;

View File

@ -58,15 +58,13 @@ void DirectionalLight::createSplitMatrices(const Camera *cam)
const v3f &viewUp = cam->getCameraNode()->getUpVector(); const v3f &viewUp = cam->getCameraNode()->getUpVector();
v3f viewRight = look.crossProduct(viewUp); v3f viewRight = look.crossProduct(viewUp);
v3f farCorner = look + viewRight * tanFovX + viewUp * tanFovY; v3f farCorner = (look + viewRight * tanFovX + viewUp * tanFovY).normalize();
// Compute the frustumBoundingSphere radius // Compute the frustumBoundingSphere radius
v3f boundVec = (camPos + farCorner * sfFar) - newCenter; v3f boundVec = (camPos + farCorner * sfFar) - newCenter;
radius = boundVec.getLength() * 2.0f; radius = boundVec.getLength();
// boundVec.getLength(); // boundVec.getLength();
float vvolume = radius * 2.0f; float vvolume = radius;
v3f frustumCenter = newCenter; v3f frustumCenter = newCenter;
// probar radius multipliacdor en funcion del I, a menor I mas multiplicador
v3f eye_displacement = direction * vvolume; v3f eye_displacement = direction * vvolume;
// we must compute the viewmat with the position - the camera offset // we must compute the viewmat with the position - the camera offset

View File

@ -22,6 +22,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "irrlichttypes_bloated.h" #include "irrlichttypes_bloated.h"
#include <matrix4.h> #include <matrix4.h>
#include "util/basic_macros.h" #include "util/basic_macros.h"
#include "constants.h"
class Camera; class Camera;
class Client; class Client;
@ -67,7 +68,7 @@ public:
/// Gets the light's far value. /// Gets the light's far value.
f32 getMaxFarValue() const f32 getMaxFarValue() const
{ {
return farPlane; return farPlane * BS;
} }

View File

@ -118,12 +118,8 @@ size_t ShadowRenderer::getDirectionalLightCount() const
f32 ShadowRenderer::getMaxShadowFar() const f32 ShadowRenderer::getMaxShadowFar() const
{ {
if (!m_light_list.empty()) { if (!m_light_list.empty()) {
float wanted_range = m_client->getEnv().getClientMap().getWantedRange(); float zMax = m_light_list[0].getMaxFarValue();
return zMax;
float zMax = m_light_list[0].getMaxFarValue() > wanted_range
? wanted_range
: m_light_list[0].getMaxFarValue();
return zMax * MAP_BLOCKSIZE;
} }
return 0.0f; return 0.0f;
} }