我知道OpenGL选择模式已被弃用,并且从未被硬件加速,除了几个SGI盒子和3DLabs GPUs。但我无法摆脱它(不是我的代码)。
通过特定的平局,我得到大约125帧/秒。但是当我有一个(或更多)命中(因此选择模式工作)并且我试图像往常一样移动相机时,我变得像40- 50帧/秒。如果没有点击,没有什么奇怪的事情发生,我有相同的良好帧率。
我做错了什么?
低于C ++代码:
void GLWidget::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
gluLookAt(objCamera->mPos.x, objCamera->mPos.y, objCamera->mPos.z,
0, objCamera->mView.y, 0,
objCamera->mUp.x, objCamera->mUp.y, objCamera->mUp.z);
ourRender(scene);
}
startTlection由Qt mousePressEvent
调用void GLWidget::startSelection(int x,int y) // This Is Where Selection Is Done
{
GLint viewport[4];
glSelectBuffer(BUFSIZE,selectBuf);
glRenderMode(GL_SELECT);
glInitNames();
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glGetIntegerv(GL_VIEWPORT,viewport);
gluPickMatrix(x,viewport[3]-y,5,5,viewport);
gluPerspective(fov,ratio,0.1f,1000);
glMatrixMode(GL_MODELVIEW);
draw_something();
stopSelection();
}
void GLWidget::stopSelection() {
int hits;
glMatrixMode(GL_PROJECTION); // restoring the original projection matrix
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
hits = glRenderMode(GL_RENDER); // returning to normal rendering mode
if (hits > 0){
qDebug() << "Found " << hits << " hit(s)";
}
}
答案 0 :(得分:1)
通过特定的平局,我得到大约125帧/秒。但是当我有一个(或更多)命中(因此选择模式工作)并且我试图像往常一样移动相机时,我变得像40- 50帧/秒。如果没有任何点击,没有什么奇怪的事情发生,我有相同的良好帧率。
想一想:没有命中意味着,没有什么必须被推到选择名称堆栈上。很可能,选择模式的SW实现仅在存在实际命中时才分配名称栈,即原语将在剪辑音量中得到光栅。内存分配是一项代价高昂的操作。
现在你的渲染代码必须在namestack上推送ID,如果它也在&#34; visible&#34;渲染路径它可能与选择模式的内存分配相互作用。
但这是纯粹的(受过教育的)猜测。
我做错了什么?
我不说&#34;错误&#34;但是&#34;不开心&#34;。我在场景渲染代码中引入了一个标志,如果不是在选择模式下,则不会在名称堆栈上推送ID。
答案 1 :(得分:-8)
我发现你忘了初始化Frame Buffer Data, 现在,您实时为帧分配空间,这使得计算时间比通常情况长10倍。这很容易修复。
另外,我建议你改变这个:
void GLWidget::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
gluLookAt(objCamera->mPos.x, objCamera->mPos.y, objCamera->mPos.z,
0, objCamera->mView.y, 0,
objCamera->mUp.x, objCamera->mUp.y, objCamera->mUp.z);
ourRender(scene);
}
进入这个:
void GLWidget::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glBufferInfluxinatorPrep(scene);
gluLookAt(objCamera->mPos.x, objCamera->mPos.y, objCamera->mPos.z,
0, objCamera->mView.y, 0,
objCamera->mUp.x, objCamera->mUp.y, objCamera->mUp.z);
ourRender(scene);
glBufferDefluxinator(scene);
}
希望我帮助,谢谢。