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

论坛 期权论坛 脚本     
匿名网站用户   2020-12-20 02:46   56   0
在默认情况下,填充多边形是用实心模式绘制的。此外,它们还可以使用一种32位×32位的窗口对齐的点画模式。glPolygonStipple()函数用于指定多边形的点画模式。
  1. voidglPolygonStipple(constGLubyte*mask);

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

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

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


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

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:1136255
帖子:227251
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP