Texture Buffer Object(TBO),是这一种特殊的一维纹理。需要和缓存对象关联使用,在着色器中可以访问缓冲对象管理的内存数据。
初始化
//***********************************************************
//FUNCTION::
void CTBOApp::__createTexturetBufferObject()
{
glm::vec3 TBOData[3] = {glm::vec3(1.0, 0.0, 0.0), glm::vec3(0.0, 1.0, 0.0), glm::vec3(0.0, 0.0, 1.0)};
glGenBuffers(1, &m_TextureBuffer);
glBindBuffer(GL_TEXTURE_BUFFER, m_TextureBuffer);
glBufferData(GL_TEXTURE_BUFFER, sizeof(TBOData), TBOData, GL_STATIC_DRAW);
glBindBuffer(GL_TEXTURE_BUFFER, 0);
glGenTextures(1, &m_Texture);
glBindTexture(GL_TEXTURE_BUFFER, m_Texture);
glTexBuffer(GL_TEXTURE_BUFFER, GL_R32F, m_TextureBuffer);//buffer缓存对象关联到激活的纹理单元target的缓存纹理。
glBindTexture(GL_TEXTURE_BUFFER, 0);
}
首先是生成缓存对象,其次是生成缓存纹理,并且绑定到前面上次的缓存对象上。这样就可以通过缓存纹理访问缓存对象里存储的数据。
Fragment Shader
#version 450 core
layout (location = 0) out vec4 FragColor;
uniform samplerBuffer uTBOTex;
void main()
{
int offset = 0;
float R = texelFetch(uTBOTex, offset + 0).r;
float G = texelFetch(uTBOTex, offset + 4).r;
float B = texelFetch(uTBOTex, offset + 8).r;
FragColor = vec4(R, G, B, 1.0);
}
注意vec4 texelFectch(samplerBuffer s, int coord);
绑定到s的纹理中查询纹理坐标coord的一个纹素。缓存纹理使用的是未归一化的整数纹理坐标。
参考资料
【1】https://www.opengl.org/wiki/Buffer_Texture
【2】https://gist.github.com/roxlu/5090067