基于OpenGL 的3D图形绘制.docx
- 文档编号:27009722
- 上传时间:2023-06-25
- 格式:DOCX
- 页数:29
- 大小:104.59KB
基于OpenGL 的3D图形绘制.docx
《基于OpenGL 的3D图形绘制.docx》由会员分享,可在线阅读,更多相关《基于OpenGL 的3D图形绘制.docx(29页珍藏版)》请在冰豆网上搜索。
基于OpenGL的3D图形绘制
实验二基于OpenGL的3D图形绘制
一、实验目的与要求
1.学习OpenGL图形格式、数学原理;
2.掌握OpenGL基本图元的绘制,熟悉曲线、曲面、二次几何体的绘制技术;
3.掌握OpenGL光照、材质、纹理的基本原理;
4.掌握基于Win32、VisualC++环境绘制3D图形绘制原理、过程与步骤。
二、实验仪器与设备
1.微型电子计算机80台
2.Windows2000以上版本操作系统80套
3.VisualC++6.0开发系统80套
4.OpenGL2.0以上函数库80套
三、实验内容与步骤
本实验主要做使用图形绘制系统,实现线条,矩形,圆,文本等基本图形的绘制,保存与打开功能。
实验步骤如下。
1.设计流程图
图1设计流程图
2.关键代码解析
2.1基于Win32Conslole
voidbackground(void)
{
glClearColor(0.0,0.0,0.0,0.0);//设置背景颜色为黑色
}
voidmyDisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT);//buffer设置为颜色可写
glBegin(GL_TRIANGLES);//开始画三角形
glShadeModel(GL_SMOOTH);//设置为光滑明暗模式
glColor3f(1.0,0.0,0.0);//设置第一个顶点为红色
glVertex2f(-1.0,-1.0);//设置第一个顶点的坐标
glColor3f(0.0,1.0,0.0);//设置第二个顶点为绿色
glVertex2f(0.0,-1.0);//设置第二个顶点的坐标
glColor3f(0.0,0.0,1.0);//设置第三个顶点为蓝色
glVertex2f(-0.5,1.0);//设置第三个顶点的坐标
glEnd();//三角形结束
glPointSize(5.0f);
glBegin(GL_POINTS);
glVertex2f(1.0f,-0.5f);
glEnd();
glLineWidth(3.0f);
glBegin(GL_LINES);
glColor3f(1.0,0.0,0.0);//设置第一个顶点为红色
glVertex2f(0.3f,-1.0f);
glColor3f(0.0,1.0,0.0);//设置第二个顶点为绿色
glVertex2f(1.3f,-1.0f);
glEnd();
glBegin(GL_POLYGON);//画五边形
glColor3f(1.0,0.0,0.0);
glVertex2f(0.0f,0.0f);
glColor3f(0.0,1.0,0.0);
glVertex2f(1.0f,0.0f);
glColor3f(0.0,0.0,1.0);
glVertex2f(1.5f,1.0f);
glColor3f(1.0,1.0,0.0);
glVertex2f(0.5f,1.5f);
glColor3f(0.0,0.0,1.0);
glVertex2f(-0.5f,1.0f);
glEnd();//五边形结束
glFlush();//强制OpenGL函数运行
}
voidmyReshape(GLsizeiw,GLsizeih)
{
glViewport(0,0,w,h);//设置视口
glMatrixMode(GL_PROJECTION);//指明当前矩阵为GL_PROJECTION
glLoadIdentity();//将当前矩阵置换为单位阵
if(w<=h)
gluOrtho2D(-1.0,1.5,-1.5,1.5*(GLfloat)h/(GLfloat)w);
//定义二维正视投影矩阵
else
gluOrtho2D(-1.0,1.5*(GLfloat)w/(GLfloat)h,-1.5,1.5);
glMatrixMode(GL_MODELVIEW);//指明当前矩阵为GL_MODELVIEW
}
intmain(intargc,char**argv)
{
/*初始化*/
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(400,400);
glutInitWindowPosition(200,200);
/*创建窗口*/
glutCreateWindow("OpenGL_Win32Console-1071301211高磊");
/*绘制与显示*/
background();
glutReshapeFunc(myReshape);//注册当前窗口的形状变化回调函数
glutDisplayFunc(myDisplay);//注册当前窗口的显示回调函数
glutMainLoop();//进入GLUT事件处理循环
return(0);
}
2.2基于Win32API
intWINAPIWinMain(HINSTANCEhInstance,//实例
HINSTANCEhPrevInstance,//前一个实例
LPSTRlpCmdLine,//命令行参数
intnCmdShow)//窗口显示状态
{
MSGmsg;//Windowsx消息结构
BOOLdone=FALSE;//用来退出循环的Bool变量
//创建OpenGL窗口
if(!
CreateGLWindow("OpenGL_Win32C-1071301211高磊",640,480,16))
{
return0;//失败退出
}
while(!
done)//保持循环直到done=TRUE
{
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))//有消息在等待吗?
{
if(msg.message==WM_QUIT)//收到退出消息?
{
done=TRUE;
}
else
{
TranslateMessage(&msg);//翻译消息
DispatchMessage(&msg);//发送消息
}
}
else//如果没有消息
{
//绘制场景。
监视ESC键和来自DrawGLScene()的退出消息
if(active)//程序激活的么?
{
if(keys[VK_ESCAPE])//ESC按下了么?
{
done=TRUE;//ESC发出退出信号
}
else//不是退出的时候,刷新屏幕
{
DrawGLScene();//绘制场景
SwapBuffers(hDC);//交换缓存(双缓存)
}
}
}
}
KillGLWindow();//销毁窗口
return(msg.wParam);
}
BOOLCreateGLWindow(char*title,intwidth,intheight,intbits)
{
GLuintPixelFormat;//保存查找匹配的结果
WNDCLASSwc;//窗口类结构
DWORDdwExStyle;//扩展窗口风格
DWORDdwStyle;//窗口风格
RECTWindowRect;//取得矩形的左上角和右下角的坐标值
WindowRect.left=(long)0;//将Left设为0
WindowRect.right=(long)width;//将Right设为要求的宽度
WindowRect.top=(long)0;//将Top设为0
WindowRect.bottom=(long)height;//将Bottom设为要求的高度
hInstance=GetModuleHandle(NULL);//取得我们窗口的实例
wc.style=CS_HREDRAW|CS_VREDRAW|CS_OWNDC;//移动时重画,并为窗口取得DC
wc.lpfnWndProc=(WNDPROC)WndProc;//WndProc处理消息
wc.cbClsExtra=0;//无额外窗口数据
wc.cbWndExtra=0;//无额外窗口数据
wc.hInstance=hInstance;//设置实例
wc.hIcon=LoadIcon(NULL,IDI_WINLOGO);//装入缺省图标
wc.hCursor=LoadCursor(NULL,IDC_ARROW);//装入鼠标指针
wc.hbrBackground=NULL;//GL不需要背景
wc.lpszMenuName=NULL;//不需要菜单
wc.lpszClassName="OpenGL";//设定类名字
if(!
RegisterClass(&wc))//尝试注册窗口类
{
MessageBox(NULL,"窗口类注册失败!
","错误",MB_OK|MB_ICONEXCLAMATION);
returnFALSE;//退出并返回FALSE
}
dwExStyle=WS_EX_APPWINDOW|WS_EX_WINDOWEDGE;//扩展窗体风格
dwStyle=WS_OVERLAPPEDWINDOW;//窗体风格
//调整窗口达到真正要求的大小
AdjustWindowRectEx(&WindowRect,dwStyle,FALSE,dwExStyle);
if(!
(hWnd=CreateWindowEx(dwExStyle,//扩展窗体风格
"OpenGL",//类名字
title,//窗口标题
dwStyle|//必须的窗体风格属性
WS_CLIPSIBLINGS|//必须的窗体风格属性
WS_CLIPCHILDREN,//选择的窗体属性
0,0,//窗口位置
WindowRect.right-WindowRect.left,//计算调整好的窗口宽度
WindowRect.bottom-WindowRect.top,//计算调整好的窗口高度
NULL,//无父窗口
NULL,//无菜单
hInstance,//实例
NULL)))//不向WM_CREATE传递任何东东
{
KillGLWindow();//重置显示区
MessageBox(NULL,"窗口创建失败!
","错误",MB_OK|MB_ICONEXCLAMATION);
returnFALSE;
}
staticPIXELFORMATDESCRIPTORpfd=//告诉窗口我们所希望的东东
{
sizeof(PIXELFORMATDESCRIPTOR),//格式描述符的大小
1,//版本号
PFD_DRAW_TO_WINDOW|//格式必须支持窗口
PFD_SUPPORT_OPENGL|//格式必须支持OpenGL
PFD_DOUBLEBUFFER,//必须支持双缓冲
PFD_TYPE_RGBA,//申请RGBA格式
bits,//选定色彩深度
0,0,0,0,0,0,//忽略的色彩位
0,//无Alpha缓存
0,//忽略ShiftBit
0,//无聚集缓存
0,0,0,0,//忽略聚集位
16,//16位Z-缓存(深度缓存)
0,//无模板缓存
0,//无辅助缓存
PFD_MAIN_PLANE,//主绘图层
0,//保留
0,0,0//忽略层遮罩
};
if(!
(hDC=GetDC(hWnd)))//取得设备描述表了么?
{
KillGLWindow();//重置显示区
MessageBox(NULL,"创建GLDC失败!
","错误",MB_OK|MB_ICONEXCLAMATION);
returnFALSE;
}
if(!
(PixelFormat=ChoosePixelFormat(hDC,&pfd)))
{
KillGLWindow();//重置显示区
MessageBox(NULL,"找不到象素格式!
","错误",MB_OK|MB_ICONEXCLAMATION);
returnFALSE;
}
if(!
SetPixelFormat(hDC,PixelFormat,&pfd))
{
KillGLWindow();//重置显示区
MessageBox(NULL,"不能设置象素格式!
","错误",MB_OK|MB_ICONEXCLAMATION);
returnFALSE;
}
if(!
(hRC=wglCreateContext(hDC)))//能否取得着色描述表?
{
KillGLWindow();//重置显示区
MessageBox(NULL,"Can'tCreateAGLRenderingContext.","错误",MB_OK|MB_ICONEXCLAMATION);
returnFALSE;
}
if(!
wglMakeCurrent(hDC,hRC))//尝试激活着色描述表
{
KillGLWindow();//重置显示区
MessageBox(NULL,"创建GLRC失败!
","错误",MB_OK|MB_ICONEXCLAMATION);
returnFALSE;
}
ShowWindow(hWnd,SW_SHOW);//显示窗口
SetForegroundWindow(hWnd);//略略提高优先级
SetFocus(hWnd);//设置键盘的焦点至此窗口
ReSizeGLScene(width,height);//设置透视GL屏幕
if(!
InitGL())//初始化新建的GL窗口
{
KillGLWindow();//重置显示区
MessageBox(NULL,"初始化失败!
","错误",MB_OK|MB_ICONEXCLAMATION);
returnFALSE;
}
returnTRUE;
}
LRESULTCALLBACKWndProc(HWNDhWnd,//窗口的句柄
UINTuMsg,//窗口的消息
WPARAMwParam,//附加的消息内容
LPARAMlParam)//附加的消息内容
{
switch(uMsg)//检查Windows消息
{
caseWM_ACTIVATE:
//监视窗口激活消息
{
if(!
HIWORD(wParam))//检查最小化状态
active=TRUE;//程序处于激活状态
else
active=FALSE;//程序不再激活
return0;//返回消息循环
}
caseWM_SYSCOMMAND:
//中断系统命令
{
switch(wParam)//检查系统调用
{
caseSC_SCREENSAVE:
//屏保要运行?
caseSC_MONITORPOWER:
//显示器要进入节电模式?
return0;//阻止发生
}
break;//退出
}
caseWM_CLOSE:
//收到Close消息?
{
PostQuitMessage(0);//发出退出消息
return0;
}
caseWM_KEYDOWN:
//有键按下么?
{
keys[wParam]=TRUE;//如果是,设为TRUE
return0;//返回
}
caseWM_KEYUP:
//有键放开么?
{
keys[wParam]=FALSE;//如果是,设为FALSE
return0;//返回
}
caseWM_SIZE:
//调整OpenGL窗口大小
{
ReSizeGLScene(LOWORD(lParam),HIWORD(lParam));
return0;//返回
}
}
//向DefWindowProc传递所有未处理的消息。
returnDefWindowProc(hWnd,uMsg,wParam,lParam);
}
GLvoidKillGLWindow(GLvoid)
{
if(hRC)//拥有着色描述表吗?
{
if(!
wglMakeCurrent(NULL,NULL))//能否释放DC和RC描述表?
{
MessageBox(NULL,"释放DC、RC失败!
","关闭失败",MB_OK|MB_ICONINFORMATION);
}
if(!
wglDeleteContext(hRC))//能否删除RC?
{
MessageBox(NULL,"释放RC失败!
","关闭失败",MB_OK|MB_ICONINFORMATION);
}
hRC=NULL;//将RC设为NULL
}
if(hDC&&!
ReleaseDC(hWnd,hDC))//能否释放DC?
{
MessageBox(NULL,"释放DC失败!
",
"关闭失败",MB_OK|MB_ICONINFORMATION);
hDC=NULL;//将DC设为NULL
}
if(hWnd&&!
DestroyWindow(hWnd))//能否销毁窗口?
{
MessageBox(NULL,"销毁窗口失败!
","关闭失败",
MB_OK|MB_ICONINFORMATION);
hWnd=NULL;//将hWnd设为NULL
}
if(!
UnregisterClass("OpenGL",hInstance))//能否注销类?
{
MessageBox(NULL,"不能注销类!
",
"关闭失败",MB_OK|MB_ICONINFORMATION);
hInstance=NULL;//将hInstance设为NULL
}
}
intInitGL(GLvoid)
{
glShadeModel(GL_SMOOTH);//启用阴影平滑
glClearColor(255.0f,255.0f,255.0f,0.5f);//黑色背景
glClearDepth(1.0f);//设置深度缓存
glEnable(GL_DEPTH_TEST);//启用深度测试
glDepthFunc(GL_LEQUAL);//所作深度测试的类型
glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);//真正精细的透视修正
returnTRUE;//初始化OK
}
GLvoidReSizeGLScene(GLsizeiwidth,GLsizeiheight)//重置并初始化GL窗口大小
{
if(height==0)//防止被零除
{
height=1;//将Height设为1
}
glViewport(0,0,width,height);//重置当前的视口
glMatrixMode(GL_PROJECTION);//选择投影矩阵
glLoadIdentity();//重置投影矩阵
//计算窗口的外观比例
gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);
glMatrixMode(GL_MODELVIEW);//选择模型观察矩阵
glLoadIdentity();//重置模型观察矩阵
}
intDrawGLScene(GLvoid)
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);//清除屏幕及深度缓存
glLoadIdentity();//重置视口
glTranslatef(-1.5f,1.0f,-6.0f);//左移1.5单位,上移1.0,并移入屏幕6.0
glColor3f(1.0,0.0,0.0);//设置第一个顶点为红色
glBegin(GL_TRIANGLES);//绘制三角形
glVertex3f(0.0f,1.0f,0.0f);//上顶点
glVertex3f(-1.0f,-1.0f,0.0f);//左下
glVertex3f(1.0f,-1.0f,0.0f);//右下
glEnd();//三角形绘制结束
glTranslatef(3.0f,0.0f,0.0f);//右移3单位
glColor3f(0.0,0.0,1.0);
glBegin(GL_QUADS);//绘制矩形
glVertex3f(-1.0f,1.0f,0.0f);//左上
glVertex3f(1.5f,1.0f,0.0f);//右上
glVertex3f(1.5f,-1.0f,0.0f);//右下
glVertex3f(-1.0f,-1.0f,0.0f);//左下
glEnd();//矩形绘制结束
glTranslatef(-2.0f,-2.5f,2.0f);
glRotated(yAngle,0.0f,1.0f,0.0f
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于OpenGL 的3D图形绘制 基于 OpenGL 图形 绘制