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

来源:互联网 发布:捷孚凯市场咨询知乎 编辑:程序博客网 时间:2024/04/30 08:52
在默认情况下,填充多边形是用实心模式绘制的。此外,它们还可以使用一种32位×32位的窗口对齐的点画模式。glPolygonStipple()函数用于指定多边形的点画模式。
[cpp] view plain copy
  1. void glPolygonStipple(const GLubyte *mask);  

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

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

[cpp] view plain copy
  1. //  
  2. //  main.cpp  
  3. //  OpenGL_04_Polygon  
  4. //  
  5. //  Created by apple on 14/12/30.  
  6. //  Copyright (c) 2014年 cc. All rights reserved.  
  7. //  
  8.   
  9. #include <iostream>  
  10. #include <GLUT/GLUT.h>  
  11.   
  12. /** 
  13.  *  初始化操作 
  14.  */  
  15. void init() {  
  16.     glClearColor(0.0f, 0.0f, 0.0f, 0.0f);  
  17.     //设置着色模式,GL_FLAT 采用恒定着色,使用图元中某个顶点的颜色来渲染整个图元。  
  18.     glShadeModel(GL_FLAT);  
  19. }  
  20.   
  21. /** 
  22.  *  展示绘制效果 
  23.  */  
  24. void display() {  
  25.       
  26.     GLubyte fly[] = {  
  27.         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  
  28.         0x03, 0x80, 0x01, 0xC0, 0x06, 0xC0, 0x03, 0x60,  
  29.         0x04, 0x60, 0x06, 0x20, 0x04, 0x30, 0x0C, 0x20,  
  30.         0x04, 0x18, 0x18, 0x20, 0x04, 0x0C, 0x30, 0x20,  
  31.         0x04, 0x06, 0x60, 0x20, 0x44, 0x03, 0xC0, 0x22,  
  32.         0x44, 0x01, 0x80, 0x22, 0x44, 0x01, 0x80, 0x22,  
  33.         0x44, 0x01, 0x80, 0x22, 0x44, 0x01, 0x80, 0x22,  
  34.         0x44, 0x01, 0x80, 0x22, 0x44, 0x01, 0x80, 0x22,  
  35.         0x66, 0x01, 0x80, 0x66, 0x33, 0x01, 0x80, 0xCC,  
  36.         0x19, 0x81, 0x81, 0x98, 0x0C, 0xC1, 0x83, 0x30,  
  37.         0x07, 0xe1, 0x87, 0xe0, 0x03, 0x3f, 0xfc, 0xc0,  
  38.         0x03, 0x31, 0x8c, 0xc0, 0x03, 0x33, 0xcc, 0xc0,  
  39.         0x06, 0x64, 0x26, 0x60, 0x0c, 0xcc, 0x33, 0x30,  
  40.         0x18, 0xcc, 0x33, 0x18, 0x10, 0xc4, 0x23, 0x08,  
  41.         0x10, 0x63, 0xC6, 0x08, 0x10, 0x30, 0x0c, 0x08,  
  42.         0x10, 0x18, 0x18, 0x08, 0x10, 0x00, 0x00, 0x08  
  43.     };  
  44.       
  45.     GLubyte halftone[] = {  
  46.         0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,  
  47.         0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,  
  48.         0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,  
  49.         0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,  
  50.         0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,  
  51.         0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,  
  52.         0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,  
  53.         0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,  
  54.         0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,  
  55.         0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,  
  56.         0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,  
  57.         0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,  
  58.         0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,  
  59.         0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,  
  60.         0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,  
  61.         0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55  
  62.     };  
  63.       
  64.     //清理颜色缓冲区  
  65.     glClear(GL_COLOR_BUFFER_BIT);  
  66.     //设置绘制颜色(白)  
  67.     glColor3f(1.0, 1.0, 1.0);  
  68.       
  69.       
  70.     //1.绘制一个矩形(正方形),左侧  
  71.     glRectf(25.0, 25.0, 125.0, 125.0);  
  72.       
  73.     //开启多边形点画模式  
  74.     glEnable(GL_POLYGON_STIPPLE);  
  75.       
  76.     //2.通过点画模式绘制一个小强的矩形  
  77.     //小强矩形区域 32*32位  
  78.     glPolygonStipple (fly);  
  79.     //指定小强所在的矩形区域  
  80.     glRectf(125.0, 25.0, 225.0, 125.0);  
  81.       
  82.     //3.通过点画绘制一张网图  
  83.     glPolygonStipple (halftone);  
  84.     //指定网图所在的矩形区域  
  85.     glRectf(225.0, 25.0, 325.0, 125.0);  
  86.       
  87.     //关闭多边形点画模式  
  88.     glDisable(GL_POLYGON_STIPPLE);  
  89.       
  90.     glFlush();  
  91.   
  92. }  
  93.   
  94. /** 
  95.  *  调整窗口尺寸 
  96.  * 
  97.  *  @param width  宽度 
  98.  *  @param height 高度 
  99.  */  
  100. void reshape(int width, int height) {  
  101.     //设置视口矩形区域,在默认情况下,视口被设置为占据打开窗口的整个像素矩形  
  102.     glViewport(0, 0, (GLsizei)width, (GLsizei)height);  
  103.     //对投影矩阵应用随后的矩阵操作  
  104.     glMatrixMode(GL_PROJECTION);  
  105.     //等于是将之前矩阵变换导致变化过的栈顶矩阵重新归位,置为单位矩阵!等于是之前的矩阵变换带来的影响到此为止了!  
  106.     glLoadIdentity();  
  107.     //指定2D裁剪坐标系,naer和far使用默认值-1和1  
  108.     gluOrtho2D(0.0, (GLdouble)width, 0.0, (GLdouble)height);  
  109. }  
  110.   
  111. /** 
  112.  *  键盘事件回调 
  113.  * 
  114.  *  @param key 键位 
  115.  *  @param x   宽度 
  116.  *  @param y   高度 
  117.  */  
  118. void keyboard(unsigned char key, int x, int y) {  
  119.     switch (key) {  
  120.         //ESC  
  121.         case 27:  
  122.             exit(0);  
  123.             break;  
  124.     }  
  125. }  
  126.   
  127.   
  128. int main(int argc, const char * argv[]) {  
  129.       
  130.     //初始化GLUT库  
  131.     glutInit(&argc, (char**)argv);  
  132.     //设置双缓冲,RGB像素格式的窗口  
  133.     glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);  
  134.     //设置窗口大小  
  135.     glutInitWindowSize(350, 150);  
  136.     //设置窗口坐标  
  137.     glutInitWindowPosition (100, 100);  
  138.     //创建窗口  
  139.     glutCreateWindow("Lines");  
  140.       
  141.     //初始化操作  
  142.     init();  
  143.       
  144.     //设置展示的回调方法  
  145.     glutDisplayFunc(display);  
  146.     glutReshapeFunc(reshape);  
  147.     glutKeyboardFunc(keyboard);  
  148.       
  149.     //绘制线程开始循环  
  150.     glutMainLoop();  
  151.       
  152.     return 0;  
  153. }  


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

0 0