OpenGL从1.0开始--填充区属性

来源:互联网 发布:家用 网络安全设备 编辑:程序博客网 时间:2024/05/17 04:09

和点属性和线属性一样,OpenGL也提供面的属性,我们称之为填充区属性。
简明扼要,我们先来看一个示例(代码借鉴于http://www.xuebuyuan.com/2205027.html)
这里写图片描述

#include <windows.h>#include <GL/gl.h>#include <GL/glu.h>#include <GL/glut.h>void display(void){    GLubyte fly[] = { //第二个矩形点画模式的mask值        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,        0x03, 0x80, 0x01, 0xC0, 0x06, 0xC0, 0x03, 0x60,        0x04, 0x60, 0x06, 0x20, 0x04, 0x30, 0x0C, 0x20,        0x04, 0x18, 0x18, 0x20, 0x04, 0x0C, 0x30, 0x20,        0x04, 0x06, 0x60, 0x20, 0x44, 0x03, 0xC0, 0x22,        0x44, 0x01, 0x80, 0x22, 0x44, 0x01, 0x80, 0x22,        0x44, 0x01, 0x80, 0x22, 0x44, 0x01, 0x80, 0x22,        0x44, 0x01, 0x80, 0x22, 0x44, 0x01, 0x80, 0x22,        0x66, 0x01, 0x80, 0x66, 0x33, 0x01, 0x80, 0xCC,        0x19, 0x81, 0x81, 0x98, 0x0C, 0xC1, 0x83, 0x30,        0x07, 0xe1, 0x87, 0xe0, 0x03, 0x3f, 0xfc, 0xc0,        0x03, 0x31, 0x8c, 0xc0, 0x03, 0x33, 0xcc, 0xc0,        0x06, 0x64, 0x26, 0x60, 0x0c, 0xcc, 0x33, 0x30,        0x18, 0xcc, 0x33, 0x18, 0x10, 0xc4, 0x23, 0x08,        0x10, 0x63, 0xC6, 0x08, 0x10, 0x30, 0x0c, 0x08,        0x10, 0x18, 0x18, 0x08, 0x10, 0x00, 0x00, 0x08    };    GLubyte halftone[] = { //第三个矩形点画模式的mask值        0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,        0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,        0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,        0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,        0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,        0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,        0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,        0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,        0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,        0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,        0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,        0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,        0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,        0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,        0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,        0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55    };    glClear(GL_COLOR_BUFFER_BIT);    glColor3f(1.0, 1.0, 1.0);    glRectf(25.0, 25.0, 125.0, 125.0);    glEnable(GL_POLYGON_STIPPLE);//开启开关    glPolygonStipple(fly);//应用掩膜    glRectf(125.0, 25.0, 225.0, 125.0);    glPolygonStipple(halftone);    glRectf(225.0, 25.0, 325.0, 125.0);    glDisable(GL_POLYGON_STIPPLE);//关闭开关    glFlush();}void myinit(void){    glClearColor(0.0, 0.0, 0.0, 1.0);    glMatrixMode(GL_PROJECTION);       // Set projection parameters.    gluOrtho2D(0.0, 400.0, 0.0, 150.0);}int main(int argc, char** argv){    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);    glutInit(&argc, argv);    glutInitWindowPosition(0, 0);    glutInitWindowSize(350, 150);    glutCreateWindow("An Example OpenGL Program");    myinit();    glutDisplayFunc(display);    glutMainLoop();}

OpenGL仅提供对凸多边形的填充区子程序。显示一个填充凸多边形需要经过下面四个步骤:

  1. 定义一个填充图案。我们的示例中定义了两个个十六进制位图(fly和halftone)作为掩膜。默认时,凸多边形使用当前颜色设定显示成一个实心颜色区域,使用填充图案时,掩膜中值为1表示对应像素设为当前颜色,值为0表示对应的帧缓存位置的值不变。掩膜从图案的底行开始描述,直到图案的最高行。该图案也是从显示窗口的左下角开始,在整个显示窗口中重复,而指定的多边形用与其重叠的图案部分填充。
  2. 引用多边形填充子程序。
  3. 激活OpenGL多边形填充特性。
glEnable(GL_POLYGON_STIPPLE);
  1. 描述要填充的多边形。
glPolygonStipple(fly);//fly指要使用的掩膜

OpenGL线框图方法

除了实心颜色区域或填充区域外,我们也可以仅显示多边形的边,来生成线框图或多边形的空心显示,甚至使用一组顶点来显示多边形。这些选项通过下面的函数来选定

glPolygonMode(face,displayMode);

face可以指定GL_FRONT/GL_BACK/GL_FRONT_AND_BACK,用来指定在多边形的哪一个面上仅显示边或顶点。然后displayMode指定显示模式,GL_LINE表示线框模式,GL_POINT表示显示顶点,默认的显示模式是GL_FILL。
若既要显示填充区又要显示边可以采用不同的displayMode渲染两次,但是因为扫描线填充算法和边的划线算法计算差别,这种方法可能产生缝线。消除三维多边形显示边缝隙的一个办法是移动由填充子程序计算的深度值,使他们与多边形的边深度值不重叠。我们直接给大家简单介绍一个示例代码段:

glEnable(GL_POLYGON_OFFSET_FILL);//调整填充区的深度,将fill改为line或point也可以调整线和点的深度GLPolygonOffset(1.0,1.0);

在OpenGL中是不支持凹多边形的,我们在显示实心凹多边形时必须将其分割为若干三角形。但这在线框图中是不可能的,因为这会显示出多余的线框。那我们能不能不要显示这些多余线框呢?

glEdgeFlag(flag);

只要将flag设置为flase其后面所有线框均不显示,知道将其设置为true。
该参数也可以在顶点数组中指定:

glEnableClientState(GL_EDGE_FLAG_ARRAY);glEdgeFlagPointer(offset,edgeFlagArray);

其他属性

指定前向面和后向面

glFrontFace(vertexOrder);

多边形前向面默认的顶点顺序为逆时针次序,即vertexOrder为CCW,顺时针为CW。

激活OpenGL反走样子程序:

glEnable(primitiveType);

因为OpenGL通过离散化对象来进行渲染的缘故,生成的图元显示具有锯齿形或阶梯状外观,这种现象称之为走样。为了改善渲染效果使用反走样子程序,其中参数primitiveType被赋予符号常量GL_POINT_SMOOTH、GL_LINE_SMOOTH、GL_POLYGON_SMOOTH。

原创粉丝点击