首页 > 代码库 > 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_点画模式(点画多边形)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。