材质上的SceneKit纹理映射问题

时间:2018-11-02 16:51:49

标签: scenekit metal texture-mapping material-swift

我正在尝试使用SceneKit绘制一组简单的4个盒子的图,这些盒子彼此相邻并在每个盒子上应用纹理(Minecraft风格):

enter image description here

纹理是这样的(png文件):

enter image description here

我想避免盒子之间的小蓝线(它们不在纹理中),但是无论我尝试哪种设置,这些假象都会保留。

有什么办法避免它们吗?

在Scenekit编辑器中的材质设置下面(每个框完全相同,除了漫反射部分引用了正确的纹理文件)

enter image description here

enter image description here

scenekit编辑器中的问题也出现在设备上运行的应用程序中。

奇怪的是,如果我只做全黑(或任何颜色)纹理(内部有或没有任何东西),这些伪影就不会出现,例如:

enter image description here

2 个答案:

答案 0 :(得分:1)

为了避免这种“环绕”行为,您似乎需要以编程方式设置每个材料属性的环绕模式。配置已为其分配纹理的每个材质属性,以使其wrapSwrapT属性为.clamp,而不是.repeat,该属性似乎是加载时的默认属性.scn文件中的材料。

let nodes = scene.rootNode.childNodes // get a list of relevant nodes
for node in nodes {
    guard let materials = node.geometry?.materials else { continue }
    for material in materials {
        material.diffuse.wrapS = .clamp
        material.diffuse.wrapT = .clamp
        // ...confgure other material properties as necessary...
    }
}

答案 1 :(得分:0)

当我放大您的纹理png文件时,实际上看起来所有侧面都有一个细的蓝色边框:enter image description here

您是否已验证这些线不在实际的纹理文件中,甚至没有几个像素宽?

如warrenm所言,如果您确定原始纹理是完美的,则可能是您的纹理包裹设置存在问题。即,将分配给SCNWrapModematerial.diffuse.wrapS的{​​{1}}设置为material.diffuse.wrapT。我会将您的环绕模式设置为SCNWrapMode.repeat。我不确定如何在Xcode编辑器中进行编辑,但是如果您的纹理位于Assets.xcassets文件夹中,则通过编程的方式看起来像这样:

SCNWrapMode.clamp

或者,您也可以使用... material.diffuse.contents = UIImage(named: "your_texture")! material.diffuse.wrapS = SCNWrapMode.clamp material.diffuse.wrapT = SCNWrapMode.clamp ... 并将材质的SCNWrapMode.clampToBorder属性设置为黑色。

但是我会真正查看您的原始png文件,以确保纹理本身中不存在蓝色边框。祝你好运!