微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

JavaFX 中的 Gouraud 着色

如何解决JavaFX 中的 Gouraud 着色

每个面都有 3 种颜色(每个顶点一种)。我想使用 gouraud 着色来混合这些颜色。到目前为止,我已经从 FXyz library 中获得了一些灵感。

我目前的方法使用 FXyz 库中的 setTextureModeVertices3D。但这使用了密度图,这在我的情况下不起作用,因为颜色不是来自数学公式。我最初的想法是按如下方式实现它:

  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.z.toInt())
        pointColorIndexMap[key]!!
    }

    val meshHelper = MeshHelper(atlas)
    updateMesh(meshHelper)
}
  • 这就是我当前的着色实现的样子。

    How my implementation currently is with shading

  • 这就是我目前的实现没有阴影的样子。

    How my implementation currently is without shading

  • 这就是我希望我的阴影实现大致看起来像

    How I want my implementation with shading to look like roughly

  • 这就是我的调色板的样子(9x10 像素)(

    enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。