如何以编程方式获取纹理的最大尺寸(宽度和高度)

5

如何在Metal中编程获取最大纹理尺寸(宽度和高度)?使用OpenGL,我可以这样做:glGetIntegerv(GL_MAX_TEXTURE_SIZE, ...) ,但是在Metal中该怎么做呢?


@trojanfoe 当然可以,你为什么说我从不接受答案? - zeus
1
因为查看了您的个人资料,我发现您最近的10个问题都没有被接受。 - trojanfoe
你应该真的把被接受的答案切换到@codeTiger,他是那个以编程方式告诉你如何做到完全符合你要求的人。 - David H
1
@DavidH 完成了 :) 我忘记了。 - zeus
3个回答

6

目前没有用于检索Metal设备最大纹理尺寸的API。您应该查阅Metal功能表以获取此信息,并在您的应用程序中包含它。

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


3

iOS 13中有一个新的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。

3
正如 @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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接