Матрица направленного света / проекция матрицы

У меня возникают трудности с реализацией карт теней для направленного света. Я не знаю, как правильно настроить матрицы... Я хочу, чтобы тени появлялись в верхнем левом углу (как солнце). Все, что у меня есть, это следующий код для генерации углов фрустума в мировом пространстве:

private def frustumBox(viewMatrix: Matrix4f, projectionMatrix: Matrix4f): BoundingBox = {
  val corners = new Array[Vector4f](8)
  corners(0) = new Vector4f(-1, -1, -1, 1)
  corners(1) = new Vector4f(-1,  1, -1, 1)
  corners(2) = new Vector4f( 1,  1, -1, 1)
  corners(3) = new Vector4f( 1, -1, -1, 1)
  corners(4) = new Vector4f(-1, -1,  1, 1)
  corners(5) = new Vector4f(-1,  1,  1, 1)
  corners(6) = new Vector4f( 1,  1,  1, 1)
  corners(7) = new Vector4f( 1, -1,  1, 1)

  val inverseVpMatrix = Matrix4f.mul(projectionMatrix, viewMatrix, null)
  inverseVpMatrix.invert

  for (corner <- corners) {
     Matrix4f.transform(inverseVpMatrix, corner, corner)
     val w = 1.0f / corner.w
     corner.x *= w
     corner.y *= w
     corner.z *= w
  }

  val min = new Vector3f(Float.MaxValue, Float.MaxValue, Float.MaxValue)
  val max = new Vector3f(Float.MinValue, Float.MinValue, Float.MinValue)

  for (corner <- corners) {
     if (corner.x < min.x)
        min.x = corner.x
     if (corner.y < min.y)
        min.y = corner.y
     if (corner.z < min.z)
        min.z = corner.z

     if (corner.x > max.x)
        max.x = corner.x
     if (corner.y > max.y)
        max.y = corner.y
     if (corner.z > max.z)
        max.z = corner.z
  }

  new BoundingBox(Vector3(min.x, min.y, min.z), Vector3(max.x, max.y, max.z))
}

Как настроить матрицу вида для солнца?

0 ответов

Другие вопросы по тегам