anchor.diff:  
               return V4d(v.c.XYZ * diffuse, v.c.W)
           }
  +           
  +    type InstanceVertex = { 
  +        [<Position>] pos : V4d 
  +        [<Semantic("ZZZInstanceTrafo")>] trafo : M44d
  +    }
  +
  +    let instanceTrafo (v : InstanceVertex) =
  +        vertex {
  +            return { v with pos = v.trafo * v.pos }
  +        }
                
   module Shadows = 
   
  
positive.code:     let pointSg = 
          let rand = Random()
          let randomV3f() = V3f(rand.NextDouble(), rand.NextDouble(), rand.NextDouble())
          let randomColor() = C4b(rand.NextDouble(), rand.NextDouble(), rand.NextDouble(), 1.0)
  
          Sg.draw IndexedGeometryMode.PointList
              |> Sg.vertexAttribute DefaultSemantic.Positions (Array.init pointCount (fun _ -> randomV3f()) |> Mod.constant)
              |> Sg.vertexAttribute DefaultSemantic.Colors (Array.init pointCount (fun _ -> randomColor()) |> Mod.constant)
              |> Sg.vertexAttribute DefaultSemantic.Normals (Array.init pointCount (fun _ -> V3f.OOI) |> Mod.constant)
              |> Sg.uniform "PointSize" pointSize
  
      let sceneSg (fragmentShader : list<FShadeEffect>) =
          quadSg C4b.Green 
          |> Sg.effect ( (Shader.trafo |> toEffect) :: fragmentShader )
          |> Sg.andAlso ( pointSg 
                          |> Sg.effect ([ DefaultSurfaces.trafo |> toEffect; 
                                          DefaultSurfaces.pointSprite |> toEffect
                                          DefaultSurfaces.pointSpriteFragment |> toEffect ] @ fragmentShader)
                        )
          |> Sg.uniform "LightViewMatrix" (lightSpaceViewProjTrafo)
          |> Sg.trafo ( Trafo3d.Translation(V3d(0.0,0.0,0.3)) |> Mod.constant )
  
negative.code: 
      let win = openWindow()
  
      let shadowMapSize = Mod.init (V2i(4096, 4096))
  
      let shadowCam = CameraView.lookAt (V3d.III * 2.5) V3d.Zero V3d.OOI
      let shadowProj = Frustum.perspective 60.0 0.1 10.0 1.0
  