我一直在使用 Metal 渲染多面体。当我尝试使用 newBufferWithBytes() 渲染一个二十面体实体时,就会出现问题,该实体的顶点仅包含大小为 1680 字节的数据。然后整个应用程序停止,CPU 和 GPU 帧都下降到零,一切都恢复正常,除了金属视图冻结。
我在实现中将常规多面体作为 Node 的子类。
class Node {
let name : String
var vertexBuffer: MTLBuffer?
var uniformBuffer: MTLBuffer?
var vertexCount : Int = 0
var device : MTLDevice
init(name: String, vertices: [Vertex], device: MTLDevice){
self.name = name
self.device = device
var floatBuffer : [Float] = []
for vertex in vertices {
floatBuffer += vertex.floatBuffer
}
let floatBufferSize = floatBuffer.count * sizeof(Float)
self.vertexBuffer = device.newBufferWithBytes(&floatBuffer, length: floatBufferSize, options: nil)
self.vertexCount = floatBuffer.count
}
func render(commandEncoder: MTLRenderCommandEncoder, parentModelViewMatrix: Matrix4, projectionMatrix: Matrix4){
commandEncoder.setVertexBuffer(self.vertexBuffer, offset: 0, atIndex: 0)
// set up uniform transformation matrices
var nodeModelMatrix = self.modelMatrix()
nodeModelMatrix.multiplyLeft(parentModelViewMatrix)
let matrixSize = sizeof(Float) * Matrix4.numberOfElements()
uniformBuffer = device.newBufferWithLength(matrixSize * 2, options: .OptionCPUCacheModeDefault)
var bufferPointer = uniformBuffer?.contents()
memcpy(bufferPointer!, nodeModelMatrix.raw(), matrixSize)
memcpy(bufferPointer! + matrixSize, projectionMatrix.raw(), matrixSize)
commandEncoder.setVertexBuffer(self.uniformBuffer, offset: 0, atIndex: 1)
// can draw
commandEncoder.drawPrimitives(.Triangle, vertexStart: 0, vertexCount: self.vertexCount, instanceCount: 1)
}
}