反走样与雾化

来源:互联网 发布:php preg split 编辑:程序博客网 时间:2024/06/11 10:20
 
转载自:http://hi.baidu.com/309805453/blog/item/d036802e91ad10e18b13990c.html
 
9.1 反走样
在利用计算机绘制图形的过程中,如果仔细观察,就会发现在屏幕上绘制的线为锯齿状,这是因为屏幕是一个一个的像素点构成的,当线绘制在两个像素点之间时,计算机就会近似的显示该直线。将走样效果进行处理,通常称为反走样。
反走样是一种图形处理方法。常见的反走样处理是利用图形与周围环境的过度颜色填充一部分像素,使图形看起来更加真实自然,手工完成这样的过渡相对简单。OpenGL同样是利用颜色的过渡完成反走样。OpenGL计算完成反走样的过程会复杂一些。
9.1.1 OpenGL反走样
OpenGL对屏幕中的图形进行反走压根处理,主要是点、线与图形的边沿以及雾或者颜色与纹理的插值计算。实际上,OpenGL完成反走样的绘制是利用融合的算法和技术。
9.1.2 反走样函数与定义
OpenGL对于反走样本身并不复杂,仅用两类语句函数定义反走样的启动与性质属性。首先是需要让程序知道OpenGL启动了反走样功能。
(1)启动与关闭反走样
OpenGL采用glEnable()与glDisable()两个函数定义以下三种不同的状态变量完成反走样的启动与关闭。
启动点反走样处理:glEnable(GL_POINT_SMOOTH);
屏蔽点反走样处理:glDisable(GL_POINT_SMOOTH);
启动线反走样处理:glEnable(GL_LINE_SMOOTH);
屏蔽线反走样处理:glDisable(GL_LINE_SMOOTH);
启动多边形反走样处理:glEnable(GL_POLYGON_SMOOTH);
屏蔽多边形反走样处理:glDisable(GL_POLYGON_SMOOTH);
反走样的作用,通常需要融合函数帮助。对于多边形等反走样的特殊场合来说,融合的启动更是必不可少,因为OpenGL需要知道用怎样的融合属性进行反走样处理。需要注意的是,多边形的反走样是以三角形的三个边为单元,或者说是以每对顺序顶点组成的边为单位进行反走样的。如果通过融合函数进行反走样的配合工作,这样的反走样会产生意想不到的多余边。这样的边不是读者绘制的,而是反走样的,程序按照平滑明暗渲染的顺序,将各项顶点组成的边与已经绘制的颜色进行融合计算完成第三种“新”的颜色的绘制边线,普通的融合只是融合表面,对边不进行特殊处理,而反走样进行这样的特殊处理完成边的反走样。
(2)函数glHint()完成反走样属性的定义。
反走样操作方法函数
函数glHint()完成融合方法的定义:
void glHint(GLenum target,GLenum mode)
GLenume target:定义反走样对象
GLenum mode:定义反走样的方法
target形式:GL_FOG_HINT:针对雾的计算
     GL_POINT_SMOOTH_HINT:针对点的反走样计算
     GL_LINE_SMOOTH_HINT:针对线的反走样计算
     GL_POLYGON_SMOOTH_HINT:针对多边形的反走样计算
     GL_PERSPECTIVE_CORRECTION_HINT:针对颜色与纹理的插值计算
mode形式:GL_FASTEST:速度最优,即最高效的选择
    GL_NICEST:质量最优,即最高质量的选择
    GL_DONT_CARE:无需客户选择

9.2 雾化
自然界中的雾是多变的、淡化透明的、不定的,但对于这样真实的雾,计算机是很难模拟的。通常,计算机的模拟只是对自然界中云烟、浓雾、虚化的场景进行仿真模拟,换句话说,就是通过虚化处理屏幕中的场景物体,使它们看起来像在雾中的物体一样,这个过程叫雾化。
9.2.1 OpenGL雾化
雾化同反走样一样,也是控制物体颜色和边缘处理的一类方法。在OpenGL中,当雾化效果被激活后,场景中需绘制的物体由远及近地与雾色进行融合处理,使远距离的物体融入到雾色里,近距离的物体逐渐清晰。
OpenGL的雾化处理是在变幻矩阵、光照、纹理映射之后进行,所以雾对于光照处理与纹理映射的物体表面仍然起作用。
对于OpenGL来说,雾化同样是一种改变物体颜色的方法,所以雾化就不只会被应用在有雾的场景中。实际上,OpenGL进行雾化除了增加场景的真实感与立体感之外,还可以利用雾化创造烟雾、云朵、火焰、爆炸等复杂的场景,这些场景利用融合透明技术也可以创造,但计算量将大幅度上升,所以一般采用雾化处理来完成。
9.2.2 雾化函数与定义
只有两类语句函数定义雾化的启动与性质属性。首先是需要让程序知道OpenGL启动了雾化功能。
(1)启动与关闭雾化功能
启动雾化处理:glEnable(GL_FOG);
屏蔽雾化处理:glDisable(GL_FOG);
(2)雾化运算等属性的定义函数
函数glFog()完成雾化属性定义,具有一下几种形式:
void glFogf(GLenum pname,GLfloat p);
void glFogi(GLenum pname,Glint p);
void glFogfv(GLenmu pname,const GLfloat* p);
void glFogiv(GLenum pname,const Glint* p);
状态变量pname定义有如下形式,它们可以完成OpenGL对雾化的不同属性的定义:
GLenum pname的取值:
A:GL_FOG_MODE:定义雾化模式。含有三种取值,由后续的三种不同的状态变量定义。当pname为GL_FOG_MODE时,p取以下状态参数定义雾的计算因子:
GL_EXP:默认值。指数变化
GL_EXP2:指数变化2.
GL_LINEAR:线性变化
B:GL_FOG_DENSITY:定义要绘制的雾的浓度。默认值为1.0
C:GL_FOG_START:定义要绘制的雾化开始点。在线性计算中表示到视点的近距离点,默认值为0.0。
D:GL_FOG_END:定义要绘制的雾化结束点。在线性计算中表示到视点的远距离点,默认值为1.0。
E:GL_FOG_COLOR:定义要绘制的雾的颜色。在RGB颜色模式中定义RGBA颜色的四个分量:默认值为(0.0,0.0,0.0,0.0)
F:GL_FOG_INDEX:定义要绘制的雾的颜色,在索引颜色模式中定义索引颜色值。默认值为0。
例如:可以定义一个雾化处理,如下所示:
glEnable(GL_FOG);
GLfloat fogC[4] = {1.0f,1.0f,1.0f,1.0f};
glFogfv(GL_FOG_COLOR,fogC);
glFogi(GL_FOG_MODE,GL_LINEAR);
glFogf(GL_FOG_DENSITY,2.0);
glFogf(GL_FOG_START,2.0);
glFogf(GL_FOG_END,9.0);
glHint(GL_FOG_HINT,GL_DONT_CARE);
.......
glDisable(GL_FOG);
上述第1~8语句表示启动雾化功能:雾为白色;采用线性雾化;浓度为2.0;远近距离为2.0~9.0。雾化反走样处理方式,采用:无需客户选择。OpenGL将根据计算量与计算能力等情况自动平衡绘制速度与绘制质量。
完成雾化后不要忘了关闭。