C++ c++;openGL拣选问题
我正在做一个小例子,我从一个波阵面文件中加载了一个对象-我正在尝试正确的选择,我已经把这个和一些教程复习了大约10遍。。。但一定是遗漏了什么。我想知道是否有人可以提供额外的一套眼睛 我使用了一个保存的列表来绘制对象,它在屏幕上显示得很好。。。目前,当gl_select(x,y)运行时,无论发生什么情况,我都会得到一个命中率,如果我启用了translate/rotate代码(当前已注释掉),我也不会得到任何命中率 相关代码块:C++ c++;openGL拣选问题,c++,opengl,C++,Opengl,我正在做一个小例子,我从一个波阵面文件中加载了一个对象-我正在尝试正确的选择,我已经把这个和一些教程复习了大约10遍。。。但一定是遗漏了什么。我想知道是否有人可以提供额外的一套眼睛 我使用了一个保存的列表来绘制对象,它在屏幕上显示得很好。。。目前,当gl_select(x,y)运行时,无论发生什么情况,我都会得到一个命中率,如果我启用了translate/rotate代码(当前已注释掉),我也不会得到任何命中率 相关代码块: // gl_select, is called when the mo
// 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 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();
}
再次为代码块的笨重感到抱歉。我不确定它是否相关,但您不应该在显示列表中存储类似于
glvertexpinter
的内容。根据规范:
某些命令未编译到显示列表中,但
立即执行,无论显示列表模式如何。这些
命令包括GlarTextureResident、glColorPointer、GLDeleteList、,
glDeleteTextures、glDisableClientState、glEdgeFlagPointer、,
glEnableClientState、glFeedbackBuffer、glFinish、glFlush、GLGenList、,
glGenTextures、glIndexPointer、GlinterleaveDarray、glIndexPointer、,
glIsList、glIsTexture、glNormalPointer、glPopClientAttrib、,
glPixelStore、glPushClientAttrib、glReadPixels、glRenderMode、,
glSelectBuffer、glTexCoordPointer、glVertexPointer和所有
glGet命令
这可能是导致您出现问题的原因。我不确定这是否相关,但您不应该在显示列表中存储类似于
glvertexpinter
的内容。根据规范:
某些命令未编译到显示列表中,但
立即执行,无论显示列表模式如何。这些
命令包括GlarTextureResident、glColorPointer、GLDeleteList、,
glDeleteTextures、glDisableClientState、glEdgeFlagPointer、,
glEnableClientState、glFeedbackBuffer、glFinish、glFlush、GLGenList、,
glGenTextures、glIndexPointer、GlinterleaveDarray、glIndexPointer、,
glIsList、glIsTexture、glNormalPointer、glPopClientAttrib、,
glPixelStore、glPushClientAttrib、glReadPixels、glRenderMode、,
glSelectBuffer、glTexCoordPointer、glVertexPointer和所有
glGet命令
这可能是造成你问题的原因。
这里要考虑的一些事情:
- OpenGL选择模式已被弃用,并且从未被硬件加速过,只有少数SGI框和3DLabs GPU例外
- 显示列表不会与顶点数组混合
- 为什么在绘制保存对象列表之前调用glutSwapBuffers?毫无意义
- OpenGL选择模式已被弃用,并且从未被硬件加速过,只有少数SGI框和3DLabs GPU例外
- 显示列表不会与顶点数组混合
- 为什么在绘制保存对象列表之前调用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();
}