0

我知道 OpenGL 选择模式已被弃用,并且从未被硬件加速,除了在一些 SGI 框和 3DLabs GPU 上。但我无法摆脱它(不是我的代码)。

通过特定的绘制,我得到大约 125 帧/秒。但是当我有(或更多)命中(所以选择模式有效)并且我尝试像往常一样移动相机时,我得到大约 40-50 帧/其次,如果根本没有 Hits,则不会发生任何奇怪的事情,而且我的帧率也一样好。

我究竟做错了什么?

在其 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);
}

startSelection 由 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)";
    }
}
4

2 回答 2

1

通过特定的绘制,我得到大约 125 帧/秒。但是当我有(或更多)命中(所以选择模式有效)并且我尝试像往常一样移动相机时,我得到大约 40-50 帧/其次,如果根本没有 Hits,则不会发生任何奇怪的事情,而且我的帧率也一样好。

想一想:没有命中意味着,没有任何东西必须被压入选择名称堆栈。很可能,选择模式的 SW 实现仅在实际命中时才分配名称堆栈,即原语将在剪辑体积中被光栅化。内存分配是一项昂贵的操作。

现在您的渲染代码将不得不在名称堆栈上推送 ID,如果它也在“可见”渲染路径中这样做,它可能会与选择模式的内存分配交互。

不过,这都是纯粹的(受过教育的)猜测。

我究竟做错了什么?

我不会说“错误”,而是“不开心”。如果不在选择模式下,我会在场景渲染代码中引入一个标志,以不将 ID 推送到名称堆栈上。

于 2013-05-27T11:13:26.063 回答
-8

我看到您忘记初始化帧缓冲区数据,现在您正在为帧实时分配空间,这使得计算时间比正常情况长 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);
}

希望我有所帮助,谢谢。

于 2013-05-27T10:50:38.480 回答