几何程序不适用于 iPad Mini 2 iOS 9

Geometry program doesn't work on iPad Mini 2 iOS 9

我不能 运行 我的程序在 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);
}

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

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

更新#1

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

ERROR: 0:7: Incompatible types (float and int) in assignment (and no available implicit conversion)

当我修复该错误时,它就起作用了。请注意,当我 运行 在我的 iPad Mini 2 (iOS 9.0) 上使用此应用程序时,我没有看到任何错误。

更新#2

为了避免误会,我更改了问题标题,因为我发现在iPhone 5s 模拟器上它显示程序错误。所以问题与 iPad Mini 2 和 iOS 9.

有关

我还注意到我的设备上显示的是金属 (Mt):

在 iPhone 模拟器上显示 GL:

可能与问题有关。

尝试更改第 7 行:

    a.x = 0;

    a.x = 0.0;

该错误实际上暗示了行 (0:7) 和问题,因为您给出了 int,而预期的是 float

问题出在 SCNView 视图的 Rendering API 参数中。当您从 Game 模板创建项目时,它具有 Default 渲染 API。

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

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

enum SCNRenderingAPI : UInt {
    case Metal
    case OpenGLES2
}

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