步骤按顺序来,不然会无法拾取,返回-1:
在绘制模型的时候要加一个标识id:
1, 初始化命名缓冲, glSelectBuffer(buffer_size, buffer);
2, 设置渲染模式为GL_SELECT
3, 初始化命名堆栈, glInitNames(), glPushName(0);
示例:
void select_object(CPoint point, CSize sz)
{
GLuint namebuffer[MAX_BUFFER];
GLint hits;
GLint viewport[4];
glGetIntegerv(GL_VIEWPORT, viewport);
glSelectBuffer(MAX_BUFFER, namebuffer);
glRenderMode(GL_SELECT);
//初始化名称栈
glInitNames();
glPushName(0);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
gluPickMatrix(point.x, viewport[3] - point.y, sz.cx, sz.cy, viewport);
gluPerspective(fAngle, fAspect, fNear, fFar);
pRender->glDraw(GetDC()->GetSafeHdc());
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glFlush();
hits = glRenderMode(GL_RENDER);
if(hits>0)
{
GLuint rs, depth = UINT_MAX;
for(int loop=0; loop<hits; ++loop)
{
if(namebuffer[1+loop*4]<depth)
{
rs = loop;
depth = namebuffer[1+loop*4];
}
}
GLuint posid = namebuffer[rs*4+3];
}
}
在绘制模型的时候要加一个标识id:
glLoadName(id);
这样在namebuffer里就会有你可能选中的模型,namebuffer保存三类信息:
1.命中发生时名称栈里的个数
2.两个整数,命中对象的深度最大值和最小值
3.名字项,就是绘制的时候的id
所以namebuffer中每四个代表一个选中的模型。