标准提到从我的第一个gl
命令开始渲染并继续与其他命令并行.某些功能,例如glBufferSubData
指示加载可以在渲染期间发生,只要该对象当前未被使用.这引入了"框架"的逻辑概念,尽管标准中从未明确提及.
所以我的问题是什么定义了这个逻辑框架?也就是说,哪些调用划分了游戏,这样我就可以gl
再次开始调用而不会干扰前一帧?
例如,使用EGL最终调用eglSwapBuffers
(大多数实现都有某种交换命令).从逻辑上讲,这是一帧与下一帧之间的边界.但是,这会调用块来支持v-sync,这意味着在返回之前不能发出新命令.然而,文档暗示您可以在返回另一个线程之前开始发出新命令(假设您没有触及任何正在使用的缓冲区).
即使swap命令仍然在前一个缓冲区上阻塞,我怎样才能开始向下一个缓冲区发出命令?我想在GPU处理旧帧时开始下一帧的流数据(特别是,我将有两个顶点缓冲区,每个帧都会专门为此目的进行交换,并在OpenGL文档中提到).
Nic*_*las 12
OpenGL没有"框架"的概念,逻辑或其他.
OpenGL非常简单:每个命令都像先前所有命令一样完成.
注意关键短语"好像".假设您从缓冲区对象渲染,然后立即修改其数据.像这样:
glBindVertexArray(someVaoThatUsesBufferX);
glDrawArrays(...);
glBindBuffer(GL_ARRAY_BUFFER, BufferX);
glBufferSubData(GL_ARRAY_BUFFER, ...);
Run Code Online (Sandbox Code Playgroud)
这在OpenGL中是100%合法的.关于这将如何运作,没有任何警告,问题,关注等.该glBufferSubData
调用将执行,就像glDrawArrays
命令已完成一样.
您唯一需要考虑的是规范未指定的一件事:性能.
一个实现完全有权检测到您正在修改可能正在使用的缓冲区,从而使CPU停止运行,glBufferSubData
直到从该缓冲区完成呈现为止.OpenGL实现需要执行此操作或其他操作,以防止实际源缓冲区在使用时被修改.
因此,根据规范,OpenGL实现在可能的情况下异步执行命令.只要外面世界无法判断还glDrawArrays
没有完成绘制任何东西,实现可以做任何想做的事情.如果glReadPixels
在绘图命令之后发出权限,则管道必须停止.你可以做到,但不能保证性能.
这就是为什么OpenGL被定义为一个封闭的盒子.这使得实现在任何可能的情况下都可以自由地进行异步.每次访问OpenGL数据都需要一个OpenGL函数调用,这允许实现检查该数据是否实际可用.如果没有,它会停滞不前.
摆脱摊位是缓冲对象失效的原因之一; 它有效地告诉OpenGL你想要孤立缓冲区的数据存储.这就是为什么缓冲对象可以用于像素传输的原因 ; 它允许传输异步发生.这就是为什么存在fence同步对象的原因,因此您可以判断资源是否仍在使用中(可能用于GL_UNSYNCHRONIZED_BIT
缓冲区映射).等等.
但是,这会调用块来支持v-sync,这意味着在返回之前不能发出新命令.
谁说的?缓冲区交换命令可能会停止.它可能不会.它是实现定义的,可以使用某些命令进行更改.该文档eglSwapBuffers
仅表示它执行刷新,这可能会使CPU停止但不必.
归档时间: |
|
查看次数: |
459 次 |
最近记录: |