【问题标题】:Off Screen Rendering离屏渲染
【发布时间】:2018-11-30 08:38:17
【问题描述】:

在金属中的离屏渲染

let textureDescriptors = MTLTextureDescriptor()
textureDescriptors.textureType = MTLTextureType.type2D
let screenRatio = UIScreen.main.scale
textureDescriptors.width = Int((DrawingManager.shared.size?.width)!) * Int(screenRatio)
textureDescriptors.height = Int((DrawingManager.shared.size?.height)!) * Int(screenRatio)
textureDescriptors.pixelFormat = .bgra8Unorm
textureDescriptors.storageMode = .shared
textureDescriptors.usage = [.renderTarget, .shaderRead]
ssTexture = device.makeTexture(descriptor: textureDescriptors)
ssTexture.label = "ssTexture"

这里的纹理是清晰的颜色。是否可以加载图像纹理,是否可以在 Draw Method 中渲染图像纹理

let renderPass = MTLRenderPassDescriptor()
renderPass.colorAttachments[0].loadAction = .clear
renderPass.colorAttachments[0].clearColor = MTLClearColorMake(  0.0,  0.0,  0.0,  0.0)
renderPass.colorAttachments[0].texture = ssTexture
renderPass.colorAttachments[0].storeAction = .store

【问题讨论】:

  • 这里我需要传递一个RGB纹理进行渲染。我需要对该纹理进行更改。就像在某些地方我想让透明。有可能吗?

标签: ios swift metal metalkit


【解决方案1】:

我不确定你在问什么。

  • MTLTextureLoader 用于创建使用图像内容初始化的纹理。
  • 您可以使用MTLTexturereplace(region:...) 方法用图像数据填充全部或部分纹理。
  • 您可以使用MTLBlitCommandEncoder 将数据从一个纹理复制到另一个纹理(全部或部分),或从缓冲区复制到纹理。
  • 您可以绘制到纹理或从计算着色器写入纹理。

这是一个通用 API。有很多方法可以做你似乎在问的事情。你试过什么?这些尝试以何种方式未能实现您想要的?

【讨论】:

  • 是否可以通过将纹理传递给片段着色器来更改片段着色器中的纹理
  • 在计算着色器中我们可以做到。我想知道我们是否可以使用片段着色器来做到这一点
  • 在某些版本的 iOS 上,带有一些 GPU 系列,是的,片段着色器可以写入纹理。请参阅Metal Feature Set Tables (PDF)。查找标有“功能纹理读写”的行。此外,片段着色器正在绘制纹理,这是一种书写形式,可以实现您想要的。为什么绘图不足以完成您想做的事情?
猜你喜欢
  • 2018-06-11
  • 2011-04-20
  • 1970-01-01
  • 2019-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-17
  • 2017-01-30
相关资源
最近更新 更多