forked from Mirrorlandia_minetest/minetest
Correct normal bias for entities
Remove use of magic constants. Apply cameraOffset Calculate distance projected on SM plane
This commit is contained in:
parent
25c1974e0d
commit
4801bdf45a
@ -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;
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user