"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...