我目前正在使用Metal编写一个大型 iOS 8 应用程序。由于缺乏重要的示例,事实证明它非常令人沮丧,而且事实(按设计)与 DirectX 和 OpenGL ES(我都知道)有点不同。
目前,我只能找到使用单个顶点/索引缓冲区然后在着色器中做一些花哨的东西的教程。我想看看如何管理具有不同顶点和着色器制服的多个对象绘制同一帧。
在这里你会找到我做的一个实现,从不同的来源获取文档。
我认为是一个很好的起点。
基本上你会在这个 Swift 项目中找到:
尝试一个用于 iOS 图像和视频处理的有用金属库,称为“MetalImage”,请参阅 github:https ://github.com/erickingxu/MetalImage.git
要修改RayWenderlich 介绍性金属教程以将具有不同资源的多个对象绘制到同一帧中,您首先需要为每个对象创建一个单独的 MTLRenderPipelineState(定义着色器等)和 MTLBuffer(定义顶点/索引)。
然后,您可以遍历渲染命令编码器中的对象并绑定唯一对象并在调用 endEncoding() 之前调用 drawPrimitives()
- 在“渲染三角形”部分的第 4 步中:
let renderEncoderOpt = commandBuffer.renderCommandEncoderWithDescriptor(renderPassDescriptor)
if let renderEncoder = renderEncoderOpt {
renderEncoder.setRenderPipelineState(pipelineState)
renderEncoder.setVertexBuffer(vertexBuffer, offset: 0, atIndex: 0)
renderEncoder.drawPrimitives(.Triangle, vertexStart: 0, vertexCount: 3, instanceCount: 1)
renderEncoder.endEncoding()
}
变成这样:
let renderEncoderOpt = commandBuffer.renderCommandEncoderWithDescriptor(renderPassDescriptor)
if let renderEncoder = renderEncoderOpt {
for drawable in drawables {
renderEncoder.setRenderPipelineState(drawable.pipelineState)
renderEncoder.setVertexBuffer(drawable.vertexBuffer, offset: 0, atIndex: 0)
renderEncoder.drawPrimitives(.Triangle, vertexStart: 0, vertexCount: drawable.vertexCount, instanceCount: 1)
}
renderEncoder.endEncoding()