跳转至

OpenGL缓存纹理(Texture Buffer)

缓存纹理

OpenGL缓存纹理(Texture Buffer)是一种用于高效存储大量数据的技术。它允许将一个缓存对象作为纹理,这个缓存对象可以存储大量的数据。通过这种方式,可以使用纹理采样器来读取这些数据,而无需使用传统的缓存读写操作。

优势

  • 最大的好处就是它可以在着色器程序中高效地访问大量数据

特点

  • 一维纹理的尺寸受限于 GL_MAX_TEXTURE_SIZE 对应的最大值,但是缓存纹理的尺寸受限于 GL_MAX_TEXTURE_BUFFER_SIZE 的值,通常能达到 2GB 甚至更多。
  • 一维纹理支持滤波、mipmap、纹理坐标的截取,以及其他的一些采样器参数,但是缓存纹理不行
  • 一维纹理的纹理坐标是归一化的浮点数值,但是缓存纹理使用的是没有归一化的整数纹理坐标
  • 在GPU中,一维纹理的像素还是RGBA四个通道。如果你只传R,就会多出GBA三个多余空间

GLSL

在GLSL中,与缓存纹理相关的类型主要包括以下三种:

  1. samplerBuffer:用于从纹理缓冲区中获取浮点型(float)像素值。
  2. usamplerBuffer:用于从纹理缓冲区中获取无符号整数(unsigned int)像素值。
  3. isamplerBuffer:用于从纹理缓冲区中获取有符号整数(int)像素值。

在使用过程中,需要先通过textureSize()函数获取纹理缓冲区的尺寸,然后使用texture()函数或者texelFetch()函数来进行采样操作。其中

  1. texture()函数用于对缓冲区进行插值采样
  2. texelFetch()函数则直接从缓冲区中取出像素值,不进行插值处理

应用

  1. 实例化渲染
  2. GPU矢量纹理(可参考:计算机图形学 > 渲染概述 > 文字渲染 > GPU矢量渲染下的文章)

参考链接

  1. OpenGL - TBO (Texture Buffer Object) - 缓存纹理 - Instancing Using TBO 前置篇_tbo opengl_Jave.Lin的博客-CSDN博客