如何以编程方式获取最大纹理大小(宽度和高度)
How to get programmatically the maximum texture size (width and height)
如何以编程方式获取金属纹理的最大尺寸(宽度和高度)?使用 openGL 我可以做到:glGetIntegerv(GL_MAX_TEXTURE_SIZE, ...)
但如何使用 Metal 做到这一点?
目前没有 API 检索 Metal 设备的最大纹理尺寸。您应该查阅 Metal Feature Set Tables 以获取此信息并将其包含在您的应用程序中。
对于 A9 和更新的 GPU 运行 当前版本 iOS/tvOS/iPadOS,2D 纹理的最大尺寸为 16384×16384。
正如@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;
}
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
如何以编程方式获取金属纹理的最大尺寸(宽度和高度)?使用 openGL 我可以做到:glGetIntegerv(GL_MAX_TEXTURE_SIZE, ...)
但如何使用 Metal 做到这一点?
目前没有 API 检索 Metal 设备的最大纹理尺寸。您应该查阅 Metal Feature Set Tables 以获取此信息并将其包含在您的应用程序中。
对于 A9 和更新的 GPU 运行 当前版本 iOS/tvOS/iPadOS,2D 纹理的最大尺寸为 16384×16384。
正如@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;
}
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