我即将发布一个壁纸应用程序,它将使用用户自己的图像...这可能是2大小的非权力。我的Nexus 2013标签和Open GL ES 1.1中的Moto X 2013似乎支持所有尺寸的纹理。
我的问题是:
感谢。
答案 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 Player,Ouya。
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纹理中。
希望这有帮助。