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

时间:2015-08-06 07:45:39

标签: android opengl-es

我即将发布一个壁纸应用程序,它将使用用户自己的图像...这可能是2大小的非权力。我的Nexus 2013标签和Open GL ES 1.1中的Moto X 2013似乎支持所有尺寸的纹理。

我的问题是:

  1. OpenGL ES 1.1在某些设备/ Android版本中是否有电源或两个限制?
  2. 如果有限制,我可以以某种方式覆盖它以选择任何尺寸的纹理吗?
  3. 感谢。

3 个答案:

答案 0 :(得分:0)

  

OpenGL ES 1.1在某些方面是否具有功率或两个限制   设备/ Android版本?

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

  

如果有限制,我可以选择以某种方式超越它   任何尺寸的纹理

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

编辑

尝试see here

可能会有某种解决方法

答案 1 :(得分:0)

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

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

编辑:

以下是一些不使用两种纹理功能的设备报告示例:Galaxy PlayerOuya

Here是某些设备的GL扩展名列表。没有GL_OES_texture_npot或GL_ARB_texture_non_power_of_two扩展名的那些不应该使用两个纹理的非幂。

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

答案 2 :(得分:0)

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

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

让我们说你的原始图片是300x500。此纹理最接近的Po2尺寸为512x512。我们采用原始的300x500位图,并将其绘制在512x512位图上并从中创建纹理。我们在创建较大的位图时不进行缩放,因此较大的位图似乎在右侧和底部都有空白边。

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

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

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

现在我们想要"技巧"系统不渲染整个纹理,因为任何大于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纹理中。

希望这有帮助。