我不会依赖对 NPOT 纹理的支持,即使使用 OpenGL-ES 2.0。两种纹理的幂,即使它们不是强制性的,出于性能原因总是更好。
要解决此问题,请尝试正确使用纹理坐标。例如:
假设您的原始图片为 300x500。此纹理最接近的 Po2 大小为 512x512。我们采用原始的 300x500 位图,并将其绘制在 512x512 位图上并从中创建纹理。我们在创建较大的位图时不进行缩放,因此较大的位图会在右侧和底部出现空白边缘。
通常,您的纹理坐标(对于平面方形模型)如下所示:
float[] textureCoords = new float[] {
0, 0,
1, 0,
1, 1,
0, 1
};
每个坐标中的 0 表示纹理的“开始”边缘,而每个坐标中的 1 表示纹理的“结束”边缘。
现在我们要“欺骗”系统不渲染整个纹理,因为任何大于 300 水平或 500 垂直的像素都是空白的。因此,我们不使用“1”作为最终值,而是使用两个图像的比例:
float w = 300f / 512f;
float h = 500f / 512f;
float[] textureCoords = new float[] {
0, 0,
w, 0,
w, h,
0, h
};
有了这些纹理坐标,只会绘制纹理的相关部分。
正如JanneK 指出的那样,您可以使用此方法创建 1 个包含您需要的所有其他纹理的大纹理,然后使用纹理坐标映射仅从该纹理中提取您想要的部分。这将允许您优化纹理,而不仅仅是浪费 PO2 纹理中的“空白空间”。
希望这会有所帮助。