C++ Opengl大型SSBO在读取时挂起
我有多个大小为400100 int的SSBO(4个SSBO),我的片段着色器会更新此SSBO的值。为此,我调用了draw调用,在draw调用之后读取数据,首先绑定特定的SSBO,然后调用glMapBuffer并将ptr类型转换为int GPU进行繁重的处理(循环10000次)并更新SSBO。我在屏幕上显示的drawelement调用之后有一个print语句,在bind调用之后有一个print语句,它也会显示,但glMapBuffer调用会花费很长时间并挂起系统 在Windows任务管理器中,大部分时间不使用GPU,只使用CPU。我想这是因为GPU只在draw调用期间使用 另外,我的理解正确吗?当我调用glMapBuffer时,只传输绑定的ssbo 你们有什么建议来解释是什么导致了这个问题吗 我尝试使用glmapbuffer range,这导致了类似的问题C++ Opengl大型SSBO在读取时挂起,c++,opengl,shader,ssbo,C++,Opengl,Shader,Ssbo,我有多个大小为400100 int的SSBO(4个SSBO),我的片段着色器会更新此SSBO的值。为此,我调用了draw调用,在draw调用之后读取数据,首先绑定特定的SSBO,然后调用glMapBuffer并将ptr类型转换为int GPU进行繁重的处理(循环10000次)并更新SSBO。我在屏幕上显示的drawelement调用之后有一个print语句,在bind调用之后有一个print语句,它也会显示,但glMapBuffer调用会花费很长时间并挂起系统 在Windows任务管理器中,大部
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
glpaurements(GL_三角形,NUM_OF_三角形,GL_UNSIGNED_INT,0);
标准::cout“大小400100英寸”,即1.5 GB。您的实现允许这样的事情吗?“在Windows任务管理器中”在询问有关性能的问题时,请使用实际的分析工具。此外,glMapBuffer
是draw调用后的第一个命令,因此可能会导致GPU-CPU同步。draw调用本身没有阻塞,并立即返回glMapBuffer
可能会等待所有操作完成。