在 OpenGL 纹理中使用四个以上的组件
Use more than four components in OpenGL texture
我知道内置的纹理组件不可能超过四个。至少直接。通常,建议的解决方案很简单——使用多个纹理。但是,我认为这不是最佳的。让我们看一个例子。
假设有一个具有以下属性的基本 material 格式:
- 反照率 - 3 个分量
- 正常 - 3 个分量
- 粗糙度 - 1 个分量
- 金属度 - 1 个分量
存储此数据的最简单方法是使用分别具有 3、3、1 和 1 个组件的 4 个不同纹理。这至少有两个原因是低效的:
- 很可能 GPU 实际上并没有存储只有 3 个分量的前两个纹理,而是四个分量,因为大多数 GPU 将 3 个分量向量、矩阵、纹理对齐到四个分量。
- 获取着色器中的所有数据需要4个纹理样本
处理此问题的常用方法是,如果纹理可能也很好地对齐,则以最少的数量打包数据。在这种情况下,它可以放在两个纹理中,每个纹理有 4 个组件。这解决了第一个浪费内存的问题,但第二个问题仍然存在,因为它仍然需要做 2 个纹理样本来读取数据。 2个样本不是很多,但如果可以减少到一个呢?
我的想法是将所有 6 个组件打包到一个纹理中。如何? GL_RGB16_SNORM
。这是一种纹理内部格式,虽然只有 3 个组件,但实际上可以容纳 6 个,因为每个像素是 6 个字节。
所以我的问题是:
- 是否可以将数据作为 6 个分量上传到这样的纹理并以某种方式在着色器中读取它。
- 使用这种包装会更快还是坚持使用两个单独的纹理。
- 是否有更好的不同方法?
在其他图层的相同 (u,v) 位置使用 array texture & 采样来检索额外的纹理通道数据。
我知道内置的纹理组件不可能超过四个。至少直接。通常,建议的解决方案很简单——使用多个纹理。但是,我认为这不是最佳的。让我们看一个例子。
假设有一个具有以下属性的基本 material 格式:
- 反照率 - 3 个分量
- 正常 - 3 个分量
- 粗糙度 - 1 个分量
- 金属度 - 1 个分量
存储此数据的最简单方法是使用分别具有 3、3、1 和 1 个组件的 4 个不同纹理。这至少有两个原因是低效的:
- 很可能 GPU 实际上并没有存储只有 3 个分量的前两个纹理,而是四个分量,因为大多数 GPU 将 3 个分量向量、矩阵、纹理对齐到四个分量。
- 获取着色器中的所有数据需要4个纹理样本
处理此问题的常用方法是,如果纹理可能也很好地对齐,则以最少的数量打包数据。在这种情况下,它可以放在两个纹理中,每个纹理有 4 个组件。这解决了第一个浪费内存的问题,但第二个问题仍然存在,因为它仍然需要做 2 个纹理样本来读取数据。 2个样本不是很多,但如果可以减少到一个呢?
我的想法是将所有 6 个组件打包到一个纹理中。如何? GL_RGB16_SNORM
。这是一种纹理内部格式,虽然只有 3 个组件,但实际上可以容纳 6 个,因为每个像素是 6 个字节。
所以我的问题是:
- 是否可以将数据作为 6 个分量上传到这样的纹理并以某种方式在着色器中读取它。
- 使用这种包装会更快还是坚持使用两个单独的纹理。
- 是否有更好的不同方法?
在其他图层的相同 (u,v) 位置使用 array texture & 采样来检索额外的纹理通道数据。