【问题标题】:What is a proper MTLRegion param here?什么是正确的 MTLRegion 参数?
【发布时间】:2021-10-13 19:42:05
【问题描述】:

我需要从UnsafeRawPointer 创建一个MTLTexture,我尝试这样做:

  private func createTexture(frame: UnsafeMutableRawPointer) -> MTLTexture? {
    let textureOjb: UnsafeMutableRawPointer = frame_get_texture_obj(frame)
    let ti: TextureInfo = texture_get_info(textureOjb)
    
    let textureDescriptor = MTLTextureDescriptor.texture2DDescriptor(
      pixelFormat: MTLPixelFormat.rgba8Unorm,
      width: Int(ti.width),
      height: Int(ti.height),
      mipmapped: false)
    
    textureDescriptor.usage = [.shaderWrite, .shaderRead]
    
    guard let texture: MTLTexture = device?.makeTexture(descriptor: textureDescriptor) else
    {
      logger?.log(severity: .error, msg: "create texture FAILED.")
      return nil
    }
    
    let data: UnsafeRawPointer = UnsafeRawPointer(ti.pixels)
    
    texture.replace(region: <#T##MTLRegion#>, mipmapLevel: 0, withBytes: data, bytesPerRow: Int(ti.stride))
    
    return texture
  }

根据文档,这是正确的方法,所以,首先,我创建了MTLTextureDescriptor,然后我创建了一个MTLTexture,最后我需要传递我的像素数据才能做到这一点我使用@ 987654326@方法。

我不明白region这里的第一个参数是什么的问题?我应该通过那里?

【问题讨论】:

    标签: swift metal metalkit


    【解决方案1】:

    使用 MTLRegion 结构来确定要更新纹理的哪个部分。此示例使用图像数据填充整个纹理;所以创建一个覆盖整个纹理的区域。

    MTLRegion region = {
        { 0, 0, 0 },                       // MTLOrigin
        {texture.width, texture.height, 1} // MTLSize
    };
    

    斯威夫特:

    let region = MTLRegion.init(origin: MTLOrigin.init(x: 0, y: 0, z: 0), size: MTLSize.init(width: texture.width, height: texture.height, depth: 1));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-18
      • 2021-01-05
      • 2011-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多