SceneKit 中地形的 Splatmap

Posted

技术标签:

【中文标题】SceneKit 中地形的 Splatmap【英文标题】:Splatmap for terrain in SceneKit 【发布时间】:2015-03-09 04:35:05 【问题描述】:

我正在为一个简单的 SceneKit 游戏制作地形,并尝试将不同的材质应用到同一个网格以实现 splat 贴图效果。地形是程序生成的,因此我无法在 Collada 中对其进行建模并使用应用的纹理加载它。

在其他游戏引擎中,将材质/纹理应用于地形的常用方法似乎是使用 splat 贴图。 SceneKit 似乎没有那种构造或简单的地形处理方法。

我尝试的是为不同的纹理/颜色程序生成透明度贴图,然后将这些材料添加到几何体中,例如...

    var alphaMaps = [NSBitmapImageRep]()
    for x in 0..<4
        alphaMaps.append(createBitmapImage()!)
    

    var x = 0
    var y = 0

    let waterLevel = 0
    let snowLevel = 241
    let mountainLevel = 200

    for tile in self.map.sortedTiles
        let height = Int(tile.height)
        println("Height\(height)")
        var onLevel = -1
        if height < waterLevel
            onLevel = 0
        
        ...
        for i in 0..<4
            var color = NSColor(deviceRed: 0, green: 0, blue: 0, alpha: i == onLevel ? 0 : 1)
            alphaMaps[i].setColor(color, atX: x, y: y)
        
        ... generate the geometry
     
    var materials = [SCNMaterial]()
    for h in 0..<4
        let mat = SCNMaterial()
        switch( h)
        case 0:
            mat.diffuse.contents = NSColor.blueColor()
        case 1:
            mat.diffuse.contents = NSColor.greenColor()
        case 2:
            mat.diffuse.contents = NSColor.brownColor()
        case 3:
            mat.diffuse.contents = NSColor.whiteColor()
        default:
            println("FAIL")
        

        mat.transparent.contents = alphaMaps[h].CGImage
        materials.append(mat)
    

    geometry.materials = materials

我已经验证了 alpha 贴图是正确的,但它们似乎没有得到尊重。只使用了第一种材质,没有使用透明图像。

这是一个 alpha 贴图的示例,非黑色部分是透明的:

有没有办法在 SceneKit 中制作 splat 贴图?或有关如何解决正在发生的事情的指示?我需要深入研究自定义着色器吗?

【问题讨论】:

您可能需要查看自定义着色器,或者更可能只是着色器修改器。分配一个全新的材质会很困难,但更改一个或两个材质属性(例如漫反射、镜面反射或法线)应该相当容易。 但是,我不确定您到底想在不同材料之间进行多少更改,或者您尝试在同一元素上使用多少种不同的配置。 【参考方案1】:

我发现问题是纹理坐标不正确。然后必须将几何图形复制到多个节点并将单独的材料应用于每个节点。我对它的工作方式不满意,因为它迫使我将加载的顶点增加四倍。我将研究另一种方法。

【讨论】:

以上是关于SceneKit 中地形的 Splatmap的主要内容,如果未能解决你的问题,请参考以下文章

将scenekit和spritekit组合在一个屏幕中

如何在 SceneKit 中显示金属和透明纹理?

在 SceneKit 中播放视频的最佳方式是啥?

在 SceneKit 中加速渲染

Scenekit 在 obj 文件中转换场景

如何创建要在 SceneKit 中使用的 DAE 文件?