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