OpenGL / DirectX内部是否将其他纹理格式转换为RGBA格式?

时间:2014-09-15 10:40:33

标签: opengl opengl-es directx

正如标题所说,我有一个RGB565颜色缓冲区的动态纹理(每帧都更新),我不知道哪种方式会有更好的性能:

  1. 使用RGB565格式创建纹理,并在每帧中将RGB565颜色缓冲区上传到GPU。
  2. 使用RGBA8888格式创建纹理,并在上传到GPU之前将RGB565颜色缓冲区转换为RGBA8888。
  3. 我认为如果OpenGL / DirectX在内部将其他格式转换为RGBA8888,那么在上传到GPU之前创建RGBA8888纹理并自行转换数据可能会更快。

3 个答案:

答案 0 :(得分:4)

不知道哪一个更有效率?

对其进行基准测试。

话虽这么说,5-6-5模式这是一个奇怪的原因 - 它恰好是16位。 GPU通常支持硬件中的所有GPU,因此如果存在格式,您可以假定处理它的硬件指令就在那里。

答案 1 :(得分:1)

它还可能取决于您在gpu上的全局工作负载以及gpu特性:将565纹理放在视频内存上并在着色器中从此纹理中读回将占用888对应内存带宽的一半,但是它可能(并且不确定)消耗更多的处理能力。

因此,如果可能的话,在多种配置上对其进行基准测试:)

答案 2 :(得分:1)

我怀疑将RGB565数据转换为RGBA8888会更快。

首先,RGB565是一种使用非常广泛的格式,您的硬件很可能直接支持它。如果精度足以满足您的使用需求,它将使用RGBA8888的一半内存,并且由于内存带宽减少和相应更高的缓存命中率,因此最有可能至少同样有效。

即使硬件不支持它,我仍然不认为自己将其转换为RGBA8888会更有效率。值得花钱的任何驱动程序都会有高度优化的格式转换代码。更重要的是,它可能能够在数据复制过程中应用格式转换,无论如何都可以进行格式转换,这样可以避免与执行转换的代码相比较的一个数据副本。