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



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

我的问题是:
    OpenGL ES 1.1在某些设备/android版本中有功率或两个限制吗?
  1. 如果有限制,我能以某种方式超越它来选择任何大小的纹理吗?

OpenGL ES 1.1在某些方面是否有两个限制设备/android版本吗?

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

如果存在限制,我是否可以以某种方式超越它来选择任意大小的纹理

要么改变你的Opengl配置文件为es2,如果你不能,那么你必须将你的纹理转换为2/1

编辑

有一些变通方法可以尝试看看这里

OpenGL ES 1.1不支持非双功率纹理。像GL_OES_texture_npot这样的扩展添加了支持,但可能对纹理包装有限制。OpenGL ES 2.0确实支持npot纹理,但仍然只支持GL_CLAMP_TO_EDGE包装,因此纹理重复可能无法使用npot纹理。

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

编辑:

这里有几个报告的例子,设备不工作的两种纹理:银河播放器,Ouya。

这里是一些设备的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表示纹理的"开始"边缘,而每个坐标中的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指出的那样,你可以使用这种方法创建一个包含你需要的所有其他纹理的大纹理,然后使用纹理坐标映射只从该纹理中提取你想要的部分。这将允许你优化你的纹理,而不是浪费PO2纹理中的"空白空间"。

相关内容

  • 没有找到相关文章

最新更新