我应该始终对 OpenGL 中的所有纹理使用 GL_ARGB 格式吗?
Posted
技术标签:
【中文标题】我应该始终对 OpenGL 中的所有纹理使用 GL_ARGB 格式吗?【英文标题】:Should i always use GL_ARGB format for all textures in OpenGL? 【发布时间】:2010-06-20 16:48:49 【问题描述】:这已经困扰了我一段时间......而且真的很难真正看到性能上的任何差异,所以我在这里问:
如果我的图像不使用 alpha 通道,我应该使用 'GL_RGB' 将它们保存在 GFX 卡内存中,还是使用 'GL_ARGB',因为它是完整的 32 位块,处理速度会更快?
或者 GFX 卡是否会自动将 24 位图像转换为 32 位图像以提高渲染时间?
编辑:我没有性能问题,但我只想做到最好!我还想确保程序在不需要像新卡一样优化的旧显卡上呈现良好。
【问题讨论】:
【参考方案1】:选择适合您的纹理数据的格式,让显卡驱动程序担心细节。不要试图超越它。 OpenGL 实现经过了很好的优化,将为您做出所有必要的决定以获得最佳性能,无论这意味着将所有纹理转换为 32bpp 还是其他一些内部格式。
如果您发现自己遇到性能问题,请使用gDEBugger 之类的工具来解决您的性能瓶颈。您的纹理格式不太可能成为这样的瓶颈。
编辑:如果问题仅仅是内存压力,那么你有太多太大的纹理。就那么简单。使用压缩、使用质量较低(每个通道的位数更少)的纹理,或者使用更小的纹理。
【讨论】:
好吧,我问这个的原因是我的内存会用完,而且我的大部分纹理甚至都不使用 Alpha 通道。 使纹理更小。当您知道有足够的视频内存可用时使用较大的版本,而对于较小的卡使用较小的版本。您可以做的另一件事是启用压缩以进行小的质量折衷。 这不是我在这里要问的...如果我可以放弃 Alpha 通道,为什么我要让纹理质量更差?所以我问如果我使用 RGB 而不是 ARGB 我会遇到性能问题...阅读我的编辑 如果您有内存问题,我建议您使用 RGB 格式。正如上面的 grayfade 所写,OpenGL 会进行必要的优化。 实际上,根据驱动程序/卡的不同,通常有一种特定的纹理格式比所有其他纹理格式执行得更快,因为驱动程序不需要混合。至少对于我的 NVIDIA GT240 和 Windows 7,GL_RGBA8 的 internalFormat、GL_RGBA 的纹理格式和 GL_UNSIGNED_INT_8_8_8_8_REV 的类型是迄今为止最快的。在 Linux 上使用 NVIDIA NVS300,我发现 GL_BGRA 是更快的纹理格式。 Here 是一个人的基准,你搜索一下还有其他的。【参考方案2】:如果您关心内存使用情况,请尝试纹理压缩:
ARB_texture_compression ARB_texture_compression_rgtc ARB_texture_compression_bptc EXT_texture_compression_s3tc EXT_texture_compression_dxt1 EXT_texture_compression_latc EXT_texture_compression_rgtc很难给出使用哪一个的一般建议。尝试适用于您的纹理格式的那些(RGB 纹理不适用于 RG 压缩),并仔细查看生成的视觉质量。
【讨论】:
还值得注意的是,压缩纹理会消耗更少的上传到卡的带宽,然后在用于渲染时使用更少的带宽。总的来说,它们是比 ARGB 或 RGB 更好的选择,前提是它们不会把图像弄得太乱! 好吧,我的图片已经是低分辨率了,我不想把它们搞砸 如果硬件擅长解压缩,它们不太可能产生太大的影响。以上是关于我应该始终对 OpenGL 中的所有纹理使用 GL_ARGB 格式吗?的主要内容,如果未能解决你的问题,请参考以下文章
我应该使用哪种 OpenGL ES 纹理格式来在 iPad 上获得更好的动态范围?
Visual Studio 2015 中 OpenGL 4 实现中的纹理单元数 (GL_TEXTUREi)
手把手教会OpenGL之纹理贴图包含纹理载入纹理过滤边界处理纹理参数设置(入门级别案例,棋盘)