MIP-карта SpriteKit SKTexture не работает

Я не могу понять, как применять MIP-карты для текстуры SKTexture. Я использую XCode 8.2.1 со Swift.

Вот мой метод:

override func sceneDidLoad() {
    logo = childNode(withName: "logo") as! SKSpriteNode
    let texture: SKTexture! = SKTexture.init(imageNamed: "logo")
    texture.usesMipmaps = true
    logo.texture = texture
}

Я использую образец изображения png размером 512 * 512 (оба горшка) Полноразмерный, он выглядит так: полноразмерное изображение

Затем я хочу уменьшить его размер до 128 * 128 пикселей.

уменьшить размер

А вот результат с включенным mipmapping:  Mipmapping включен вывод 128 * 128

И, например, вывод без mipmapping (только линейная фильтрация по умолчанию)  без mipmapping

Они оба выглядят одинаково. Так что я думаю, что MIP-карты неприменимы. Помогите, пожалуйста, я уже 3 дня пытаюсь решить эту проблему.

UPD: как мне сказал Confused, я все сделал в коде. Создав текстуру с включенным MIP-картированием, назначьте ее SKSpriteNode, а затем выполните масштабирование методом или действием масштабирования.

let texture = SKTexture.init(imageNamed: "logo")
texture.usesMipmaps = true
logo = SKSpriteNode.init(texture: texture)
logo.position = CGPoint(x: 0, y: 0)
self.addChild(logo)
//logo.scale(to: CGSize(width: 128, height: 128))
let scaleAction = SKAction.scale(to: CGSize(width: 128, height: 128), duration: 1)
    logo.run(scaleAction)

Результат тот же:  введите описание изображения здесь


person widesteppe    schedule 22.01.2017    source источник
comment
Ты прав. Они точно такие же. Я поместил их в Photoshop и сделал смешивание различий. Тот, у которого нет mipmapping, находится на один пиксель слева от того места, где он должен быть на вашем скриншоте, но после исправления они идентичны.   -  person Confused    schedule 22.01.2017


Ответы (1)


Совсем не удивительно, если редактор Xcode SpriteKit Scene Editor изменяет размер вашей текстуры до того, как ваш код активирует mipmapping. Это означает, что версия вашей текстуры 128x128 имеет MIP-отображение, потому что это то, что Xcode и SpriteKit SceneEditor сговорились сохранить как текстуру.

Поэтому вместо настройки масштаба в редакторе сцены после включения mipMapping в вашем коде используйте это для масштабирования SKSpriteNode:

https://developer.apple.com/reference/spritekit/skspritenode/1645445-scale

и / или поэкспериментируйте с операциями масштабирования SKAction:

https://developer.apple.com/reference/spritekit/skaction

Таким образом, вы можете быть абсолютно уверены, что последовательность событий

  1. Включите MIP-отображение
  2. Выполнить масштабирование

Надеюсь, это сработает.

person Confused    schedule 22.01.2017
comment
Спасибо за ответ, но это не помогает. Посмотрите UPD выше. - person widesteppe; 22.01.2017
comment
DOH! На каких устройствах вы это тестировали? - person Confused; 22.01.2017
comment
Протестировано на моем Mac и симуляторах iOS. - person widesteppe; 22.01.2017
comment
ах. Ok. Вы обязательно захотите протестировать на устройствах. Есть большая вероятность, что оптимизации графического процессора (одной из которых является mipmapping) не происходят в симуляторах. - person Confused; 22.01.2017
comment
Хорошо, может быть, Симуляторы - не лучший вариант для такого тестирования, но я думаю, что MIP-отображение должно работать на macOS 10.12.3. - person widesteppe; 22.01.2017
comment
Я бы не стал рассчитывать на то, что это правда. Отсутствие согласованности в SpriteKit - это его единственная согласованность. - person Confused; 22.01.2017
comment
Хороший ответ Запутался. @widesteppe Вы пробовали также использовать override func didMove(to view: SKView) { вместо override func sceneDidLoad() { - person Alessandro Ornano; 22.01.2017