什么决定了最大纹理尺寸?

Posted

技术标签:

【中文标题】什么决定了最大纹理尺寸?【英文标题】:What Determines Maximum Texture Size? 【发布时间】:2014-09-09 16:36:19 【问题描述】:

我是一名从事手机游戏的 Unity3D 开发人员。最近我们遇到了一个问题,我们所有的纹理都被渲染为黑色方块。经过一些研究,我们发现它与设备支持最大纹理大小有关。有问题的设备(iPhone 4 和较旧的 android 手机)仅支持 2048 x 2048 的最大纹理大小,而较新的设备支持的最大纹理大小为 4096 x 4096。为了解决这个问题,我们将精灵图解压缩为几个较小的2048 x 2048 纹理贴图。

两个问题:

1) 什么决定了特定设备支持的最大纹理大小?是显卡,某种硬件限制吗?或者是 OpenGL ES 支持的版本决定了这一点?

2) 有没有一种简单的方法可以以编程方式找出设备的最大纹理尺寸?如果是这样,您将使用什么 API 或 SDK 来查找信息

【问题讨论】:

这篇文章与您的问题相关:***.com/a/19572916/3256930. 【参考方案1】:

1) 由设备硬件决定,特别是图形芯片 (GPU)。

2) 是的。它是显卡报告的 OpenGL 属性的一部分。试试这个代码 sn-p:

int size;
glGetIntegerv(GL_MAX_TEXTURE_SIZE, &size);

只要您只考虑 ios 设备,这很容易:iPhone 4S 及更新版本和 iPad 2 及更新版本支持 4096x4096 纹理。旧设备仅支持 2048x2048。

iPad 2 是个特例,如果安装的 iOS 版本为 5.0 或更低版本,则只能使用 2048x2048。

【讨论】:

这并不总是可靠的(正如红皮书所解释的),因为它没有考虑内部格式。基本上,由于某些内部格式为每个纹素占用更多空间,因此这只是 GL_LUMINANCE4 等格式的最佳情况指示符。

以上是关于什么决定了最大纹理尺寸?的主要内容,如果未能解决你的问题,请参考以下文章

由于“最大纹理大小”,FabricJS 无法将过滤器应用于大图像

OpenGL-纹理(下)

ps图片缩小有纹理怎么去除

libGDX:FrameBuffer 大小限制 == 最大纹理大小?

生成 GL_INVALID_VALUE 错误。无效的纹理尺寸。立方体贴图纹理 427*240*6 [关闭]

如何使用Three.js获取纹理尺寸