c ++ openGL挑选问题

时间:2011-09-09 13:26:31

标签: c++ opengl

我正在研究一个小例子,我从波前文件中加载了一个对象 - 我正在努力让我的选择正确,我已经完成了这个和一些教程大约10次......但是必须遗失了什么。想知道是否有人能提供额外的眼睛。

我使用了一个保存的列表来绘制对象,这在屏幕上显得很好......此时,当gl_select(x,y)运行时,无论如何我都会受到打击,如果我启用了翻译/旋转代码(目前已注释掉) - 我没有得到任何命中。

相关代码块:

// gl_select, is called when the mouse is clicked, with its x and y coords
void gl_select(int x, int y)
{
    GLuint buff[256];
    GLint hits;
    GLint view[4];

    //Buffer to store selection data
    glSelectBuffer(256, buff);

    //Viewport information
    glGetIntegerv(GL_VIEWPORT, view);

    //Switch to select mode
    glRenderMode(GL_SELECT);

    //Clear the name stack!
    glInitNames();

    //Fill the stack with one element
    glPushName(0);

    //Restric viewing volume
    glMatrixMode(GL_PROJECTION);
    glPushMatrix();
    glLoadIdentity();

    //Restrict draw area
    gluPickMatrix(x, y, 1.0, 1.0, view);
    gluPerspective(60, 1, 0.0001, 1000.0);

    //Draw the objects onto the screen
    glMatrixMode(GL_MODELVIEW);

    //Draw only the names in the stack
    glutSwapBuffers();
    DrawSavedObject();

    //Back into projection mode to push the matrix
    glMatrixMode(GL_PROJECTION);
    glPopMatrix();

    hits = glRenderMode(GL_RENDER);

    cout << hits;

    //Back to modelview mode
    glMatrixMode(GL_MODELVIEW);
}

绘制功能:

void DrawSavedObject()
{

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glColor3f(1.0,0.0,0.0);

    //translate and rotate
    //glRotated(rotation,0.0,0.0,1.0);
    //glTranslated(7.0, 7.0, 0.0);

    //Draw the saved object
    glLoadName(7);
    glCallList(list_object);

    glutSwapBuffers();
}

保存列表的位置:

void SaveDisplayList(){     
    glNewList(list_object, GL_COMPILE);

    glVertexPointer(3, GL_DOUBLE, 3*sizeof(GLdouble), vertices);
    glEnableClientState(GL_VERTEX_ARRAY);
    glDrawElements(GL_TRIANGLES, verticesSize ,GL_UNSIGNED_INT, triangles);

    glDisableClientState(GL_VERTEX_ARRAY);

    glEndList();
}

再次抱歉代码块的粗略。

2 个答案:

答案 0 :(得分:2)

这里要考虑的一些事情:

  • 不推荐使用OpenGL选择模式,除了几个SGI盒和3DLabs GPU之外,从不进行硬件加速。

  • DisplayLists不与顶点阵列混合。

  • 为什么在绘制已保存对象列表之前调用 glutSwapBuffers ?完全没有任何意义。

答案 1 :(得分:1)

我不确定它是否相关,但您不应该在显示列表中存储glVertexPointer之类的内容。来自规范http://www.opengl.org/sdk/docs/man/xhtml/glNewList.xml

  

某些命令未编译到显示列表中,但是   无论显示列表模式如何,都会立即执行。这些   命令是glAreTexturesResident,glColorPointer,glDeleteLists,   glDeleteTextures,glDisableClientState,glEdgeFlagPointer,   glEnableClientState,glFeedbackBuffer,glFinish,glFlush,glGenLists,   glGenTextures,glIndexPointer,glInterleavedArrays,glIsEnabled,   glIsList,glIsTexture,glNormalPointer,glPopClientAttrib,   glPixelStore,glPushClientAttrib,glReadPixels,glRenderMode,   glSelectBuffer,glTexCoordPointer,glVertexPointer和所有的   glGet命令。

这可能是造成问题的原因。