OpenGL ES 1.1 - 纹理支持(2 的幂)

OpenGL ES 1.1 - texture support (Power of two)

我即将发布一个壁纸应用程序,它将使用用户自己的图像...可能不是 2 大小的幂。我的 Nexus 2013 选项卡和 Open GL ES 1.1 中的 Moto X 2013 似乎支持所有大小的纹理。

我的问题是:

  1. OpenGL ES 1.1 在某些 devices/android 版本中是否有功率或两个限制?
  2. 如果有限制,我可以以某种方式覆盖它以选择任何大小的纹理吗?

Does the OpenGL ES 1.1 have power or two limitation in some devices/android versions?

NO ES 1.x 不支持非 pow 2 纹理,它在 ES 2 中开始支持它

If there is a limitation, can I over-ride it somehow to choose textures of any size

要么将你的 Opengl 配置文件更改为 ES 2,如果你不能,那么你必须将你的纹理转换为 2 one 的 pow

编辑

也许可以尝试一些解决方法 see here

OpenGL ES 1.1 不支持非二次纹理。有像 GL_OES_texture_npot 这样的扩展添加了支持,但可能对纹理环绕有限制。 OpenGL ES 2.0 确实支持 npot 纹理,但仍然只支持 GL_CLAMP_TO_EDGE 包装,因此纹理重复可能不适用于 npot 纹理。

通常避免纹理大小限制的最佳选择是使用纹理图集,即内部包含两个纹理的多个非幂次方的大二次方纹理。

编辑:

以下是设备无法使用非两个纹理的幂的报告的几个示例:Galaxy Player, Ouya

Here 是一些设备的 GL 扩展列表。没有 GL_OES_texture_npot 或 GL_ARB_texture_non_power_of_two 扩展的那些不应该与非两个纹理的幂一起工作。

纹理图集的替代方法是用黑色填充纹理到最接近的二维次方,但这会浪费纹理内存。您可以将纹理存储在二维的非幂中,并以编程方式进行填充。

即使使用 OpenGL-ES 2.0,我也不会依赖对 NPOT 纹理的支持。两个纹理的力量,即使它们不是强制性的,出于性能原因总是更好。

要解决这个问题,请尝试正确使用纹理坐标。例如:

假设您的原始图片为 300x500。此纹理最接近的 Po2 大小是 512x512。我们采用原始的 300x500 位图,将其绘制在 512x512 位图上,并从中创建纹理。我们在创建较大的位图时没有缩放,因此较大的位图在右侧和底部会出现空白边缘。

通常,您的纹理坐标(对于平面正方形模型)看起来像这样:

float[] textureCoords = new float[] {
    0, 0,
    1, 0,
    1, 1,
    0, 1
}; 

每个坐标中的 0 表示纹理的 "beginning" 边缘,而每个坐标中的 1 表示纹理的 "end" 边缘。

现在我们希望 "trick" 系统不渲染整个纹理,因为任何大于 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 纹理中浪费 "empty space"。

希望对您有所帮助。