anchor.diff:                      OpenGL.Hl.DrawSurfaces
                           (&eyePosition, renderer.RenderModelsFields, models.Length, viewArray, projectionArray,
                            material.AlbedoTexture, material.MetalnessTexture, material.RoughnessTexture, material.NormalTexture, material.AmbientOcclusionTexture,
  -                         [||], [||],
  +                         lightPositions, lightColors,
                            renderer.RenderModelRow0Buffer, renderer.RenderModelRow1Buffer, renderer.RenderModelRow2Buffer, renderer.RenderModelRow3Buffer,
                            renderer.RenderPhysicallyBasedShader, material.Geometry)
   
  
positive.code:             let projectionArray = projection.ToArray ()
              OpenGL.Hl.Assert ()
  
              // categorize messages
              let prePasses = hashSetPlus<RenderPassDescriptor3d> HashIdentity.Structural []
              let postPasses = hashSetPlus<RenderPassDescriptor3d> HashIdentity.Structural []
              let surfaces = dictPlus<RenderMaterial, Matrix4x4 SegmentedList> HashIdentity.Structural []
              for message in renderer.RenderMessages do
                  match message with
                  | RenderSurfaceDescriptor (surface, model) ->
                      match surfaces.TryGetValue surface with
  
negative.code:             | WfglWindow window -> window.WfglSwapWindow ()
  
          member renderer.CleanUp () =
              let renderAssetPackages = renderer.RenderPackages |> Seq.map (fun entry -> entry.Value)
              let renderAssets = renderAssetPackages |> Seq.collect (Seq.map (fun entry -> entry.Value))
              for renderAsset in renderAssets do GlRenderer3d.freeRenderAsset renderAsset renderer
              renderer.RenderPackages.Clear ()