1

我目前正在使用Metal编写一个大型 iOS 8 应用程序。由于缺乏重要的示例,事实证明它非常令人沮丧,而且事实(按设计)与 DirectX 和 OpenGL ES(我都知道)有点不同。

目前,我只能找到使用单个顶点/索引缓冲区然后在着色器中做一些花哨的东西的教程。我想看看如何管理具有不同顶点和着色器制服的多个对象绘制同一帧。

4

4 回答 4

0

在这里你会找到我做的一个实现,从不同的来源获取文档。

我认为是一个很好的起点。

基本上你会在这个 Swift 项目中找到:

  • 3D 模型加载、纹理化和渲染。
  • 着色器:顶点、片段和内核。在内核中,我实现了 Loki 用于随机生成颜色。
于 2021-01-30T08:38:30.683 回答
0

是来自苹果的一个很好的示例,它展示了如何管理不同的对象和多个着色器。这只是一个项目,但也有一个WWDC 会议,苹果工程师解释了这个项目是如何工作的。

于 2016-01-07T06:48:05.140 回答
0

尝试一个用于 iOS 图像和视频处理的有用金属库,称为“MetalImage”,请参阅 github:https ://github.com/erickingxu/MetalImage.git

于 2016-10-11T08:30:48.253 回答
-1

要修改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()
于 2015-05-13T23:45:36.933 回答