【发布时间】:2014-10-19 00:35:37
【问题描述】:
我正在尝试设置一个统一的 mat4,我想在 iOS 上的 SceneKit(Xcode 6 beta 6)中的自定义着色器程序中使用它。我正在尝试在 Swift 中做到这一点。
let myMatrix: Array<GLfloat> = [1, 0, 0 , 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1]
var material = SCNMaterial()
var program = SCNProgram()
// setup of vertex/fragment shader goes here
program.vertexShader = //...
program.fragmentShader = //...
material.program = program
// I want to initialize the variable declared as "uniform mat4 u_matrix" in the vertex shader with "myMatrix"
material.handleBindingOfSymbol("u_matrix") {
programID, location, renderedNode, renderer in
let numberOfMatrices = 1
let needToBeTransposed = false
glUniformMatrix4fv(GLint(location), GLsizei(numberOfMatrices), GLboolean(needToBeTransposed), myMatrix)
}
使用此代码,我有以下编译错误:Cannot invoke 'init' with an argument list of type (GLint, GLsizei, GLboolean, Array<GLfloat>)。但是,根据此处的文档 (section "Constant pointers"),我的理解是,我们可以将数组传递给以 UnsafePointer 作为参数的函数。
然后我尝试通过执行以下操作直接传递 UnsafePointer:
let testPtr: UnsafePointer<GLfloat> = nil
glUniformMatrix4fv(GLint(location), GLsizei(numberOfMatrices), GLboolean(needToBeTransposed), testPtr)
我得到了错误Cannot invoke 'init' with an argument list of type '(GLint, GLsizei, GLboolean, UnsafePointer<GLfloat>)'
然而,glUniformMatrix4fv的原型正是这样的:
func glUniformMatrix4fv(location: GLint, count: GLsizei, transpose: GLboolean, value: UnsafePointer<GLfloat>)
知道我做错了什么吗?如果我们使用自定义着色器,我们应该如何将 mat4 作为统一传递?
注意 1:我首先尝试为 myMatrix 使用 SCNMatrix4,但收到错误“SCNMatrix4 无法转换为 UnsafePointer”。
注意2:我想过使用GLKMatrix4,但是Swift不识别这种类型。
【问题讨论】:
标签: ios opengl-es swift scenekit