hyde
路人甲
路人甲
  • 注册日期2003-09-24
  • 发帖数555
  • QQ
  • 铜币1457枚
  • 威望0点
  • 贡献值0点
  • 银元0个
阅读:1437回复:0

OpenGL系列讲座(12)

楼主#
更多 发布于:2004-03-20 10:39
7.3  明暗处理
在计算机图形学中,光滑的曲面表面常用多边形予以逼近和表示,而每个小多边形轮廓

(或内部)就用单一的颜色或许多不同的颜色来勾画(或填充),这种处理方式就称为明暗处

理。在OpenGL中,用单一颜色处理的称为平面明暗处理(Flat Shading),用许多不同颜色处

理的称为光滑明暗处理(Smooth Shading),也称为 Gourand 明暗处理(Gourand Shading)。

设置明暗处理模式的函数为:

 

       void glShadeModel(GLenum mode)

 

    函数参数为GL_FLAT或GL_SMOOTH,分别表示平面明暗处理和光滑明暗处理。

 

应用平面明暗处理模式时,多边形内每个点的法向一致,且颜色也一致;应用光滑明暗

处理模式时,多边形所有点的法向是由内插生成的,具有一定的连续性,因此每个点的颜色

也相应内插,故呈现不同色。这种模式下,插值方法采用的是双线性插值法,如图2-7-2所

示。

  

图 2-7-2 Gouraud 明暗处理

 

Gouraud明暗处理通常算法为:先用多边形顶点的光强线性插值出当前扫描线与多边形

边交点处的光强,然后再用交点的光强线插值处扫描线位于多边形内区段上每一象素处的光

强值。图中显示出一条扫描线与多边形相交,交线的端点是A点和B点,P点是扫描线上位

于多边形内的任一点,多边形三个顶点的光强分别为I1、I2和I3.取A点的光强Ia为I1和

I2的线性插值,B点的光强Ib为I1和I3的线性插值,P点的光强Ip则为Ia和Ib的线性

插值。采用Gouraud明暗处理不但可以使用多边形表示的曲面光强连续,而且计算量很小。

这种算法还可以以增量的形式改进,且能用硬件直接实现算法,从而广泛用于计算机实时图

形生成。

 

    请看下面光滑明暗处理的例子shading.c:

 

例 2-10 明暗处理例程 shading.c

 

 

#include "glos.h"

 

#include <GL/gl.h>

#include <GL/glu.h>

#include <GL/glaux.h>

 

void myinit(void);

void  object(void);

void CALLBACK display(void);

void CALLBACK myReshape(GLsizei w, GLsizei h);

 

/*  GL_SMOOTH is actually the default shading model.  */

void myinit (void)

{

    glShadeModel (GL_SMOOTH);

}

 

void object(void)

{

    glBegin (GL_POLYGON);

     glColor3f (1.0, 0.0, 0.0);

      glVertex2f (4.0, 4.0);

     glColor3f(1.0,1.0,1.0);

      glVertex2f (12.0, 4.0);

     glColor3f(0.0,0.0,1.0);

      glVertex2f (12.0, 12.0);

     glColor3f(0.0,1.0,0.0);

      glVertex2f (4.0, 12.0);

 

    glEnd ();

}

 

void CALLBACK display(void)

{

    glClear (GL_COLOR_BUFFER_BIT);

    object ();

    glFlush ();

}

 

void CALLBACK myReshape(GLsizei w, GLsizei h)

{

    glViewport(0, 0, w, h);

    glMatrixMode(GL_PROJECTION);

    glLoadIdentity();

    if (w <= h)

    gluOrtho2D (0.0, 16.0, 0.0, 16.0 * (GLfloat) h/(GLfloat) w);

    else

    gluOrtho2D (0.0, 16.0 * (GLfloat) w/(GLfloat) h, 0.0, 16.0);

    glMatrixMode(GL_MODELVIEW);

}

 

void main(void)

{

    auxInitDisplayMode (AUX_SINGLE | AUX_RGBA);

    auxInitPosition (0, 0, 500, 500);

    auxInitWindow ("Smooth Shading");

    myinit();

    auxReshapeFunc (myReshape);

    auxMainLoop(display);

}

 

以上程序运行结果是在屏幕上显示一个色彩连续变化的三角形。这个程序是用的RGBA

显示模式,若改用颜色表模式,则颜色内插实际上是颜色表的内插,因此呈现的颜色可能不

连续。读者不妨自己试试。

另外,若在light0.c程序中加上一句定义GL_FLAT明暗处理模式,则又会出现怎样的情

形呢?读者可以仔细比较一下。

 

 

  

 

图 2-7-3 Gouraud明暗处理的正方形

喜欢0 评分0
夜落了,风静了,我喜欢一本书,一杯茶,一粒摇曳的烛光...
游客

返回顶部