2

在纹理的opengl(更具体地说是webgl)上,jpeg和png之间的哪种格式会被推荐在运行时渲染时更有效?我知道 jpeg 可以比 PNG 小,但也许解码成本更高,或者其他。

4

3 回答 3

6

好吧,解码 JPEG 的速度非常快,您需要使用数千(或数百个,如果您在移动设备上)高分辨率 JPEG 才能看到对性能的重大影响。由于您的平台是网络,我会推荐 JPEG,这取决于您拥有的纹理类型,它将是所有浏览器都支持的最尺寸/质量效率最高的格式(webp 是一个很好但支持不充分的替代方案)。

如果您的纹理更像图形或卡通,这意味着它们有很多锐利和精细的边缘以及很多单色区域,我会推荐 PNG,如果使用中高 JPEG 压缩,坚硬和精细的边缘会变得非常脏。

PNG进行无损压缩。特别是对于类似卡通的内容(意味着与照片相比颜色和细节很少),您将获得与压缩良好的 JPEG 相似的大小,但具有更好的视觉效果,在某些情况下甚至更好的压缩。

于 2012-05-27T22:53:45.510 回答
6

保罗的回答在文件大小和解码方面是正确的,但它并没有真正回答你提出的问题。

jpeg 和 png 之间的哪种格式会被推荐在运行时渲染时更有效?

由于问题是在渲染过程中哪个更有效,所以答案会有所变化。JPEG 和 PNG 都作为未压缩的 RGB/A 数据上传到 GPU,因此两者的渲染特性完全相同。我还做了一些测试,表明两者的上传速度实际上是相同的。因此,您的选择应该与渲染性能无关,而是哪种格式具有您需要的特征。(有损/无损、Alpha 通道等)

于 2012-05-28T04:08:53.913 回答
1

每种格式都有不同的用途。

JPEG:小,有损。仅 RGB

PNG:无损、4 通道 (RGBA)

一般来说,您可能应该尽可能使用 JPEG,因为您可以使它们变得非常小。简单的颜色纹理非常适合 JPEG。

PNG虽然有多种用途

  1. 您希望在 RGB 颜色之上有一个 Alpha 通道。

    您目前只能使用 PNG 执行此操作

  2. 你需要无损压缩

    如果您正在制作字体或其他类似矢量或 8 位像素的艺术,您可能想要使用 PNG

  3. 您想要的不是颜色数据。例如法线贴图、高度贴图、反射贴图、不透明度贴图、光照贴图或同一纹理中这些的组合。

    虽然您可以使用 JPEG 完成其中一些操作,但 JPEG 是为人类查看的图像而设计的。这意味着它的压缩是专门围绕人眼可以看到的东西和他们看不到的东西而设计的。例如,JPEG 压缩颜色多于亮度。我猜它也比绿色压缩红色更多。所以JPEG一般不擅长压缩非视觉数据

    因此,在这些情况下,您可能想要使用 PNG。

注意:您还可以选择使用 ArrayBuffer 将数据直接加载到 WebGL 纹理中。您可以使用 XMLHttpRequest 直接下载 ArrayBuffers。这意味着您可以创建自己的格式或使用可能比 JPEG 或 PNG 更适合您需要的其他格式。

一个例子是紧缩

于 2012-05-28T06:22:43.823 回答