首页 > 代码库 > OpenGL学习05_点画模式(点画多边形)

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

在默认情况下,填充多边形是用实心模式绘制的。此外,它们还可以使用一种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/42262187

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