我正在使用像这样的纹理缓冲区对象:
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)在我的计算着色器中读取它,但是如何更新此值?
谢谢你! 路易斯答案 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/memoryBarrierImage
和coherent
限定符。
还值得一提的是SSBOs(有什么区别?here& here)。
Transform feedback也可以直接从顶点着色器输出写入缓冲对象,从几何着色器执行流压缩,但这不适用于您的计算着色器。