天地之灵学习小组
我们学习小组的OpenGL学习笔记 大家一定要互相折磨呀~~
posts - 150,  comments - 156,  trackbacks - 0

以前只知道,每隔固定一段时间都要重新画一遍屏幕,屏幕里面很简单,记分牌、瓶子及其内部、医生、帮助面板。就这么多而已,以前认为要画医生、药片、虫子只要调用画它们的函数就行了,诚然实际上也就是这样,但具体函数里面是什么就不晓得了。今天的操作系统课上想到了这个问题。记得刚开始看OpenGL的时候遇到了一个叫点画线和点画面的问题,当时只注意了一下点画线,点画面就被我一带而过。今天想到要画出具有真实感的医生、药片、虫子不妨就采用点画面来试一试。
自己的思路是这个样子的,就拿画药丸的函数drawPill(/*参数*/)来说吧,首先有个static int pill_mask[](应该是个全局的,免得每次画的时候都要重新读取图像)数组里面存放了药片各个点是否有颜色的信息,至于数组里面的信息是从哪里来的,当然是从一幅图中读进来的喽。读取图像的函数可以在网上找到的嘛。每次调用本函数之前先设置好颜色信息,就是要画什么颜色的药丸,然后使用glEnable(GL_POLYGON_STIPPLE);来启动点画面模式,void glPolygonStipple(const GLubyte *pill_mask[]);来指定用什么样的什么什么(不知道专业术语,想必这样说大家也能理解),然后就可以画多边形了,当然画出来的就是一个非常可爱的药丸啦,最后不要忘记关闭点画面模式glDisable(GL_POLYGON_STIPPLE);啦,顺便附上测试用的小图一张(在画图程序里面随便搞的,有点像虫子了)。
                                             

下面就是我的那个顽皮的小程序了,还请各位哥哥姐姐弟弟妹妹看一看,顺便改一改,先谢谢啦!

#include <stdio.h>
#include 
<stdlib.h>
#include 
<gl/glut.h>
static GLubyte pill_mask[50];
void read_pill()
{
    FILE 
*fp;
    fp 
= fopen("mask.jpg""rb");
    
if!fp )
        exit(
0);
    
if( fseek(fp, -(int)sizeof(pill_mask), SEEK_END) )
        exit(
0);
    
if!fread(pill_mask, sizeof(pill_mask), 1, fp) )
        exit(
0);
    fclose(fp);
}

void drawPill(void)
{
    glClear(GL_COLOR_BUFFER_BIT);
    glEnable(GL_POLYGON_STIPPLE);
    glPolygonStipple(pill_mask);
    glRectf(
-0.5,-0.5,0.5,0.5);
    glDisable(GL_POLYGON_STIPPLE);
    glFlush();
}

int main(int argc,char** argv)
{
    glutInit(
&argc,argv);
    glutInitDisplayMode(GLUT_SINGLE
|GLUT_RGB);
    glutInitWindowSize(
200,200);
    glutInitWindowPosition(
300,300);
    glutCreateWindow(
"Mask");
    glShadeModel(GL_FLAT);
    glutDisplayFunc(drawPill);
    glutMainLoop();
    
return 0;
}

没有注释的,还请多担待


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理



<2008年10月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

常用链接

留言簿(6)

随笔分类(149)

随笔档案(150)

同道中人

搜索

  •  

积分与排名

  • 积分 - 46147
  • 排名 - 475

最新随笔

最新评论

阅读排行榜

评论排行榜