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

被折叠的 条评论
为什么被折叠?



