我正在使用 OpenGL 制作蠕虫风格的位图可破坏地形游戏。我想知道视频内存方面的限制对于世界的大小在哪里。
目前,我对地形使用 512*512 RGBA 纹理块。
- 非常粗略地说,我可以期望这样一个 512*512 RGBA 纹理占用多少内存?
- 是否正在进行任何内部自动压缩?
- 我可以期望大多数用户的计算机有多少视频内存可用?
我正在使用 OpenGL 制作蠕虫风格的位图可破坏地形游戏。我想知道视频内存方面的限制对于世界的大小在哪里。
目前,我对地形使用 512*512 RGBA 纹理块。
非常粗略地说,我可以期望这样一个 512*512 RGBA 纹理占用多少内存?
没有足够的信息。您应该始终使用大小合适的OpenGL 图像格式(GL_RGBA 8、 GL_RGBA 16)。
GL_RGBA8 每像素占用 32 位,即 4 字节。因此,512*512*4 = 1MB。
是否正在进行任何内部自动压缩?
不。
我可以期望大多数用户的计算机有多少视频内存可用?
你目前使用多少?
OpenGL 将根据可用空间将图像数据分页进出。如果你的 GPU 内存用完了,OpenGL 会很乐意分配系统内存并根据需要上传图像。
但老实说,你的小蠕虫游戏实际上不会在内存大小方面花费任何成本。完成后可能有 64MB,最高。这不是你需要担心的。
我不会太担心这一点。即使有 8192*2048 的世界(4 屏幕宽和 2 屏幕高,这对于蠕虫风格的游戏来说非常大),您也只需要 8*2*4=64Mb(添加 mipmap、其他纹理、帧缓冲区)您应该适合 128MB界限。据我所知,即使是较旧的 GPU 也具有这种内存(我们不谈论 GeForce4 卡,对吧?)。
较旧的 GPU 可能对每个纹理的大小有限制,但由于您已经将世界分割成 512x512 块,所以这不是问题。
如果视频内存成为问题,您可以允许用户使用一半大小的纹理(即,将世界缩小到 4096*1024 和 256x256 缝隙)并按需获取新的/丢弃未使用的区域。
使用 32-bpp(4 字节),您将获得 4*512*512 = 1 MB
请参阅有关纹理压缩的信息:http ://www.oldunreal.com/editing/s3tc/ARB_texture_compression.pdf
Again, this depends on your engine, but if I were you I would do this:
Since your terrain texture will probably be reusing some mosaic-like textures, and you need to know whether a pixel is present, or destroyed, then given you are using mosaic textures no larger than 256x256 you could definitely get away with an GL_RG16 internal format (where each component would be a texture coordinate that you would need to map from [0, 255] -> [0.0, 1.0] and you would reserve some special value to indicate that the terrain is destroyed) for your terrain texture, making every 512x512 block take up 0.5MB. Although it's temping to add an extra byte to indicate terrain presence, but a 3 byte format wouldn't cache too well