Почему моя камера сцены показывает только черный экран, когда я использую SCNTechnique?
Поэтому я использую SceneKit с iOS 12 (Swift 4.2) и хочу добавить искажение вращения / удара к камере. Я обнаружил нечто подобное ( широкоугольный экран "Рыбий глаз" с камерой комплекта сцены: возможно?), Который предположительно создает искажение в виде бочки. Но когда я попытался добавить его в свой проект, сцена просто становится черной, и я получаю сообщение об ошибке в консоли
2019-03-07 13:35:14.982232+0000 TestingSCN[551:66202] [framework] CUIThemeStore: Нет темы, зарегистрированной с id = 0
2019-03-07 13: 35: 15.064859 + 0000 TestingSCN [551: 66202] [framework] CUIThemeStore: Нет темы, зарегистрированной с id = 0
2019-03-07 13: 35: 15.097517 + 0000 TestingSCN [551: 66270] [framework] CUIThemeStore: Нет темы, зарегистрированной с id = 0
2019-03-07 13: 35: 15.118445 + 0000 TestingSCN [551: 66270] [SceneKit] Ошибка: невозможно выполнить рендеринг без программ, по умолчанию
Теперь метод в основном использует файл словаря JSON для определения техники и файлы вершин и фрагментов GLSL. Затем в моем основном файле swift я добавляю эту технику к камере. Это код, который я использовал: баррель.json (находится в art.scnassets)
{
"passes" : {
"barrel" : {
"outputs" : {
"color" : "COLOR"
},
"inputs" : {
"colorSampler" : "COLOR",
"noiseSampler" : "noiseSymbol",
"a_position" : "a_position-symbol"
},
"program" : "art.scnassets/barrel",
"draw" : "DRAW_QUAD"
}
},
"sequence" : [
"barrel"
],
"symbols" : {
"a_position-symbol" : {
"semantic" : "vertex"
},
"noiseSymbol" : {
"image" : "noise.png",
"type" : "sampler2D"
},
"barrelPower" : {
"type" : "float"
}
}
}
barrel.fsh
uniform sampler2D colorSampler;
const float PI = 3.1415926535;
uniform float barrelPower;
varying vec2 uv;
vec2 Distort(vec2 p)
{
float theta = atan(p.y, p.x);
float radius = length(p);
radius = pow(radius, barrelPower);
p.x = radius * cos(theta);
p.y = radius * sin(theta);
return 0.5 * (p + 1.0);
}
void main() {
vec2 rg = 2.0 * uv.xy - 1.0;
vec2 uv2;
float d = length(xy);
if (d < 1.0){
uv2 = Distort(xy);
} else {
uv2 = uv.xy;
}
gl_FragColor = texture2D(colorSampler, uv2);
}
barrel.vsh
attribute vec4 a_position;
varying vec2 uv;
void main() {
gl_Position = a_position;
uv = a_position.xy;
}
GameViewController.swift (в viewDidLoad)
let url: URL = Bundle.main.url(forResource: "art.scnassets/barrel", withExtension: "json")!
do {
let jsonData = try Data(contentsOf: url)
let jsonObject = try JSONSerialization.jsonObject(with: jsonData, options:JSONSerialization.ReadingOptions(rawValue: 0))
guard let dictionary = jsonObject as? Dictionary<String, Any> else {
print("Not a Dictionary")
return
}
var technique: SCNTechnique? = nil
technique = SCNTechnique(dictionary: dictionary)
technique?.setValue(NSNumber(value: 0.5), forKey: "barrelPower")
cameraNode.camera?.technique = technique
}
catch let error as NSError {
print("Found an error - \(error)")
}
Я не очень разбираюсь в шейдерах, и я знаю, что, вероятно, лучше написать SCNProgram или что-то еще, но я не знаю, с чего начать. Любая помощь приветствуется:)
1 ответ
Вы можете попробовать
let scnView = self.view as! SCNView
scnView.technique = technique
так как вы используете ("draw": "DRAW_QUAD"), который рендерит текстуру объектов рендеринга.
Также есть ошибка компилятора:
float d = length(xy); // `xy` is not defined