"shadowing"
by guillermo_matterport
HTML
<script src="https://cdn.jsdelivr.net/npm/[email protected]/build/three.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/examples/js/controls/OrbitControls.js"></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/examples/js/loaders/GLTFLoader.js"></script>
<script src="https://cdn.rawgit.com/mrdoob/three.js/r112/examples/js/loaders/ColladaLoader.js"></script>
<script src="https://cdn.rawgit.com/mrdoob/three.js/r112/examples/js/loaders/OBJLoader.js"></script>
CSS
body {
margin: 0;
}
canvas {
display: block;
}
JavaScript
// 389 350
function vertexShader() {
return `
uniform mat4 cameraProjection;
uniform mat4 viewMatrixCamera;
varying vec4 vWorldPosition;
varying vec4 vTexCoords;
void main() {
vWorldPosition = modelMatrix * vec4(position, 1.0);
vTexCoords = cameraProjection * viewMatrixCamera * vWorldPosition;
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
}
`;
};
function fragmentShader() {
return `
#include <common>
#include <packing>
uniform vec3 projPosition;
uniform vec3 projDirection;
uniform sampler2D depthTexture;
uniform float cameraNear;
uniform float cameraFar;
varying vec4 vWorldPosition;
varying vec4 vTexCoords;
varying vec2 vUv;
void main() {
vec4 outColor = vec4(0.0, 0.0, 0.0, 1.0);
vec3 pointToCamera = vWorldPosition.xyz - projPosition;
float distanceToCamera = -precisionSafeLength(pointToCamera); // world space distance, ~ -6.5
if (vTexCoords.z < 0.0) {
discard;
}
vec2 uv = vTexCoords.xy / vTexCoords.w * 0.5 + 0.5 ;
if (uv.x < 0.0 || uv.x > 1.0) {
discard;
}
if (uv.y < 0.0 || uv.y > 1.0) {
discard;
}
float fragCoordZ = texture2D(depthTexture, uv).x;
float distanceToFrag = perspectiveDepthToViewZ( fragCoordZ, cameraNear, cameraFar ); // ~-5
float orthoDepth = viewZToOrthographicDepth( distanceToFrag, cameraNear, cameraFar );
float diff = distanceToFrag - distanceToCamera;
// the distance relative to the near plane should suffice (right?) but it's actually worse
float dv = dot(pointToCamera, projDirection);
float diff2 = distanceToFrag - dv;
if (diff < 0.01) {
outColor = vec4(0, 1.0, 0 , 1.0);
}
else...