我的主要问题是,有人可以确认glQueryCounter捕获GL_TIMESTAMP所有先前的命令在GPU上执行了吗?那么两个时间戳的差异大致相当于捕获GL_ELAPSED_TIME?
我正在寻找的是一种测量两个以上时间戳之间的时间的方法,同时确保在执行所有先前调度的命令时捕获时间戳.我知道它GL_TIME_ELAPSED适用于两个时间点,但我需要一些可以嵌套并在单个帧中使用多个时间戳的东西,这就是我想要使用的原因GL_TIMESTAMP.时间戳可能是frameStart,drawCertainThingsStart,drawCertainThingsEnd,frameEnd.然而,规范GL_TIMESTAMP让我感到困惑,我不确定它是否符合我的要求.
不相交的计时器查询规范:https://www.khronos.org/registry/OpenGL/extensions/EXT/EXT_disjoint_timer_query.txt
一些信息似乎是矛盾的.例如: glQueryCounter:"在所有先前的命令到达GL服务器但尚未执行之后,将GL时间记录到查询对象中"
另一方面,不相交的计时器查询规范说"在GL客户端和服务器状态以及帧缓冲器上的所有先前命令完全实现之后记录时间.",这听起来像是在执行先前调度的命令之后记录时间戳.它还特别提到同步备选GetInteger64v返回时间戳而不必执行命令,强调glQueryCounter应该在执行前面的命令后返回时间戳,这与khron页面所说的相反.
该规范还配备了一个例子:部分"(2)本例使用QueryCounter"假想显示了如何glQueryCounter与GL_TIMESTAMP用于测量在GPU上的经过时间.但是,似乎这个例子不完整.两个变量,_timeStart_并且_timeEnd_,永远不会使用.相反,该示例GL_TIMESTAMP直接将值读入_timeElapsed_变量,这似乎是错误的.从我的理解,我们需要读GL_TIMESTAMP入_timeStart_和_timeEnd_,然后计算_timeElapsed_ = _timeEnd_ - _timeStart_.
不幸的是,OpenGL函数文档页面上存在大量错误.这是其中之一.它甚至自我 -contradictory,自描述的文本矛盾的介绍文字.
OpenGL 规范对以下行为非常清楚glQueryCounter:
在GL客户端和服务器状态上的所有先前命令和帧缓冲器已完全实现之后记录时间.
该规范还附带一个例子
错误的规格.ARB_timer_query规范适用于桌面OpenGL; EXT_disjoint_timer_query适用于OpenGL ES.不要混淆两者.
EXT_disjoint_timer_query规范的示例似乎从ARB_timer_query中错误地复制了.