【问题标题】:OpenGL ES 1.1 - texture support (Power of two)OpenGL ES 1.1 - 纹理支持(二的幂)
【发布时间】:2015-08-06 07:45:38
【问题描述】:

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

我的问题是:

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

【问题讨论】:

    标签: android opengl-es opengl-es-2.0 opengl-es-1.1


    【解决方案1】:

    OpenGL ES 1.1 在某些方面是否有电源或两个限制? 设备/安卓版本?

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

    如果有限制,我可以以某种方式覆盖它以选择 任何大小的纹理

    如果不能,请将您的 Opengl 配置文件更改为 ES 2,然后您必须将纹理转换为 2 one 的 pow

    编辑

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

    【讨论】:

    • 完美的回应,我绝对没有什么可问的了!
    【解决方案2】:

    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 扩展的那些不应该与非两个纹理的幂一起工作。

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

    【讨论】:

      【解决方案3】:

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

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

      假设您的原始图片为 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 指出的那样,您可以使用此方法创建 1 个包含您需要的所有其他纹理的大纹理,然后使用纹理坐标映射仅从该纹理中提取您想要的部分。这将允许您优化纹理,而不仅仅是浪费 PO2 纹理中的“空白空间”。

      希望这会有所帮助。

      【讨论】:

      • 您是否有数据表明 POT 纹理在任何甚至中等新的硬件上都更快?
      • 我会详细说明 - 留在 POT 通常更安全,并且可以避免意外行为和不必要的计算,从而提高性能。问题来自于 mipmap 计算,对于每个级别,每个维度将前一个级别的大小减少一半。对于 POT 纹理,这很容易,但对于 NPOT 纹理,这需要额外的计算。 GL_LINEAR_MIPMAP_NEAREST 计算量低,但结果可能很差,GL_LINEAR_MIPMAP_NLINEAR 执行平均测试,这会花费计算时间。参考:opengl.org/wiki/NPOT_Texture
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-04
      相关资源
      最近更新 更多