最近在看文库上流传的《OpenGL入门教程(精)》学习OpenGL,看到(4)镂空多边形 觉得很有趣,好像可以用图片来填充多边形了,就找了张图片,按照书上说的,保存为单色的bimap,
![](https://i-blog.csdnimg.cn/blog_migrate/cf3bf8d2f21f20288aa07476d18dcd06.png)
然后用代码把它打开,保存在mask[]中(我这里的图片用的是800*500的,mask数组的长度相应的就为50000)结果填充出来的图案就很奇怪。
![](https://i-blog.csdnimg.cn/blog_migrate/2db96e334fe111566c5714d9aa7ea360.png)
附上display()函数的代码段:
void display()
{
static GLubyte mask[50000];
ifstream ifile;
ifile.open("ting.bmp", ios::binary | ios::in);
ifile.read((char*)mask, 50000);
ifile.close();
glClear(GL_COLOR_BUFFER_BIT);
glEnable(GL_POLYGON_STIPPLE);
glPolygonStipple(mask);
glRectf(-1, -1, 0, 0);
glDisable(GL_POLYGON_STIPPLE);
glRectf(0, 0, 1, 1);
glFlush();
}
想着会不会是图片尺寸太大了,就改小了一点(40*20),把"mask[50000]"改成"mask[100]"走一波。
![](https://i-blog.csdnimg.cn/blog_migrate/441f9bd6fef46802ebe90a8f4c6ddb72.png)
![](https://i-blog.csdnimg.cn/blog_migrate/4123a679c0ce5ecab242b3be8970ab06.png)
还是有问题,那是不是说只可以是32*32的呢?
还用这张图,我尝试了32*32的截法。
![](https://i-blog.csdnimg.cn/blog_migrate/4dc0d55433419ec6dd4d198bf78dfec8.png)
结果有点小惊喜!
但还是有点问题,这眼睛好像只有一半诶,于是我用二进制查看器打开了另一张32*32的单色位图,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/c8198794d24317296a59bfcf525db376.png)
发现这里和想象的不一样,不只是128byte,而是190byte,但看到最前面那里的“BM”,可能前面62byte是文件的属性信息吧?那传给glPolygonStipple的参数从63开始好了,于是把原来代码中的:
glPolygonStipple(mask);
替换成了:
glPolygonStipple(&mask[62]);
运行,成功!
![](https://i-blog.csdnimg.cn/blog_migrate/b2a909c112f01306de32599db484ead3.png)
结合Photoshop就可以做出一些比较好玩的东西: