橡皮筋技术实现之双缓存

缓存的定义:屏幕上所绘制的图形都是由像素组成的,每个像素都有一个固定的颜色或带有相应点的其他信息,如深度等。因此在绘制图形
时,内存中必须为每个像素均匀地保存数据,这块儿为所有像素保存数据的内存区就叫缓冲区,又叫缓存(buffer).不同的缓存可能包含每
个像素的不等位的数据,但在给定的一个缓存中,每个像素都被赋予相同数位的数据。
双缓存的定义:在基于缓冲区的橡皮筋技术中有两个缓存,一个称为前缓存,另者称后缓存。向前缓存中绘制图形,将会在屏幕上看到具体
的绘制过程,向后缓存中绘制图形,屏幕上看不见具体的绘制过程,在适当的时刻,将后缓存中内容复制到前缓存,则后缓存中绘制的图形
将会快速的显示到屏幕上。
使用双缓存实现橡皮筋技术有两种方式:
方式一:在进行交互式绘图之前,将场景内容放入后缓存,在进行交互式绘图过程中,每次需要更新画面时,首先将后缓存内容显示到屏幕上,
然后将需要显示的交互式图形绘制到屏幕上。
方式二:在进行交互式绘图过程中,将每次需要显示的整个场景(包括交互式图形)一并绘制到后缓存中,然后将后缓存中的内容复制到前缓存
(快速显示到屏幕)。
由于将缓存中内容显示到屏幕上的速度非常快,因此用这种技术实现的交互式绘图效果并不比异或绘图方式差。


利用OpenGL的双缓存实现橡皮筋技术,OpenGL使用上述两种方式中的方式一;

画线程序实例代码:

/*
根据所传递参数的不同,设置不同的图形绘制方式;
Imd==TRUE:交互式绘图;Imd==FALSE:一般绘图;
*/
void GLView::SetDrawImmediately(BOOL Imd)
{
   if(Imd)
   //绘制交互式图形
   {
      //取消深度测试,保证交互式图形总能够被用户看见
      glDepthMask(FALSE);
      //直接向屏幕绘图
      glDrawBuffer(GL_FRONT);
      //总是不进行深度测试
      glDepthFunc(GL_ALWAYS);
   }
   else
   //一般情况下绘图
   {
      //进行深度测试(进行消隐计算)
      glDepthMask(TRUE);
      //后缓存绘图,用SwapBuffers显示,在视觉上提高绘图速度,减少闪烁现象
      glDrawBuffer(GL_BACK);
      //深度小的对象显示,深度大的对象被消隐
      glDepthFunc(GL_LESS);
   }
}

OnLButtonDown(msg)
{
   ShowStatusBar("拖动鼠标至终点,抬起左键完成线段定义");
   m_LeftButtonDown = TRUE;
   m_LeftDownPos = GetMouseLocation();
   m_Start3DPoint = GetOGLPos(m_LeftDownPos.x,m_LeftDownPos.y);
   m_LastMovePos = m_LeftDownPos;
}

OnMouseMove(msg)
{
   if(!m_LeftButtonDown) return FALSE;
   Point3D tmpPoint = GetOGLPos(GetMouseLocation().x,GetMouseLocation().y);
   if(m_LastMovePos!=m_LeftDownPos)
   {
      SwapBuffers(wglGetCurrentDC());
   }
   if(GetMouseLocation()!=m_LeftDownPos)
   {
      SetDrawImmediately(TRUE);
      DrawLine(&m_Start3DPoint,&tmpPoint);
      SetDrawImmediately(FALSE);
   }
   m_LastMovePos = GetMouseLocation();
}

OnLButtonUp(msg)
{
   Point3D tmpPoint = GetOGLPos(GetMouseLocation().x,GetMouseLocation().y);
   if(m_LastMovePos!=m_LeftDownPos)
   {
      SwapBuffers(wglGetCurrentDC());
   }
   ShowStatusBar("按下鼠标左键,定义线段起点");
   m_LeftButtonDown = FALSE;
   if(GetMouseLocation()==m_LeftDownPos) return TRUE;
   SetDrawImmediately(TRUE);
   DrawLine(&m_Start3DPoint,&tmpPoint);
   SetDrawImmediately(FALSE);
}


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值