【问题标题】:OpenGL: Texture size and video memoryOpenGL:纹理大小和显存
【发布时间】:2013-05-07 20:26:09
【问题描述】:

我正在使用 OpenGL 制作蠕虫风格的位图可破坏地形游戏。我想知道对于世界的大小,视频内存的限制在哪里。

目前,我为地形使用 512*512 RGBA 纹理块。

  • 非常粗略地说,我可以期望这样一个 512*512 RGBA 纹理占用多少内存?
  • 是否正在进行任何内部自动压缩?
  • 我可以预计大多数用户的计算机有多少可用的视频内存?

【问题讨论】:

    标签: memory opengl graphics textures procedural-generation


    【解决方案1】:

    非常粗略地说,我可以期望这样一个 512*512 RGBA 纹理占用多少内存?

    信息不足。您应该始终使用大小为 OpenGL image formats(GL_RGBA8、GL_RGBA16)。

    GL_RGBA8 每个像素占用 32 位,即 4 字节。因此,512*512*4 = 1MB。

    是否正在进行任何内部自动压缩?

    没有。

    我可以期望大多数用户的计算机有多少可用的视频内存?

    您目前使用多少?

    OpenGL 将根据可用空间将图像数据分页进出。如果 GPU 内存用完,OpenGL 会很乐意分配系统内存并根据需要上传图像。

    但老实说,您的小蠕虫游戏实际上不会在内存大小方面花费任何成本。完成后可能有 64MB,最高。无需担心。

    【讨论】:

    • 内存需求很大程度上取决于..您需要选择一个公平的线路(即64Mb)并尝试适应它。
    【解决方案2】:

    我不会太担心这个。即使有 8192*2048 的世界(4 屏幕宽和 2 屏幕高,这对于蠕虫风格的游戏来说非常大),您也只需要 8*2*4=64Mb(添加 mipmap、其他纹理、帧缓冲区)您应该适合 128MB界限。据我所知,即使是较旧的 GPU 也具有这种内存(我们不谈论 GeForce4 卡,对吧?)。

    较旧的 GPU 可能对每个纹理的大小有限制,但由于您已经将您的世界分割成 512x512 块,所以这不是问题。

    如果视频内存成为问题,您可以允许用户使用一半大小的纹理(即将世界缩小到 4096*1024 和 256x256 缝隙)并按需获取新的/丢弃未使用的区域。

    【讨论】:

      【解决方案3】:

      使用 32-bpp(4 字节),您将获得 4*512*512 = 1 MB

      有关纹理压缩的信息请参见:http://www.oldunreal.com/editing/s3tc/ARB_texture_compression.pdf

      【讨论】:

      • 不,RGBA 中的 512x512 纹理(每个通道一个字节)将导致 4x512x512 = 1MB
      • 大约。 4*512*512*1.33 带 MIPMAPS
      • 您的意思肯定是 32-bpp(或 8-bpc)。
      【解决方案4】:

      同样,这取决于你的引擎,但如果我是你,我会这样做:

      由于您的地形纹理可能会重复使用一些类似马赛克的纹理,并且您需要知道像素是否存在或已被破坏,那么鉴于您使用的马赛克纹理不大于 256x256,您绝对可以使用 GL_RG16内部格式(其中每个组件都是您需要从 [0, 255] -> [0.0, 1.0] 映射的纹理坐标,并且您将保留一些特殊值以指示地形已被破坏)用于地形纹理,使每个 512x512 块占用 0.5MB。 虽然添加一个额外的字节来指示地形的存在是很容易的,但是 3 字节的格式不会缓存得很好

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-11
        • 2019-02-17
        • 1970-01-01
        • 1970-01-01
        • 2013-12-09
        相关资源
        最近更新 更多