/****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();
}