SceneKit текстурная проблема на материале

Я пытаюсь добиться с помощью SceneKit рисования простого набора из 4 блоков, расположенных рядом друг с другом, с текстурами, нанесенными на каждый из них (стиль Minecraft):

Текстура выглядит так (png файлы):

Я хотел бы избежать маленьких синих линий между блоками (которых нет в текстурах), но какие бы настройки я ни пробовал, эти артефакты остаются.

Есть идеи, как их избежать?

Ниже настройки материала в редакторе сцены (точно так же для каждого блока, за исключением диффузной части, которая ссылается на нужный файл текстуры)

Проблема в редакторе scenekit также появляется в приложении, работающем на устройстве.

Странно то, что если я просто делаю текстуру полностью черного (или любого другого цвета) (с чем-либо внутри или без него), эти артефакты не появляются, пример ниже:

2 ответа

Решение

Кажется, вам нужно программно установить режимы обтекания каждого свойства материала, чтобы избежать такого "обтекания". Настройте каждое свойство материала, которому вы присвоили текстуру, так, чтобы его wrapS а также wrapT свойства .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...
    }
}

Когда я увеличиваю ваши файлы текстуры png, на самом деле это выглядит так, как будто со всех сторон есть тонкая синяя рамка: введите описание изображения здесь

Вы убедились, что эти строки отсутствуют в ваших фактических файлах текстуры, даже пару пикселей в ширину?

Если вы уверены, что ваши исходные текстуры идеальны, вероятно, это проблема ваших настроек обтекания текстурой, как прокомментировал Warrenm. то есть SCNWrapMode назначен на material.diffuse.wrapS а также material.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-файлы, чтобы убедиться, что в самой текстуре нет синей рамки. Удачи!

Другие вопросы по тегам