OpenGL 3.3客户端-服务器模型、同步与延迟加载技术问询
OpenGL客户端-服务器模型与同步栅栏的应用疑问
我了解到OpenGL中的PBO在纹理加载/上传中表现出色,可替代glTexImage和glGetTexImage处理大尺寸图像,现希望将该同步栅栏技术应用到其他加载/上传流程中。
对OpenGL客户端-服务器模型的理解(存疑部分标注为斜体)
- 客户端(程序)通过调用
gl*函数,请求OGL上下文将命令加入命令队列; - 若启用命令刷新(默认开启),命令立即通过PCI等传输至GPU,否则暂存缓冲区,调用
glFlush时再刷新; - GPU(服务器)接收命令并按序执行,修改对象/上下文状态;
- GPU向上下文返回请求的回复;
- 上下文将服务器返回的数据回复给客户端。
栅栏可用于判断GPU是否完成之前的命令执行。我认为可通过glWaitSync阻止刷新、加入新命令后调用glFlush,实现GPU异步执行,CPU可并行处理其他任务,待需操作OGL上下文时调用glClientWaitSync等待GPU完成。
但Khronos wiki称仅渲染函数是异步的,而PBO上传大图像时栅栏并非立即触发,耗时随图像尺寸变化,这令我困惑。另外,调用glShaderSource、glCompileShader后立即用glGetShaderiv检查GL_COMPILE_STATUS,是否会因编译未完成返回错误状态?着色器编译是否在CPU执行,不进入GPU命令队列?
问题列表
- 我对OGL客户端-服务器模型的理解是否正确,需如何调整?
- 若并非所有函数都可异步执行,具体是哪些函数?
- 为何wiki称仅渲染操作可异步执行?
- 若可通过
glWaitSync等控制命令执行时机,如何将PBO的异步方式应用到着色器上传编译、VBO/EBO/UBO/TBO及非缓冲对象的加载中?是否仅需上传后等待栅栏触发?
注:我使用最新GLFW、GLAD(OpenGL 3.3核心配置)及C++(MinGWx64 11.2.0)开发。
内容的提问来源于stack exchange,提问作者postcoital-solitaire
相关产品推荐
相关产品推荐

