vs2008\drivers\opengl2.h.c 模拟灰色320*320屏幕

发布时间:2016-12-9 0:09:26 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"vs2008\drivers\opengl2.h.c 模拟灰色320*320屏幕",主要涉及到vs2008\drivers\opengl2.h.c 模拟灰色320*320屏幕方面的内容,对于vs2008\drivers\opengl2.h.c 模拟灰色320*320屏幕感兴趣的同学可以参考一下。

/****OpenGL模拟320*320灰色显示屏****/ /***************************************************************************************************                                     OpenGL模拟320*320灰色显示屏 文 件 名: opengl2.h 说    明: 将opengl改为了灰色显示 ***************************************************************************************************/ #ifndef __OPENGLLCD2__H #define __OPENGLLCD2__H /**************************************************************************************************/ #ifndef u16     #define u16 unsigned short                  //数据长度。 #endif #ifndef u32     #define u32 unsigned int                    //数据长度。 #endif #ifndef u8     #define u8 unsigned char                    //数据长度。 #endif     #define X_SIZE 320     #define Y_SIZE 320 #define GL2_FREASH_TIME()    Sleep(1)           //屏幕刷新时间间隔 1000/1/10=100Hz 建议不要改次设置 //************************************************************************************************** extern  u16 Gl2DisBuff[Y_SIZE][X_SIZE];          //显存区。向此写入数据即可改变颜色.与显示屏的接口。 /***************************************************************************************************                                     颜色定义 ***************************************************************************************************/ #define COLOUR_CLEAR2 0                         //初始化颜色 void    Gl2DisPoint(u32 x,u32 y, u8 Color); u16     Gl2DisPointGet(u32 x,u32 y); void    Gl2DisClear(void); void    GlDisHB(void); /***************************************************************************************************                                     功能函数 ***************************************************************************************************/ void    Gl2Init(void);                          //初始化后即会创建2个windows线程,以运行GL。 //----------------------------------显示------------------------------------------------------------ void    Gl2DisTset(void);                       //测试 /**************************************************************************************************/ #endif /***************************************************************************************************                                     OpenGL模拟320*320灰色显示屏 文 件 名: opengl2.c 编译环境:VS2008 win C/C++控制台空项目 注    意:不能与opengl一起使用 在opengl上改进 编    者:张永辉 2013年9月3日 ***************************************************************************************************/ #include<Windows.h> #include<process.h>                     //_beginthread #include <GL\glut.h> #pragma comment(lib, "opengl32.lib") #pragma comment(lib, "glu32.lib") #pragma comment(lib, "glut32.lib") #include "opengl2.h" /**************************************************************************************************/ //静态变量 static u32   FreshFlg = 0; static const GLint      ImageWidth =X_SIZE;         //使用OpenGL的GLint类型,它是32位的。 static const GLint      ImageHeight=Y_SIZE; static GLint            ImagelLength;               //图像缓冲占的字节长度 static GLubyte*         ImageDataP2;                //图像缓冲区指针更改该区域的值即可改变图像 static u32              SysTimeMs;                  //记录系统开机以来运行了的时间。与GL_FREASH_TIME相关 static int              TouchADx;                   //使用鼠标按下模拟触摸屏 static int              TouchADy; u16     Gl2DisBuff[Y_SIZE][X_SIZE];                 //显存区 每个字(16bit)表示一个颜色,0==白 1==黑 int  static IsGlTaskDisBuffCopyOK = 0;              //指示该任务已经开始工作了 u16     Gl2DisBuff[Y_SIZE][X_SIZE];                 //显存区 160*160个点==160*160 byte  ==1时亮 ==0时不亮 //两个任务 void static Gl2TaskStart (void * arg); void static Gl2TaskDisBuffCopy(void * arg); /***************************************************************************************************                                 任务函数:GlTaskStart 任务:GL将内存的颜色显示到显示屏 ***************************************************************************************************/ void Opengl2Test(void) {     while(1)     {         GL2_FREASH_TIME();         Sleep(1000);         Gl2DisClear();         Sleep(1000);         GlDisHB();     } } //显示黑白相间的图像,用于测试 void GlDisHB(void) {     int x = 0;     int y = 0;     for(x = 0;x < X_SIZE/3; x++)     {         for(y = 0;y <= Y_SIZE;y++)         {             Gl2DisPoint(x,y,0);         }     }     for(x = X_SIZE/3; x < 2*X_SIZE/3; x++)     {         for(y = 0;y <= Y_SIZE;y++)         {             Gl2DisPoint(x,y,1);         }     }     for(x = 2*X_SIZE/3; x < X_SIZE; x++)     {         for(y = 0;y <= Y_SIZE;y++)         {             Gl2DisPoint(x,y,0);         }     } } /***************************************************************************************************                                     初始化函数 ***************************************************************************************************/ void Gl2Init(void) {     static u32 flg;     u32 x , y;     //防止重复初始化     if(flg)     {         return;     }     flg = 1;     //--------------------显示屏初始化----------------------     //给背景色     for(y = 0; y < Y_SIZE ; y++)     {         for(x = 0; x < X_SIZE ; x++)         {             Gl2DisBuff[y][x] = COLOUR_CLEAR2;         }     }     //任务:GL将显存的颜色显示到显示屏     //      设置键盘按键回调函数     _beginthread(Gl2TaskStart,0,NULL);     //任务:将GlDisBuff的颜色刷新到显存     _beginthread(Gl2TaskDisBuffCopy,0,NULL);     while(IsGlTaskDisBuffCopyOK==0)     {         Sleep(1);     }     Sleep(1000); } /***************************************************************************************************                                     功能函数集 ***************************************************************************************************/ //----------------------------------显示------------------------------------------------------------ //函数功能:清屏 void Gl2DisClear(void) {     u32 x , y;     for(y = 0; y < Y_SIZE ; y++)     {         for(x = 0; x < X_SIZE ; x++)         {             Gl2DisBuff[y][x] = 0;         }     } } //函数功能:在屏幕上画点 //      x :    x坐标位置 0... X_SIZE-1 //      y :    y坐标位置 0... Y_SIZE-1 //      C :    ==0 or ==1黑色 //坐 标 系:左上角(0,0)  右下角(X_SIZE,Y_SIZE) void    Gl2DisPoint(u32 x,u32 y, u8 Color) {     if(x >= X_SIZE || y >= Y_SIZE)     {         return;     }     Gl2DisBuff[y][x] = Color; } u16   Gl2DisPointGet(u32 x,u32 y) {     if(x >= X_SIZE || y >= Y_SIZE)     {         return 0;     }     if(Gl2DisBuff[y][x]==0)     {         return 0;     }     return 1; } /***************************************************************************************************                                 任务函数:GlTaskDisBuffCopy 任务:将GlDisBuff的颜色刷新到显存 ***************************************************************************************************/ void static Gl2TaskDisBuffCopy(void * arg) {     GLint post,ypost;     GLubyte fr,fg,fb;     u32 x , y;     //u16 Color;     arg = arg;     //等待 GlTaskStart() 给ImageDataP分配储存空间后才能对ImageDataP操作。     GL2_FREASH_TIME();     GL2_FREASH_TIME();     while(1)     {         //决定刷新频率         GL2_FREASH_TIME();         SysTimeMs++;         if (SysTimeMs%10 != 0)         {             continue;         }         //把颜色从GlDisBuff复制到ImageDataP         for(y = 0; y < Y_SIZE ; y++)         {             ypost = (Y_SIZE-1-y)*X_SIZE;    //计算y坐标             for(x = 0; x < X_SIZE ; x++)             {                 //颜色变换 将565变成24位模式                 /*Color = Gl2DisBuff[y][x];                 fr = (GLubyte)((Color >> 8)|(0x07));                 fg = (GLubyte)((Color >> 3)|(0x03));                 fb = (GLubyte)((Color << 3));*/                 if(Gl2DisBuff[y][x]!=0)                 {                     fr = 35;            //黑                     fg = 40;                     fb = 30;                 }else                 {                     fr = 235;           //白                     fg = 240;                     fb = 230;                 }                 //坐标变换 ImageDataP坐标是:按笛卡尔坐标系的第一象限,x=[0 ... X_SIZE-1]  y=[0 ... Y_SIZE-1]                 post = (ypost + x)*3;                 //向缓冲区写入一个点的颜色                 ImageDataP2[post]   = fr;    //R                 ImageDataP2[post+1] = fg;    //G                 ImageDataP2[post+2] = fb;    //B             }         }         FreshFlg = 1;                       //与GlTaskStart()任务保持同步         IsGlTaskDisBuffCopyOK = 1;     } } /***************************************************************************************************                                 任务函数:GlTaskStart 任务:GL将内存的颜色显示到显示屏 ***************************************************************************************************/ void static GL2_Display(void);       //显示处理回调函数 void static GL2_Idle(void);          //CPU空闲时自动回调用的函数 //-------------------------------------------------------------------------------------------------- //函数功能:GL任务 void static Gl2TaskStart (void * arg) {     arg = arg;     //-------------------图形配置---------------------------     //计算图像大小     ImagelLength = ImageWidth *  3;                 //每个像素3字节     while(  ImagelLength % 4 != 0 )                 //修正LineLength使其为4的倍数     {         ++ImagelLength;                             //每一行像素数据的长度若不是4的倍数则填充数据使它是4的倍数     }     ImagelLength *=  ImageHeight;                   //PixelLength = ImageWidth*3*ImageHeight     //申请图像缓冲区     ImageDataP2 = (GLubyte*)malloc(ImagelLength);     glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);    //修改了参数为GLUT_DOUBLE     glutInitWindowPosition(100+500, 100);     glutInitWindowSize(X_SIZE,  Y_SIZE);     glutCreateWindow("COG模拟器");                      //窗口标题     glutDisplayFunc(&GL2_Display);     glutIdleFunc(&GL2_Idle);                         //新加入了这句     FreshFlg = 1;     //------------------按键配置----------------------------     //glutKeyboardFunc(GlKeyCallBacdk);               //设置回调函数即可     //------------------鼠标配置----------------------------     //glutPassiveMotionFunc(GlMouseMoveCallBack);     //鼠标位置跟踪     //glutMotionFunc(GlMouseClickMoveCallBack);       //鼠标位置跟踪 有按下后     //glutMouseFunc(GlMouseClickCallBack);            //鼠标按下,放开     //-------------------配置完成---------------------------     glutMainLoop();     free(ImageDataP2);     while (1)     {         GL2_FREASH_TIME();     } } void static GL2_Display(void) {     //glClear(GL_COLOR_BUFFER_BIT);//可以不要清屏,因为每次绘制时,画面都覆盖整个屏幕     //绘制像素     glDrawPixels(ImageWidth, ImageHeight,GL_BGR_EXT,GL_UNSIGNED_BYTE,ImageDataP2);     //完成绘制     glutSwapBuffers(); } void static GL2_Idle(void) {     //在CPU空闲时调用. 在这里可以添加程序,使扫描速度降低。     if(FreshFlg == 0)     {         return;     }     FreshFlg = 0;     GL2_Display(); }  

上一篇:android日志分析与记录.
下一篇:反射机制与系统耦合实例详解

相关文章

相关评论