1

我正在尝试使用 SceneKit 绘制一组简单的 4 个盒子,它们彼此相邻,每个盒子都应用了纹理(Minecraft 风格):

在此处输入图像描述

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

在此处输入图像描述

我想避免盒子之间的小蓝线(不在纹理中),但无论我尝试什么设置,这些人工制品都会保留。

知道如何避免它们吗?

在场景工具包编辑器中的材质设置下方(每个盒子都完全相同,除了漫反射部分是指正确的纹理文件)

在此处输入图像描述

在此处输入图像描述

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

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

在此处输入图像描述

4

2 回答 2

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...
    }
}
于 2018-11-02T18:34:47.230 回答
1

当我放大你的纹理 png 文件时,它实际上看起来四面都有一个细的蓝色边框:在此处输入图像描述

您是否验证过这些线在您的实际纹理文件中不存在,即使是几个像素宽?

如果你确定你的原始纹理是完美的,那可能是你的纹理环绕设置有问题,正如 warrenm 评论的那样。即SCNWrapMode分配给material.diffuse.wrapSmaterial.diffuse.wrapT设置为SCNWrapMode.repeat。我会将您的换行模式设置为SCNWrapMode.clamp. 我不确定如何在 Xcode 编辑器中编辑它,但如果您的纹理位于 Assets.xcassets 文件夹中,它会以编程方式看起来像这样:

...
material.diffuse.contents = UIImage(named: "your_texture")!
material.diffuse.wrapS = SCNWrapMode.clamp
material.diffuse.wrapT = SCNWrapMode.clamp
...

或者,您可以使用SCNWrapMode.clampToBorder并将材质的borderColor属性设置为黑色。

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

于 2018-11-02T18:37:41.803 回答