opengl的选择模式

步骤按顺序来,不然会无法拾取,返回-1:

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中每四个代表一个选中的模型。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值