gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 11:34:34 25 4
gpt4 key购买 nike

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

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) 在我的计算着色器中读取它,但是我如何更新这个值?

谢谢!路易斯

最佳答案

将其绑定(bind)为 samplerBuffer,正如我假设您正在为 texelFetch() 所做的那样,将为您提供只读访问权限。不确定这是否缓存更好,但 imo 可能比 imageLoad() 快一点点。

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

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

    layout(rgba32f) uniform imageBuffer mybuffer;
  • 绑定(bind)您的 texture 对象(包装缓冲区对象):

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

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

  • 然后你可以...

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

也值得一提SSBOs (有什么区别?herehere)。

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

关于image - 如何写入纹理缓冲区对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28704818/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com