2015-06-19 2 views
3

Я хотел бы использовать шейдер Metal, чтобы применить оттенок toon/cell к материалам, используемым в сцене. Шейдер, который я пытаюсь реализовать, является собственностью Apple AAPLCelShader, найденной в MetalShaderShowcase. Я немного новичок в реализации шейдеров в SceneKit, чтобы я мог делать все совершенно неправильно.Использование металлического шейдера в SceneKit

Из того, что я понимаю в документации, Metal или GL-шейдер можно использовать для изменения рендеринга SceneKit с iOS 9 и Xcode 7. Документация предполагает, что это делается так же, как GL-шейдеры.

Мой метод заключается в попытке получить путь к файлу .metal, а затем загрузить его в строку для использования в свойстве SCNMaterialshaderModifiers в виде [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.

Неужели я об этом совершенно не так? Я не могу понять, почему он не будет обращаться к файлу, кроме проблемы с неправильным использованием металлического файла.

Есть ли более простой или лучший способ реализовать затенение ячеек и, в конечном итоге, жирный контур по краям?

ответ

3

AAPLCelShader.metal - это полная реализация вершин/rastex/фрагмент, что не является тем, что представляет собой шейдер-модификаторы: исходный код, который будет вводиться в уже завершенные шейдеры.

Вместо этого вы можете создать SCNProgram, используя функции вершин и фрагментов в AAPLCelShader.metal. Что замечательно в отношении Metal, а также GLSL, заключается в том, что вы можете использовать names of Metal functions вместо строк исходного кода, с которыми проще работать, и приводит к тому, что функции компилируются до выполнения, которые GLSL не поддерживает. (Это все еще не так хорошо, как должно быть, когда Swift распознает функции Metal как правильно напечатанные, рефакторируемые закрытые имена.) Конечно, в то время как GLSL SCNPrograms будет преобразован в Metal для совместимого оборудования, Metal SCNPrograms не будет быть переведены на устаревшие устройства.

Что касается отображения из SceneKit к Rastex в (неправильно названном ColorInOut) Участники:

float4 position [[position]]; 
float shine; 
float3 normal_cameraspace; 
float3 eye_direction_cameraspace; 
float3 light_direction_cameraspace; 

... Я, к сожалению, не имеют ответа для вас еще.

+0

Это отличная информация, спасибо. Это действительно проливает свет на все это, потому что это совершенно новая область для меня. –

Смежные вопросы