Memory OpenGL:纹理大小和视频内存

Memory OpenGL:纹理大小和视频内存,memory,opengl,graphics,textures,procedural-generation,Memory,Opengl,Graphics,Textures,Procedural Generation,我正在使用OpenGL制作一个蠕虫风格的位图可破坏地形游戏。我想知道世界的大小对视频存储的限制在哪里 目前,我对地形使用512*512 RGBA纹理块 这样的512*512 RGBA纹理大概能占用多少内存 是否有任何内部自动压缩正在进行 我能期望大多数用户的计算机有多少视频内存 使用32 bpp(4字节)可以获得4*512*512=1 MB 请参阅有关纹理压缩的内容:使用32 bpp(4个字节)可以获得4*512*512=1 MB 关于纹理压缩,请看以下内容:我不太担心这一点。即使使用8192

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

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

  • 这样的512*512 RGBA纹理大概能占用多少内存
  • 是否有任何内部自动压缩正在进行
  • 我能期望大多数用户的计算机有多少视频内存
使用32 bpp(4字节)可以获得4*512*512=1 MB

请参阅有关纹理压缩的内容:

使用32 bpp(4个字节)可以获得4*512*512=1 MB


关于纹理压缩,请看以下内容:

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

较旧的GPU可能会限制每个纹理的大小,但既然你已经将你的世界分割成512x512块,那就不会有问题了


如果视频内存出现问题,您可以允许用户使用一半大小的纹理(即,将世界采样减少到4096*1024和256x256个裂缝),并根据需要获取新的/丢弃未使用的区域。

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

较旧的GPU可能会限制每个纹理的大小,但既然你已经将你的世界分割成512x512块,那就不会有问题了

如果视频内存出现问题,您可以允许用户使用一半大小的纹理(即,将世界采样减少到4096*1024和256x256个裂缝),并根据需要获取新的/丢弃未使用的区域

这样的512*512 RGBA纹理大概能占用多少内存

没有足够的信息。应始终使用大小(GL_RGBA8、GL_RGBA16)

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

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

没有

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

你现在用了多少

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

但老实说,你的小虫子游戏实际上不会在内存大小方面花费任何东西。完成后最多64MB。这没什么你需要担心的

这样的512*512 RGBA纹理大概能占用多少内存

没有足够的信息。应始终使用大小(GL_RGBA8、GL_RGBA16)

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

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

没有

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

你现在用了多少

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


但老实说,你的小虫子游戏实际上不会在内存大小方面花费任何东西。完成后最多64MB。这不需要你担心。

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

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

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

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

否,RGBA中的512x512纹理(每个通道一个字节)将导致4x512x512=1MBappr.4*512*512*1.33,带有mipmapsy您肯定意味着32 bpp(或8-bpc)。否,RGBA中的512x512纹理(每个通道一个字节)将导致4x512x512=1MBappr.4*512*512*1.33和mipmaps您肯定是指32 bpp(或8 bpc)。内存需求很大程度上取决于..您需要选择一条公平线(即64Mb)并尝试适应它。内存需求很大程度上取决于..您需要选择一条公平线(即64Mb)并尝试适应它。