【发布时间】:2018-08-31 10:18:17
【问题描述】:
如果我使用gl.R32F 和gl.RGB32F,我特别想知道实际分配了多少纹理内存? GPU 会继续为每个像素分配 4 个通道吗?特别是 gl_FragColor 始终是 vec4。
【问题讨论】:
标签: webgl2
如果我使用gl.R32F 和gl.RGB32F,我特别想知道实际分配了多少纹理内存? GPU 会继续为每个像素分配 4 个通道吗?特别是 gl_FragColor 始终是 vec4。
【问题讨论】:
标签: webgl2
纹理占用多少内存是未定义的。这取决于司机。驱动程序可能将 R32F 存储为 RGBA32F,它可能将 RGB8 存储为 RGBA8。它可能有各种限制要求它填充行。例如,假设 16 字节或 128 字节对齐要求,以便 1x10 像素 R8 扩展为 128x10 字节。其他驱动程序可能需要将图像划分为正方形,每个正方形具有最小或固定大小,例如每个正方形需要 16x16 像素,因此 12x10 纹理实际上占用 16x16 空间,而 25x10 纹理占用 32x16 空间。
实际上没有办法确切知道纹理将使用多少空间。我知道有一些司机会做所有这些事情。
来自the spec
internalformat 是一个符号常量,指示 GL 应该以什么格式和最小精度存储这些值
请注意“最小精度”这个短语。
规范中的其他地方
每个纹理组件的内存分配由 GL 分配以匹配或超过表 3.13 - 3.14 中列出的分配。
表 3.13 和 3.14 列出了每个通道的最小大小(以位为单位)。
由驱动程序选择存储东西的实际方式。
例如,我希望大多数桌面 GPU 将 RGB5_A1 存储为 RGBA8,而移动 GPU 实际上可能在硬件本身中支持 RGB5_A1,因此会将其保留为 RGB5_A1。我怀疑每个通道少于 8 位的所有格式都是如此。
【讨论】: