Проблема отображения текстуры SceneKit на материале - PullRequest
0 голосов
/ 02 ноября 2018

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

enter image description here

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

enter image description here

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

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

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

enter image description here

enter image description here

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

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

enter image description here

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

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

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

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

0 голосов
/ 02 ноября 2018

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