Затенение Гуро в JavaFX

Каждая грань имеет 3 цвета (по одному на каждую вершину). Я хочу использовать штриховку Гуро, чтобы смешать эти цвета. До сих пор я черпал вдохновение из библиотеки FXyz .

В моем текущем подходе используется из библиотеки FXyz. Но здесь используются карты плотности, которые в моем случае не работают, потому что цвета не вычисляются по математической формуле. Моя первоначальная идея заключалась в следующем:

  1. Рассчитайте цвет для каждой вершины в сетке.
  2. Извлеките список всех уникальных цветов
  3. Составьте палитру уникальных цветов
              val palette = object : ColorPalette {
            override fun getNumColors() = colors.size
            override fun getColor(i: Int) = colors.getOrNull(i)?: Color.BLACK
        }
  1. Создайте карту, указав в качестве ключа значение точки (x,y,z) и указав в качестве значения индекс цвета.
  2. Создайте функцию плотности, которая возвращает индекс цвета из вышеупомянутой карты.
              { point3F ->
            val key = Triple(point3F.x.toInt(), point3F.y.toInt(), point3F.z.toInt())
            pointColorIndexMap[key]!!
        }

Мне кажется, что мой единственный вариант - создать одно большое изображение, в которое я вставлю все затененные треугольники, а затем буду ссылаться на них. Но я не уверен, какая техника здесь будет лучше всего. Любая помощь приветствуется!

Редактировать:

Это код, который я использую сейчас (он написан на Kotlin):

      override fun updateMesh() {
    val definition = model.modelDefinition

    val (colors1, colors2, colors3) = definition.calculateFaceColors()
    val uniqueColorHSBValues = (colors1 + colors2 + colors3).toSet().toList()
    val uniqueColors = uniqueColorHSBValues.map { ModelUtil.hsbToColor(it, null) }

    val palette = object : ColorPalette {
        override fun getNumColors() = uniqueColors.size
        override fun getColor(i: Int) = uniqueColors.getOrNull(i)?: Color.BLACK
    }

    val pointColorIndexMap = HashMap<Triple<Int, Int, Int>, Int>()
    for (face in 0 until definition.getFaceCount()) {
        val type = definition.getFaceTypes()?.get(face)?.toInt()?.let { it and 3}?:0
        val (p1, p2, p3) = definition.getPoints(face)
        if (type == RENDER_SHADED_TRIANGLE) {
            pointColorIndexMap[p1] = uniqueColorHSBValues.indexOf(colors1[face])
            pointColorIndexMap[p2] = uniqueColorHSBValues.indexOf(colors2[face])
            pointColorIndexMap[p3] = uniqueColorHSBValues.indexOf(colors3[face])
        } else if (type == RENDER_FLAT_TRIANGLE) {
            pointColorIndexMap[p1] = uniqueColorHSBValues.indexOf(colors1[face])
            pointColorIndexMap[p2] = uniqueColorHSBValues.indexOf(colors1[face])
            pointColorIndexMap[p3] = uniqueColorHSBValues.indexOf(colors1[face])
        }
    }

    setTextureModeVertices3D(palette) { point3F ->
        val key = Triple(point3F.x.toInt(), point3F.y.toInt(), point3F.z.toInt())
        pointColorIndexMap[key]!!
    }

    val meshHelper = MeshHelper(atlas)
    updateMesh(meshHelper)
}
  • Так выглядит моя текущая реализация затенения.
  • Так выглядит моя текущая реализация без затенения.
  • Вот как я хочу, чтобы моя реализация затенения выглядела примерно так
  • Так выглядит моя палитра (9х10 пикселей) (

0 ответов

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