В настоящее время я работаю над приложением для iPadOS, которое использует SceneKit для рендеринга некоторых 3D-моделей. Ничего особенного, но я сталкиваюсь с большой трудностью, когда дело доходит до затенения этих моделей ...
В основном, что Я просто настраиваю сцену SceneKit (используя почти все настройки по умолчанию, у меня даже нет камеры) и создаю экземпляры 3D-объектов из некоторых моих файлов .obj, например, так.
let url = <URL of my .obj file>
let asset = MDLAsset(url: url)
let object = asset.object(at: 0)
let node = SCNNode(mdlObject: object)
let texture = UIImage(data: try Data(contentsOf: <URL of the texture>))
let material = SCNMaterial()
material.diffuse.contents = texture
node.geometry!.materials = [material]
self.sceneView.scene!.rootNode.addChildNode(node)
Текстуры загружаются вручную, потому что, к сожалению, именно так клиент настроил файлы для меня. Код работает нормально, и я могу видеть меня sh и его текстуру, однако он также выглядит следующим образом
Как вы можете видеть затенение не совсем гладко ... и я понятия не имею, как это исправить.
Клиент мешает мне реализовать затенение Фонга, и, согласно документации Apple, именно так вы и делаете.
material.lightingModel = .phong
К сожалению, это все равно, как выглядит с включенным Phong. Я абсолютный новичок, когда дело доходит до 3D-рендеринга, так что это может быть смешно легко, но я клянусь, что не могу понять, как добиться более плавного затенения на этой модели.
Я пытался смотреть влево и вправо, и единственное, что привело к какому-либо заметному результату, - это использование subdivisionLevel для увеличения фактических граней в геометрии, но это плохо масштабируется, поскольку реальное приложение должно загружать тонну этих сеток, и оно быстро исчерпывает память, даже когда подразделение установить на 1
Наверняка должен быть способ сгладить эти тени без улучшения фактической геометрии?
Заранее спасибо!