如何写入纹理缓冲区对象?

时间:2015-02-24 19:42:51

标签: image load glsl

我正在使用像这样的纹理缓冲区对象:

glGenBuffers(1, &tbo);
glBindBuffer(GL_TEXTURE_BUFFER, tbo);
glBufferData(GL_TEXTURE_BUFFER, maxSize*sizeof(float), faceNormals.data(), GL_STATIC_DRAW);
glGenTextures(1, &tbo_tex);
glBindBuffer(GL_TEXTURE_BUFFER, 0);

我可以使用texelFetch(u_tbo_tex,index)在我的计算着色器中读取它,但是如何更新此值?

谢谢你! 路易斯

1 个答案:

答案 0 :(得分:5)

将其绑定为samplerBuffer,因为我假设您正在为texelFetch()执行操作,这将为您提供只读访问权限。不确定这个缓存是否更好,但imo可能比imageLoad()快一点。

要从计算着色器写入纹理缓冲区,请使用image_load_store

  • 在着色器中声明图像,例如:

    layout(rgba32f) uniform imageBuffer mybuffer;
    
  • 绑定纹理对象(包装缓冲区对象):

    void glBindImageTexture(GLuint unit,
        GLuint texture,
        GLint level,
        GLboolean layered,
        GLint layer,
        GLenum access,
        GLenum format);
    

    unit可以是任何东西,但当然必须是唯一的。必须将均匀值设置为此索引。即glUniform1i(mybufferlocation, unit)(或layout()中的硬编码,但我从未这样做过。)

  • 然后你可以......

    imageStore(mybuffer, atsomeindex, vec4(123.0));
    
  • 确保在写入/读取的着色器通道之间使用glMemoryBarrier(GL_SHADER_IMAGE_ACCESS_BARRIER_BIT)。此外,如果着色器调用中存在竞争条件的可能性,请查看memoryBarrier/memoryBarrierImagecoherent限定符。

还值得一提的是SSBOs(有什么区别?here& here)。

Transform feedback也可以直接从顶点着色器输出写入缓冲对象,从几何着色器执行流压缩,但这不适用于您的计算着色器。