Я хотел бы использовать шейдер Metal
для применения затенения мультяшек / ячеек к материалам, используемым в сцене. Шейдер, который я пытаюсь реализовать, принадлежит Apple AAPLCelShader
, который можно найти в MetalShaderShowcase. Я немного новичок в реализации шейдеров в SceneKit
, поэтому могу делать все совершенно неправильно.
Насколько я понимаю из документации, шейдер Metal
или GL может использоваться для изменения SceneKit
рендеринга в iOS 9 и Xcode 7. В документации предполагается, что это делается так же, как шейдеры GL.
Мой метод - попытаться получить путь к файлу .metal
, а затем загрузить его в строку, которая будет использоваться в свойстве SCNMaterial
shaderModifiers
в форме словаря [String: String], как и в случае с шейдером GL (хотя я Мне еще предстоит заставить это работать должным образом).
Мой код:
var shaders = [String: String]()
let path = NSBundle.mainBundle().pathForResource("AAPLCelShader", ofType: "metal")!
do{
let celShader = try String(contentsOfFile: path, encoding: NSUTF8StringEncoding)
shaders[SCNShaderModifierEntryPointLightingModel] = celShader
}catch let error as NSError{
error.description
}
scene.rootNode.enumerateChildNodesUsingBlock({ (node, stop) -> Void in
node.geometry?.firstMaterial?.shaderModifiers = shaders
})
Это выполняется на тестовой сцене с одной геометрией в ней, которая загружается из файла .scn
. Загрузка файла работает нормально, так что это не проблема.
Ошибка возникает из второй строки, где я пытаюсь найти путь, она дает мне «найдено ноль при разворачивании необязательного значения», которое можно было бы ожидать при принудительном разворачивании, за исключением того факта, что файл, который он пытается загрузить, больше всего обязательно в комплекте и тот же код отлично работает с другими типами файлов, только не .metal
.
Я ошибаюсь? Я не могу понять, почему он не может получить доступ к файлу, кроме проблемы с неправильным использованием металлического файла.
Есть ли более простой или лучший способ реализовать затенение ячеек и, в конечном итоге, жирный контур по краям?