单次选择后的半Fps(OpenGL)(GL_SELECT模式)

时间:2013-05-27 10:25:28

标签: c++ qt opengl

我知道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)";
    }
}

2 个答案:

答案 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);
}

希望我帮助,谢谢。