Texture Buffer Object

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

阅读更多
个人分类: OpenGL GLSL
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭