2015-02-24 82 views
1

我使用这样的纹理缓冲对象:如何写入纹理缓冲区对象?

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,指数)我的计算着色器里面,但我怎么能更新该值?

谢谢! luiz

+0

为什么要这么做首先呢?如果您使用计算着色器,请改用'imageLoad'和'imageStore'。这几乎是您要从计算着色器写入纹理的唯一方法。如果你这样做的话,你将不得不考虑内存一致性,但是在计算着色器的某个时刻你必须处理这个问题。 – 2015-02-25 09:39:12

回答

4

将它绑定为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也可直接写为缓冲从顶点着色器的输出对象从几何着色器进行流压缩,但这并不适用于您的计算着色器。