【问题标题】:How to get programmatically the maximum texture size (width and height)如何以编程方式获取最大纹理大小(宽度和高度)
【发布时间】:2020-02-10 11:12:09
【问题描述】:

如何以编程方式获取金属的最大纹理尺寸(宽度和高度)?使用 openGL 我可以做到:glGetIntegerv(GL_MAX_TEXTURE_SIZE, ...) 但如何使用 Metal 做到这一点?

【问题讨论】:

  • @trojanfoe 当然,你为什么说我从不接受答案?
  • 因为查看您的个人资料,我发现您的最后 10 个问题未被接受。
  • 你真的应该将接受的答案切换到@codeTiger,他是那个以编程方式告诉你如何完全按照你的要求去做的人。
  • @DavidH 完成 :) 我忘记了

标签: ios swift textures metal metalkit


【解决方案1】:

目前没有用于检索金属设备的最大纹理尺寸的 API。您应该咨询Metal Feature Set Tables 以获取此信息,并将其包含在您的应用程序中。

对于运行当前 iOS/tvOS/iPadOS 版本的 A9 和更新的 GPU,2D 纹理的最大尺寸为 16384×16384。

【讨论】:

    【解决方案2】:

    正如@warrenm 所提到的,以编程方式无法获得设备支持的最大纹理大小。但是,下面的代码会根据设备类型为您提供硬编码的大小。

    int maxTexSize = 4096;
    
    if ([mtldevice supportsFeatureSet:MTLFeatureSet_iOS_GPUFamily4_v1] || [mtldevice supportsFeatureSet:MTLFeatureSet_iOS_GPUFamily3_v1]) {
        maxTexSize = 16384;
    else if ([mtldevice supportsFeatureSet:MTLFeatureSet_iOS_GPUFamily2_v2] || [mtldevice supportsFeatureSet:MTLFeatureSet_iOS_GPUFamily1_v2]) {
        maxTexSize = 8192;
    } else {
        maxTexSize = 4096;
    }
    

    【讨论】:

      【解决方案3】:

      iOS13 中有一个新的 API,应该会让这个过程更加健壮(对于 iOS 设备):

      // If you use this you must be on iOS 13, so the code is valid for any device running that
      func maxTextureDimension2(mtlDevice: MTLDevice) -> Int {
          // https://developer.apple.com/documentation/metal/mtldevice/3143473-supportsfamily
          let maxTexSize = mtlDevice.supportsFamily(.apple3) ? 16384 : 8192
          return maxTexSize
      }
      

      如果部署到旧版 iOS,请使用@codeTiger 的答案。

      PS:算法直接来自 Warren Moore。

      【讨论】:

        猜你喜欢
        • 2020-01-31
        • 1970-01-01
        • 1970-01-01
        • 2017-02-02
        • 2013-09-23
        • 2013-11-29
        • 1970-01-01
        • 2020-05-14
        • 1970-01-01
        相关资源
        最近更新 更多