OpenGl图元基本操作之点选高亮

Posted 小哈龙

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenGl图元基本操作之点选高亮相关的知识,希望对你有一定的参考价值。

一.点选高亮简介

在使用各种方式(GDI,Opengl,occ等)绘图时,显示区域的图元的选择是需要使用另外一种区分的,这个就是基本的高亮,点选是指单独的鼠标点击一下就选中坐标附近的一个图元,然后将该图元以一种独特的醒目的颜色显示就是点选高亮。

二.Opengl实现点选高亮的思路

我最近在整理Opengl1.1版本的一些操作,因此关于这里说的点选高亮也是基于opengl1.1版本的,就是windows系统下默认支持的版本,其它高版本应该都有更加简洁的实现方式,在这里不做讨论。

要实现点选高亮,我认为需要一下几个条件:

1.获取到当前所有的图元信息

2.得到当前的鼠标点击的点,并判断找出点附近或者将该点包含的图元

3.找到第2点中所描述的图元之后,就需要将其单独高亮显示,当点击其它地方的时候将该图元颜色恢复至原始状态

三.Opengl实现点选高亮

根据上述三点基本想法,来逐步实现

1.获取到当前所有的图元信息

当我们在绘图时,总会从一些地方获取到图元信息数据,要么数据导入解析,要么界面输入解析,索性把获取数据的称为数据层,从数据层获取数据,将数据经过解析调用Opengl的基本图元绘制方法,即可完成图元的绘制,都会存储在帧缓存区中,此时可以将所有的图元数据存储起来,存储为多边形(loop)或者其它信息,并计算其外包矩形,第一步做到这些 就够了,此处代码略,不同的实现方式代码不同,但是实现是基本一致的

2.得到当前的鼠标点击的点,并判断找出点附近或者将该点包含的图元

在不同的平台下,获取当前的鼠标消息,得到当前鼠标的坐标,此处还需要将鼠标的坐标转化为显示窗口的坐标,得到了显示窗口的点坐标,根据第一步获取的图元信息,判断该点是否在图元范围内或者其它自定义的标准,标识该点与该图元的唯一确定关系。

3.找到第2点中所描述的图元之后,就需要将其单独高亮显示,当点击其它地方的时候将该图元颜色恢复至原始状态

第三点应该是最关键的,得到了点中的图元之后,需要将所有已经绘制好的原始图元信息保存在新建的纹理图片之中

如下代码将当前帧缓冲区中的像素拷贝至纹理图像的矩形区域,这个创建的纹理图像是在窗口初始化时创建的,作为一个单独的存储图元绘制信息的中转站

//开启2D纹理
glEnable(GL_TEXTURE_2D);
//绑定已经创建的的纹理ID
glBindTexture(GL_TEXTURE_2D,texID);
//将当前帧缓存区中的数据拷贝至纹理图像的矩形区域
glCopyTextSubImage2D(GL_TEXTURE_2D,0,0,0,0,0,texWidth,texHeight);
//拷贝之后还原至默认纹理ID
glBindTexture(GL_TEXTURE_2D,0);
//关闭2D纹理
glDisable(GL_TEXTURE_2D);

将所有图元信息存储在纹理图像中,保存起来,当点击选中某个图元时,清空帧缓存区,先将

纹理图像中的图元重新放到帧缓存区中,然后重新以另一种颜色绘制选中的图元,设置该图元颜色索引值与已经存储在缓存区中的对应像素位置的颜色索引值做逻辑操作,这里使用GL_COPY即可,即使用新的颜色覆盖已经存在缓存区中对应位置的颜色,这样缓存区中的选中的那个图元的颜色就变为指定的新颜色,其它的颜色不变,此时SwapBuffers()将缓存区数据刷新到屏幕显示即可。如果点击了其它位置则将缓存区清空,重新将纹理图像中的数据放置到缓存区中,刷新显示即可,恢复原来的状态

以上是关于OpenGl图元基本操作之点选高亮的主要内容,如果未能解决你的问题,请参考以下文章

[OpengGL]渲染流程和程序流程

openGl学习之基本图元

OpenGL

OpenGL

Linux OpenGL 实践篇-13-geometryshader

计算机图形学5--绘制基本图元