【问题标题】:Questions about OpenGL ES 2关于 OpenGL ES 2 的问题
【发布时间】:2014-12-20 03:41:32
【问题描述】:

我有几个问题主要是关于我的 2D Android 游戏的 OpenGL ES 纹理。

  1. 我知道我可以使用的最少纹理单元数是多少?该游戏需要 Android 2.3.3 及更高版本,因此,我认为 Adreno 200 将是完成这项工作的最古老的 GPU。假设较新的有更多的纹理单元,问题转化为“Adreno 200 有多少纹理单元?”

  2. 纹理可以有多大?用于我的位图的“安全”尺寸(以像素为单位)是多少?当然,由于 OpenGL ES 以压缩格式保存纹理,可能是 1000x1000 的纹理填充,比方说,与 1000x1000 的海底图片相比,蓝色将非常小,但平均而言,你认为什么尺寸“安全”使用”?我知道当我测试我的应用程序时,我会发现我是否使用了太多内存,但我不想白做工作。

  3. 纹理/vbos/others 是否存储在 RAM 中?在 PC 专用显卡上,我知道它不会,但据我所知,手机(至少是低端手机)使用 RAM 来存储 GPU 的主要资源。我是不是错了?

  4. 在对象不会调整太多和/或太频繁的 2D 游戏中使用 mip 映射是好还是坏?

【问题讨论】:

    标签: android opengl-es


    【解决方案1】:

    来自the spec

    1. 第 154 页,表 6.20,GL_MAX_TEXTURE_IMAGE_UNITS,最小 8
    2. 第 152 页,表 6.18,GL_MAX_TEXTURE_SIZE,最少 64
    3. 可能是。这不受规范的限制。

    【讨论】:

    • 谢谢!所以,至少 8 个纹理单元,我想这已经很不错了。但是 GL_MAX_TEXTURE_SIZE 的 64 是什么意思?并且,在问题 #3 中,我询问了低/旧手机在实践中会发生什么。由于规范没有限制它,我猜纹理实际上存储在 RAM 上? :)
    • 这意味着符合 ES 2.0 的实现必须支持至少 64x64 大的纹理。大多数将支持 1024-2048 范围内的东西。他们可以,在 API 的限制范围内无法判断。
    【解决方案2】:
    1. Adreno 200 有 4 个用于顶点着色器的纹理单元和 16 个用于片段着色器的纹理单元。 More details.

    2. Adreno 200 的最大纹理尺寸为 2048x2048。

    3. AFAIK,Adreno 200 使用共享内存架构和主内存。

    4. 使用 mipmap 意味着您需要多 1.3 倍的内存来存储纹理像素。

    【讨论】:

      【解决方案3】:

      对于问题 4:在缩小纹理时使用 Mipmap,因此很可能您在常规 2D 游戏中对它们没有任何用处。对于其他问题,我没有任何好的答案。

      【讨论】:

      • 是的,但我也会缩小纹理,即使是 2D 游戏。我会让它们像原版的 80%,而不是更少。根据您的经验,如果我不使用 mipmap,在这种情况下图像会看起来很糟糕吗?如果它看起来确实很糟糕,那么是否值得将 mipmap 用于这么少的东西或者缺点太大(比如需要更多内存)?
      • 通常,据我所知,当位图缩小很多时会使用mipmaps。 IIRC,默认的“第一”级别具有原始大小的 50% 的位图,第二个具有 25% 大小的位图,依此类推。所以,我认为,如果你缩放到原来的 80%,你就不需要 mipmap。但是,是的,如果你有大量的缩减,你可能想要生成 mipmap。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-16
      • 1970-01-01
      • 1970-01-01
      • 2010-11-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多