我目前正在使用Metal为大型iOS 8应用编写代码。由于缺乏非常重要的例子,它被证明非常令人沮丧,事实上(通过设计)的工作与DirectX和OpenGL ES(我知道两者)略有不同。
目前,我只能找到使用单个顶点/索引缓冲区的教程,然后在着色器中做一些奇特的东西。我想看看如何管理具有不同顶点的多个对象和着色器制服绘制在同一帧中。
答案 0 :(得分:0)
Here是来自苹果的一个很好的示例,它展示了如何管理不同的对象和多个着色器。这只是一个项目,但还有一个WWDC session苹果工程师解释这个项目是如何工作的。
答案 1 :(得分:0)
尝试一个有用的金属库,用于iOS图像和视频处理,名为" MetalImage" 参考github:https://github.com/erickingxu/MetalImage.git
答案 2 :(得分:0)
Here 你会发现我做了一个实现,从不同来源获取文档。
我认为这是一个很好的起点。
基本上你会在这个 Swift 项目中找到:
答案 3 :(得分:-1)
要修改RayWenderlich introductory metal tutorial以将具有不同资源的多个对象绘制到同一帧中,首先需要为每个对象创建单独的MTLRenderPipelineState(定义着色器)和MTLBuffer(定义顶点/索引)宾语。
然后,您可以循环浏览Render Command Encoder中的对象并绑定唯一对象并在调用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()