【问题标题】:Geometry program doesn't work on iPad Mini 2 iOS 9几何程序在 iPad Mini 2 iOS 9 上不起作用
【发布时间】:2015-12-14 22:43:28
【问题描述】:

我无法在 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 模拟器上运行应用程序时,它在第 7 行打印了关于我的顶点着色器代码的错误。

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

当我修复该错误时,它会起作用。奇怪的是,当我在 iPad Mini 2 (iOS 9.0) 上运行这个应用程序时,我没有看到任何错误。

更新 #2

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

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

在 iPhone 模拟器上显示 GL:

也许它与某种问题有关。

【问题讨论】:

  • 你遇到了什么错误?

标签: ios shader scenekit


【解决方案1】:

尝试更改第 7 行:

    a.x = 0;

    a.x = 0.0;

该错误实际上是在暗示该行 (0:7) 和问题,因为您提供的是 int,而应该是 float

【讨论】:

  • 我知道如何修复错误(请参阅更新 #1)。我的问题是关于为什么在 iOS 9 中它不打印任何错误。
  • 有趣。是否显示任何其他类型的日志/错误?很抱歉造成混乱。
  • 不,当我在装有 iOS 9 的真实设备上运行时,它不会打印任何内容。
  • 嗯...这似乎更像是一个操作系统问题而不是 SceneKit。附近有其他 iOS9 设备可以试用吗?
  • 不,我只有一台装有 iOS 9 的设备 - iPad Mini 2。
【解决方案2】:

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

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

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

enum SCNRenderingAPI : UInt {
    case Metal
    case OpenGLES2
}

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

【讨论】:

  • 是的,同意。我认为这是源于故事板和三大游戏引擎 GUI 的问题的很大一部分,它们是场景编辑器和粒子编辑器的灵感来源。而且它们是不完整和无证的。它们在代码中的完成方式和在文档中的呈现方式与它们在决定状态的可视化编辑器中的呈现方式和选项之间存在许多细微差别。并且 OpenGL 和 Metal 在 iPad mini 2 上的渲染方式不同。尝试使用加法混合模式和几层来查看差异。
猜你喜欢
  • 1970-01-01
  • 2013-12-10
  • 2015-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-25
相关资源
最近更新 更多