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-файлы, чтобы убедиться, что в самой текстуре нет синей рамки. Удачи!