我有多个大小为 400400100 个整数的 SSBO(4 SSBO),我的片段着色器更新了这个 ssbo 的值。我通过调用drawelements调用来做到这一点,并在draw调用之后通过首先绑定特定的SSBO然后调用glMapBuffer并将ptr类型转换为int来读取数据。
GPU 执行繁重的处理(循环 10000 次迭代)并更新 SSBO。我在屏幕上显示的drawelement调用之后有一个打印语句,在绑定调用之后有一个打印语句,它也显示但glMapBuffer调用需要永远并挂起系统。
在 Windows 任务管理器中,大部分时间不使用 GPU,只使用 CPU。我认为这是因为 GPU 仅在绘图调用期间使用。
另外,我的理解是否正确,当我调用 glMapBuffer 时,只传输绑定的 ssbo?
你们对可能导致此问题的原因有什么建议吗?
我尝试使用 glmapbuffer 范围,这导致了类似的问题。
glDrawElements(GL_TRIANGLES, NUM_OF_TRIANGLES , GL_UNSIGNED_INT, 0);
std::cout << 'done rendering' <<std::endl; //prints this out
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, 0);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, SSBO);
std::cout << 'done binding ssbo' <<std::endl; //prints this out
GLint *ptr;
ptr = (GLint *) glMapBuffer(GL_SHADER_STORAGE_BUFFER, GL_READ_ONLY); //hangs here