我正在使用这样的纹理缓冲对象:
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);
Run Code Online (Sandbox Code Playgroud)
我可以使用texelFetch(u_tbo_tex,index)在我的计算着色器中读取它,但是如何更新此值?
谢谢!路易斯
将它绑定为samplerBuffer,因为我认为你正在做的texelFetch()将给你只读访问.不确定这个缓存是否更好,但imo可能比它快一点imageLoad().
要从计算着色器写入纹理缓冲区,请使用image_load_store.
在着色器中声明图像,例如:
layout(rgba32f) uniform imageBuffer mybuffer;
Run Code Online (Sandbox Code Playgroud)绑定纹理对象(包装缓冲区对象):
void glBindImageTexture(GLuint unit,
GLuint texture,
GLint level,
GLboolean layered,
GLint layer,
GLenum access,
GLenum format);
Run Code Online (Sandbox Code Playgroud)
该unit可以是任何东西,但当然必须是唯一的.必须将均匀值设置为此索引.即glUniform1i(mybufferlocation, unit)(或硬编码layout(),但我从来没有这样做过).
然后你可以...
imageStore(mybuffer, atsomeindex, vec4(123.0));
Run Code Online (Sandbox Code Playgroud)确保glMemoryBarrier(GL_SHADER_IMAGE_ACCESS_BARRIER_BIT)在写入/读取的着色器通道之间使用.此外,如果着色器调用中存在竞争条件的可能性,请查看memoryBarrier/memoryBarrierImage和coherent限定符.
变换反馈也可以直接从顶点着色器输出写入缓冲对象,并从几何着色器执行流压缩,但这不适用于您的计算着色器.
| 归档时间: |
|
| 查看次数: |
729 次 |
| 最近记录: |