Затенение Гуро в JavaFX
Каждая грань имеет 3 цвета (по одному на каждую вершину). Я хочу использовать штриховку Гуро, чтобы смешать эти цвета. До сих пор я черпал вдохновение из библиотеки FXyz .
В моем текущем подходе используется
- Рассчитайте цвет для каждой вершины в сетке.
- Извлеките список всех уникальных цветов
- Составьте палитру уникальных цветов
val palette = object : ColorPalette {
override fun getNumColors() = colors.size
override fun getColor(i: Int) = colors.getOrNull(i)?: Color.BLACK
}
- Создайте карту, указав в качестве ключа значение точки (x,y,z) и указав в качестве значения индекс цвета.
- Создайте функцию плотности, которая возвращает индекс цвета из вышеупомянутой карты.
{ 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)
}