OpenGL学习05_点画模式(点画多边形)

来源:互联网 发布:银行系统网络拓扑图 编辑:程序博客网 时间:2024/04/30 13:06
在默认情况下,填充多边形是用实心模式绘制的。此外,它们还可以使用一种32位×32位的窗口对齐的点画模式。glPolygonStipple()函数用于指定多边形的点画模式。
void glPolygonStipple(const GLubyte *mask);

定义填充多边形的当前点画模式。mask参数是一个指向32×32位图的指针,后者被解释为0和1的掩码。如果模式中出现的是1,那么多边形中对应的像素就被绘制;如果出现的是0,多边形中对应的像素就不被绘制。

下面通过一个绘制小强的Demo演示一下多边形的点画。

////  main.cpp//  OpenGL_04_Polygon////  Created by apple on 14/12/30.//  Copyright (c) 2014年 cc. All rights reserved.//#include <iostream>#include <GLUT/GLUT.h>/** *  初始化操作 */void init() {    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);    //设置着色模式,GL_FLAT 采用恒定着色,使用图元中某个顶点的颜色来渲染整个图元。    glShadeModel(GL_FLAT);}/** *  展示绘制效果 */void display() {        GLubyte fly[] = {        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[] = {        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);            //1.绘制一个矩形(正方形),左侧    glRectf(25.0, 25.0, 125.0, 125.0);        //开启多边形点画模式    glEnable(GL_POLYGON_STIPPLE);        //2.通过点画模式绘制一个小强的矩形    //小强矩形区域 32*32位    glPolygonStipple (fly);    //指定小强所在的矩形区域    glRectf(125.0, 25.0, 225.0, 125.0);        //3.通过点画绘制一张网图    glPolygonStipple (halftone);    //指定网图所在的矩形区域    glRectf(225.0, 25.0, 325.0, 125.0);        //关闭多边形点画模式    glDisable(GL_POLYGON_STIPPLE);        glFlush();}/** *  调整窗口尺寸 * *  @param width  宽度 *  @param height 高度 */void reshape(int width, int height) {    //设置视口矩形区域,在默认情况下,视口被设置为占据打开窗口的整个像素矩形    glViewport(0, 0, (GLsizei)width, (GLsizei)height);    //对投影矩阵应用随后的矩阵操作    glMatrixMode(GL_PROJECTION);    //等于是将之前矩阵变换导致变化过的栈顶矩阵重新归位,置为单位矩阵!等于是之前的矩阵变换带来的影响到此为止了!    glLoadIdentity();    //指定2D裁剪坐标系,naer和far使用默认值-1和1    gluOrtho2D(0.0, (GLdouble)width, 0.0, (GLdouble)height);}/** *  键盘事件回调 * *  @param key 键位 *  @param x   宽度 *  @param y   高度 */void keyboard(unsigned char key, int x, int y) {    switch (key) {        //ESC        case 27:            exit(0);            break;    }}int main(int argc, const char * argv[]) {        //初始化GLUT库    glutInit(&argc, (char**)argv);    //设置双缓冲,RGB像素格式的窗口    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);    //设置窗口大小    glutInitWindowSize(350, 150);    //设置窗口坐标    glutInitWindowPosition (100, 100);    //创建窗口    glutCreateWindow("Lines");        //初始化操作    init();        //设置展示的回调方法    glutDisplayFunc(display);    glutReshapeFunc(reshape);    glutKeyboardFunc(keyboard);        //绘制线程开始循环    glutMainLoop();        return 0;}


本文由CC原创总结,如需转载请注明出处:http://blog.csdn.net/oktears/article/details/42264395

0 0