下载

1下载券

加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 VC+OpenGL 编程

VC+OpenGL 编程.doc

VC+OpenGL 编程

seven
2011-06-19 0人阅读 举报 0 0 暂无简介

简介:本文档为《VC+OpenGL 编程doc》,可适用于IT/计算机领域

VCOpenGL编程:迈出第一步中国科学技术大学老道Email:qhchennetOpenGL作图非常方便故日益流行但对许多人来说是在微机上进行的首先碰到的问题是如何适应微机环境。这往往是最关键的一步虽然也是最初级的。一般的,我不建议使用glut包那样难以充分发挥windows的界面上的功能下面介绍如何在VC上进行OpenGL编程。OpenGL绘图的一般过程可以看作这样的,先用OpenGL语句在OpenGL的绘图环境RenderContext(RC)中画好图,然后再通过一个Swapbuffer的过程把图传给操作系统的绘图环境DeviceContext(DC)中,实实在在地画出到屏幕上下面以画一条Bezier曲线为例详细介绍VC上OpenGL编程的方法。文中给出了详细注释以便给初学者明确的指引。一步一步地按所述去做你将顺利地画出第一个OpenGL平台上的图形来。(本文例子以VC为背景)一、产生程序框架TestdswNewProject|MFCApplicationWizard(EXE)|"Test"|OK*注*:加“”者指要手工敲入的字串二、导入Bezier曲线类的文件。用下面方法产生BezierCurvehBezierCurvecpp两个文件:WorkSpace|ClassView|TestClasses|<右击弹出>NewClass|GenericClass(不用MFC类)|"CBezierCurve"|OK三、编辑好Bezier曲线类的定义与实现。写好下面两个文件:BezierCurvehBezierCurvecpp四、设置编译环境:在BezierCurveh和TestViewh内各加上:#include<GLglh>#include<GLgluh>#include<GLglauxh>在集成环境中Project|Settings|Link|Objectlibrarymodule|"opengllibglulibglauxlib"|OK五、设置OpenGL工作环境:(下面各个操作均针对TestViewcpp)处理PreCreateWindow():设置OpenGL绘图窗口的风格csstyle|=WSCLIPSIBLINGS|WSCLIPCHILDREN|CSOWNDC处理OnCreate():创建OpenGL的绘图设备。OpenGL绘图的机制是:先用OpenGL的绘图上下文RenderingContext(简称为RC)把图画好再把所绘结果通过SwapBuffer()函数传给Window的绘图上下文DeviceContext(简记为DC)要注意的是程序运行过程中可以有多个DC但只能有一个RC。因此当一个DC画完图后要立即释放RC以便其它的DC也使用。在后面的代码中将有详细注释。intCTestView::OnCreate(LPCREATESTRUCTlpCreateStruct){if(CView::OnCreate(lpCreateStruct)==)returnmyInitOpenGL()return}voidCTestView::myInitOpenGL(){mpDC=newCClientDC(this)创建DCASSERT(mpDC!=)if(!mySetupPixelFormat())设定绘图的位图格式函数下面列出returnmhRC=wglCreateContext(mpDC>mhDC)创建RCwglMakeCurrent(mpDC>mhDC,mhRC)RC与当前DC相关联}CClient*mpDCHGLRCmhRC是CTestView的成员变量BOOLCTestView::mySetupPixelFormat(){我们暂时不管格式的具体内容是什么,以后熟悉了再改变格式staticPIXELFORMATDESCRIPTORpfd={sizeof(PIXELFORMATDESCRIPTOR),sizeofthispfd,versionnumberPFDDRAWTOWINDOW|supportwindowPFDSUPPORTOPENGL|supportOpenGLPFDDOUBLEBUFFER,doublebufferedPFDTYPERGBA,RGBAtype,bitcolordepth,,,,,,colorbitsignored,noalphabuffer,shiftbitignored,noaccumulationbuffer,,,,accumbitsignored,bitzbuffer,nostencilbuffer,noauxiliarybufferPFDMAINPLANE,mainlayer,reserved,,layermasksignored}intpixelformatif((pixelformat=ChoosePixelFormat(mpDC>mhDC,pfd))==){MessageBox("ChoosePixelFormatfailed")returnFALSE}if(SetPixelFormat(mpDC>mhDC,pixelformat,pfd)==FALSE){MessageBox("SetPixelFormatfailed")returnFALSE}returnTRUE}处理OnDestroy()voidCTestView::OnDestroy(){wglMakeCurrent(mpDC>mhDC,)释放与mhDC对应的RCwglDeleteContext(mhRC)删除RCif(mpDC)deletempDC删除当前View拥有的DCCView::OnDestroy()}处理OnEraseBkgnd()BOOLCTestView::OnEraseBkgnd(CDC*pDC){TODO:AddyourmessagehandlercodehereandorcalldefaultreturnCView::OnEraseBkgnd(pDC)把这句话注释掉若不然Window会用白色北景来刷新导致画面闪烁returnTRUE只要空返回即可。}处理OnDraw()voidCTestView::OnDraw(CDC*pDC){wglMakeCurrent(mpDC>mhDC,mhRC)使RC与当前DC相关联myDrawScene()具体的绘图函数在RC中绘制SwapBuffers(mpDC>mhDC)把RC中所绘传到当前的DC上从而在屏幕上显示wglMakeCurrent(mpDC>mhDC,)释放RC以便其它DC进行绘图}voidCTestView::myDrawScene(){glClearColor(f,f,f,f)设置背景颜色为黑色glClear(GLCOLORBUFFERBIT|GLDEPTHBUFFERBIT)glPushMatrix()glTranslated(f,f,f)把物体沿(,,)方向平移以便投影时可见。因为缺省的视点在(,,),只有移开物体才能可见。本例是为了演示平面Bezier曲线的只要作一个旋转变换可更清楚的看到其D效果。下面画一条Bezier曲线beziercurvemyPolygon()画Bezier曲线的控制多边形beziercurvemyDraw()CBezierCurvebeziercurve是CTestView的成员变量具体的函数见附录glPopMatrix()glFlush()结束RC绘图return}处理OnSize()voidCTestView::OnSize(UINTnType,intcx,intcy){CView::OnSize(nType,cx,cy)VERIFY(wglMakeCurrent(mpDC>mhDC,mhRC))确认RC与当前DC关联w=cxh=cyVERIFY(wglMakeCurrent(,))确认DC释放RC}处理OnLButtonDown()voidCTestView::OnLButtonDown(UINTnFlags,CPointpoint){CView::OnLButtonDown(nFlags,point)if(beziercurvemN>MAX){MessageBox("顶点个数超过了最大数MAX=")return}以下为坐标变换作准备GetClientRect(mClientRect)获取视口区域大小w=mClientRectrightmClientRectleft视口宽度wh=mClientRectbottommClientRecttop视口高度hw,h是CTestView的成员变量centerx=(mClientRectleftmClientRectright)中心位置centery=(mClientRecttopmClientRectbottom)取之作原点centerx,centery是CTestView的成员变量GLdoubletmpx,tmpytmpx=scrxglx(pointx)屏幕上点坐标转化为OpenGL画图的规范坐标tmpy=scrygly(pointy)beziercurvemVertexbeziercurvemNx=tmpx加一个顶点beziercurvemVertexbeziercurvemNy=tmpybeziercurvemN顶点数加一InvalidateRect(,TRUE)发送刷新重绘消息}doubleCTestView::scrxglx(intscrx){return(double)(scrxcenterx)double(h)}doubleCTestView::scrygly(intscry){}附录:CBezierCurve的声明:(BezierCurveh)classCBezierCurve{public:myPOINTDmVertexMAX控制顶点以数组存储myPOINTD是一个存二维点的结构成员为Gldoublex,yintmN控制顶点的个数public:CBezierCurve()virtual~CBezierCurve()voidbeziergeneration(myPOINTDPMAX,intlevel)算法的具体实现voidmyDraw()画曲线函数voidmyPolygon()画控制多边形}CBezierCurve的实现:(BezierCurvecpp)CBezierCurve::CBezierCurve(){mN=mVertexx=fmVertexy=fmVertexx=fmVertexy=fmVertexx=fmVertexy=fmVertexx=fmVertexy=f}CBezierCurve::~CBezierCurve(){}voidCBezierCurve::myDraw(){beziergeneration(mVertex,LEVEL)}voidCBezierCurve::beziergeneration(myPOINTDPMAX,intlevel){算法的具体描述请参考相关书本inti,jlevelif(level<)returnif(level==){glColorf(f,f,f)glBegin(GLLINES)画出线段glVertexd(Px,Py)glVertexd(PmNx,PmNy)glEnd()结束画线段return递归到了最底层跳出递归}myPOINTDQMAX,RMAXfor(i=i<MNI){Qix=PixQiy=Piy}for(i=i<mNi){RmNix=QmNxRmNiy=QmNyfor(j=mNj>=ij){Qjx=(QjxQjx)double()Qjy=(QjyQjy)double()}}Rx=QmNxRy=QmNybeziergeneration(Q,level)beziergeneration(R,level)}voidCBezierCurve::myPolygon(){glBegin(GLLINESTRIP)画出连线段glColorf(f,f,f)for(inti=i<mNi){glVertexd(mVertexix,mVertexiy)}glEnd()结束画连线段}*************本文结束****************************

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/8

VC+OpenGL 编程

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利