几何程序不适用于 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?我对这部分文档不满意。
我不能 运行 我的程序在 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?我对这部分文档不满意。