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 似乎支持所有大小的纹理。
我的问题是:
- OpenGL ES 1.1 在某些 devices/android 版本中是否有功率或两个限制?
- 如果有限制,我可以以某种方式覆盖它以选择任何大小的纹理吗?
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"。
希望对您有所帮助。
我即将发布一个壁纸应用程序,它将使用用户自己的图像...可能不是 2 大小的幂。我的 Nexus 2013 选项卡和 Open GL ES 1.1 中的 Moto X 2013 似乎支持所有大小的纹理。
我的问题是:
- OpenGL ES 1.1 在某些 devices/android 版本中是否有功率或两个限制?
- 如果有限制,我可以以某种方式覆盖它以选择任何大小的纹理吗?
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"。
希望对您有所帮助。