我有一个 SSBO,它存储屏幕上每个像素的 vec4 颜色值,并在主循环之前由计算着色器预先填充了值。
我现在正试图在屏幕上获取这些数据,我猜这涉及使用片段着色器(尽管如果你知道更好的方法,我愿意接受建议)
所以我试图将缓冲区或至少其中的数据获取到片段着色器,以便我可以将每个片段的颜色设置为缓冲区中的相应值,但我找不到任何这样做的方法?
有人告诉我可以将 SSBO 绑定到片段着色器,但我不知道该怎么做?我的其他想法是以某种方式将数据从 SSBO 移动到纹理,但我也无法解决
更新:
作为回应 thokra 的出色回答和以下评论是设置我的缓冲区的代码:
//Create the buffer
GLuint pixelBufferID;
glGenBuffers(1, &pixelBufferID);
//Bind it
glBindBuffer(GL_SHADER_STORAGE_BUFFER, pixelBufferID);
//Set the data of the buffer
glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(vec4) * window.getNumberOfPixels, new vec4[window.getNumberOfPixels], GL_DYNAMIC_DRAW);
//Bind the buffer to the correct interface block number
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, pixelBufferID);
然后我调用计算着色器,这部分工作,我检查数据是否已正确填充。然后在我的片段着色器中,作为一个测试:
layout(std430, binding=0) buffer PixelBuffer
{
vec4 data[];
} pixelBuffer
void main()
{
gl_FragColor = pixelBuffer.data[660000];
}
我注意到的是,指数越高,它似乎需要的时间越来越长,所以在 660000 它实际上并没有崩溃,它只是花费了很长的时间。