几何程序在iPad Mini 2 iOS 9上不起作用

时间:2015-09-17 22:24:32

标签: ios shader scenekit

我无法在iOS 9中的节点几何体上使用着色器运行我的程序。这是测试代码:

import SceneKit

class Test: NSObject, SCNProgramDelegate {

    private static let SIZE = 10

    private static let RES = 256

    var node: SCNNode!

    override init() {
        super.init()

        setup()
    }

    func program(program: SCNProgram, handleError error: NSError) {
        NSLog("program error: %@", error)
    }

    private func setup() {
        node = SCNNode()
        node.rotation = SCNVector4Make(1, 0, 0, -Float(M_PI) / 2)

        node.geometry = createGeometry()
    }

    private func createGeometry() -> SCNGeometry {
        let size = CGFloat(GpuHeightFieldWater.SIZE)
        let geometry = SCNPlane(width: size, height: size)
        geometry.widthSegmentCount = GpuHeightFieldWater.RES
        geometry.heightSegmentCount = GpuHeightFieldWater.RES

        let program = SCNProgram()
        program.delegate = self
        program.vertexShader = loadShader("test.vsh")
        program.fragmentShader = loadShader("test.fsh")

        program.setSemantic(SCNGeometrySourceSemanticVertex, forSymbol: "a_position", options: nil)
        program.setSemantic(SCNModelViewProjectionTransform, forSymbol: "u_mvpMatrix", options: nil)

        geometry.program = program

        return geometry
    }

    private func loadShader(name: String) -> String! {
        let file = NSString(string: name)
        let url = NSBundle.mainBundle().URLForResource(file.stringByDeletingPathExtension, withExtension: file.pathExtension)
        let data = NSData(contentsOfURL: url!)
        return String(data: data!, encoding: NSUTF8StringEncoding)
    }
}

test.vsh:

attribute vec4 a_position;
uniform mat4 u_mvpMatrix;

void main()
{
    vec4 a = a_position;
    a.x = 0;

    gl_Position = u_mvpMatrix * a;
}

test.fsh:

void main()
{
    gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);
}

节点添加到场景的根节点,我看到平面(有奇怪的紫色)但我的程序从未运行,我没有看到我的程序有任何错误。所以看起来我的程序被忽略了。

有什么问题以及如何正确运行几何程序?

更新#1

当我在iPhone 5s模拟器上运行app时,它在第7行打印了关于我的顶点着色器代码的错误。

  

错误:0:7:赋值时不兼容的类型(float和int)(并且没有   可用隐式转换)

当我修复该错误时,它可以正常工作。奇怪的是,当我在iPad Mini 2(iOS 9.0)上运行此应用程序时,我没有看到任何错误。

更新#2

为了避免误解,我改变了问题标题,因为我发现在iPhone 5s模拟器上显示程序错误。所以问题与iOS 9的iPad Mini 2有关。

另外我注意到在我的设备上它显示了Metal(Mt):

enter image description here

并在iPhone模拟器上显示GL:

enter image description here

也许它与问题有关。

2 个答案:

答案 0 :(得分:3)

Rendering API视图的SCNView参数存在问题。从Game模板创建项目时,它具有Default呈现API。

看起来默认意味着Metal,这就是为什么我的几何程序被忽略的原因。当我将渲染API更改为Open GL ES时,它开始将我的程序用于着色器。

当我在模拟器中运行我的应用时,它使用OpenGL ES作为默认渲染API。我不知道为什么它以这种方式工作,因为它让开发人员感到困惑。枚举只有两个值:

enum SCNRenderingAPI : UInt {
    case Metal
    case OpenGLES2
}

没有任何Default值以及开发人员如何猜测iOS选择什么作为渲染API?我对这部分文档不满意。

答案 1 :(得分:0)

尝试更改第7行:

    a.x = 0;

    a.x = 0.0;

该错误实际上暗示了行(0:7)和问题,因为您提供了int,其中float是预期的。