首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么当我使用SCNTechnique时,我的场景摄像机只显示黑色屏幕?

为什么当我使用SCNTechnique时,我的场景摄像机只显示黑色屏幕?
EN

Stack Overflow用户
提问于 2019-03-07 13:59:42
回答 1查看 421关注 0票数 0

因此,我使用SceneKit与iOS 12 (SWIFT4.2),我想增加一个旋转/凹凸变形的相机。我在这里发现了一些类似的东西(Fish Eye Wide-angle with a Scene Kit Camera: Possible?),据说它会造成桶形变形。但是当我尝试将它添加到我的项目中时,场景就变黑了,并且在控制台中出现了一个错误。

2019-03-07 13:35:14.982232+0000 TestingSCN551 551:66202 CUIThemeStore:无主题注册id=0 2019-03-07 13:35:15.064859+0000 TestingSCN551 551:66202 CUIThemeStore:无主题注册id=0 2019-03-07 13:35:15.097517+0000 TestingSCN551 551:66270 CUIThemeStore:无主题注册id=0 2019年-03-07 13:35:15.118445+0000测试can 551:66270错误:无法在没有程序的情况下呈现,使用默认

现在,这个方法基本上是使用一个JSON字典文件来定义一个技术和GLSL顶点和片段着色器文件。然后,在我的主要快速文件中,我将这项技术添加到相机中。这是我使用的代码: barrel.json (位于art.scnassets中)

代码语言:javascript
复制
{
    "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

代码语言:javascript
复制
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

代码语言:javascript
复制
attribute vec4 a_position;
varying vec2 uv;

void main() {
    gl_Position = a_position;
    uv = a_position.xy;
}

GameViewController.swift (在viewDidLoad中)

代码语言:javascript
复制
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或其他什么可能更好,但我甚至不知道从哪里开始。如有任何帮助,我们将不胜感激:)

EN

回答 1

Stack Overflow用户

发布于 2019-03-07 21:44:36

你可以试试

代码语言:javascript
复制
    let scnView = self.view as! SCNView
    scnView.technique = technique

当您使用一个(“绘图”:"DRAW_QUAD")来呈现渲染对象的纹理时。

此外,还有一个编译器错误:

代码语言:javascript
复制
 float d = length(xy);  // `xy` is not defined
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55045564

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档