最近在看文库上流传的《OpenGL入门教程(精)》学习OpenGL,看到(4)镂空多边形 觉得很有趣,好像可以用图片来填充多边形了,就找了张图片,按照书上说的,保存为单色的bimap,

然后用代码把它打开,保存在mask[]中(我这里的图片用的是800*500的,mask数组的长度相应的就为50000)结果填充出来的图案就很奇怪。

附上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]"走一波。


还是有问题,那是不是说只可以是32*32的呢?
还用这张图,我尝试了32*32的截法。

结果有点小惊喜!
但还是有点问题,这眼睛好像只有一半诶,于是我用二进制查看器打开了另一张32*32的单色位图,如下图所示:

发现这里和想象的不一样,不只是128byte,而是190byte,但看到最前面那里的“BM”,可能前面62byte是文件的属性信息吧?那传给glPolygonStipple的参数从63开始好了,于是把原来代码中的:
glPolygonStipple(mask);
替换成了:
glPolygonStipple(&mask[62]);
运行,成功!

结合Photoshop就可以做出一些比较好玩的东西: