问题描述
每个面都有 3 种颜色(每个顶点一种)。我想使用 gouraud 着色来混合这些颜色。到目前为止,我已经从 FXyz library 中获得了一些灵感。
我目前的方法使用 FXyz 库中的 setTextureModeVertices3D
。但这使用了密度图,这在我的情况下不起作用,因为颜色不是来自数学公式。我最初的想法是按如下方式实现它:
- 计算网格中每个顶点的颜色。
- 提取所有独特颜色的列表
- 制作独特颜色的调色板
val palette = object : ColorPalette {
override fun getNumColors() = colors.size
override fun getColor(i: Int) = colors.getorNull(i)?: Color.BLACK
}
{ 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.z.toInt())
pointColorIndexMap[key]!!
}
val meshHelper = MeshHelper(atlas)
updateMesh(meshHelper)
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)