Статьи

Первый взгляд на текстуру Sky Cube модели ввода / вывода

Название изображения

В моем недавнем сообщении в блоге «  Управление системами диффузии реагирования металла с помощью камеры iPad» было продемонстрировано использование  процедурной текстуры шумов Model I / O на сцене Metal. В этом посте рассматривается использование MDLSkyCubeTexture модели ввода-  вывода  в проекте SceneKit.

MDLSkyCubeTexture  процедурно генерирует физически реалистичное моделирование солнечного неба. Он идеально подходит для использования в качестве фона или карты отражений и, что интересно, его можно использовать вместе со световым зондом Model I / O   для создания карт освещенности для освещения трехмерной геометрии на основе текстур.

В качестве введения в основы использования  MDLSkyCubeTexture я создал  простое демонстрационное приложение  на основе SceneKit, которое содержит вращающийся тор, использующий текстуру небесного куба в качестве карты отражения. Я также применил ту же текстуру, что и фон сцены. 

Создать текстуру небесного куба (которая имеет тип MDLTexture) довольно просто. Его инициализатор требует некоторых основных свойств:

  • Мутность: мера пыли и влажности в атмосфере. Значение ноль имитирует чистое небо, а значение 1 вызывает распространение цвета солнца.
  • Высота Солнца: значение 0,5 устанавливает уровень Солнца на горизонте, 1 — Солнце прямо над головой, а 0 — прямо под ним.
  • Рассеяние в верхней атмосфере: значение 0 дает теплые цвета заката, а значение 1 имитирует цвета полудня.
  • Наземный альбедо: количество света, которое отражается от земли. Значение 0 дает чистое небо, а значение 1 имитирует слабый туман. 

Код для создания экземпляра текстуры куба выглядит следующим образом:

    let sky = MDLSkyCubeTexture(name: nil,
        channelEncoding: MDLTextureChannelEncoding.UInt8,
        textureDimensions: [Int32(160), Int32(160)],
        turbidity: 0,
        sunElevation: 0,
        upperAtmosphereScattering: 0,

        groundAlbedo: 0)

С помощью  UIStackView я выложил свой экран с основным представлением SceneKit и четырьмя ползунками для управления этими свойствами. Когда любой из ползунков изменяется,  вызывается sliderChangeHandler ()  для обновления текстуры небесного куба. 

Это довольно тяжелая операция, поэтому я делаю это в фоновом режиме, чтобы пользовательский интерфейс был отзывчивым. Но в двух словах, я установил четыре свойства, которые обсуждались выше, от их соответствующих ползунков:

    self.sky.turbidity = self.turbiditySlider.value
    self.sky.upperAtmosphereScattering = self.upperAtmosphereScatteringSlider.value
    self.sky.sunElevation = self.sunElevationSlider.value
    self.sky.groundAlbedo = self.groundAlbedoSlider.value

Затем явно обновите текстуру:

    self.sky.updateTexture()

Из обновленной текстуры я могу получить ссылку на неуправляемый объект на CGImage небесного куба и назначить его для отражающего свойства материала тора и для свойства background моей сцены:

    self.material.reflective.contents = self.sky.imageFromTexture()?.takeUnretainedValue()
    self.sceneKitScene.background.contents = self.sky.imageFromTexture()?.takeUnretainedValue()

… и это все, что нужно сделать! Этот код был написан под Xcode 7 beta 3 и протестирован на iPad Air 2 под iOS 9 beta 3. Исходный код проекта доступен в  моем репозитории GitHub здесь . Наслаждайтесь!