永发信息网

说说过opengl。。。。

答案:1  悬赏:40  手机版
解决时间 2021-05-04 18:55
各位高手说说现在opengl的应用,我想了解一下现在的应用范围,游戏,机械设计等方面,谢啦
最佳答案
OpenGL作图非常方便,故日益流行,但对许多人来说,是在微机上进行的,首先碰到的问题是,如何适应微机环境。这往往是最关键的一步,虽然也是最初级的。一般的,我不建议使用glut 包.那样难以充分发挥 windows 的界面上的功能. OpenGL 在VC环境下的编程步骤: 建立基于OpenGL的应用程序框架 创建项目:在file -> New中建立项目,基于单文档,View类基于Cview 添加库:在project->Setting中指定库 初始化:选择View->Class Wizard,打开MFC对话框,添加相应的定义 添加类成员说明 基于OpenGL的程序框架已经构造好,以后用户只需要在对应的函数中添加程序代码即可。 下面介绍如何在 VC++ 上进行 OpenGL 编程。 OpenGL 绘图的一般过程可以看作这样的,先用 OpenGL 语句在 OpenGL 的绘图环境 RenderContext (RC)中画好图, 然后再通过一个 Swap buffer 的过程把图传给操作系统的绘图环境 DeviceContext (DC)中,实实在在地画出到屏幕上. 下面以画一条 Bezier 曲线为例,详细介绍VC++ 上 OpenGL编程的方法。文中给出了详细注释,以便给初学者明确的指引。一步一步地按所述去做,你将顺利地画出第一个 OpenGL 平台上的图形来。 一、产生程序框架 Test.dsw New Project | MFC Application Wizard (EXE) | "Test" | OK *注* : 加“”者指要手工敲入的字串 二、导入 Bezier 曲线类的文件 用下面方法产生 BezierCurve.h BezierCurve.cpp 两个文件: WorkSpace | ClassView | Test Classes| <右击弹出> New Class | Generic Class(不用MFC类) | "CBezierCurve" | OK 三、编辑好 Bezier 曲线类的定义与实现 写好下面两个文件: BezierCurve.h BezierCurve.cpp 四、设置编译环境: 1. 在 BezierCurve.h 和 TestView.h 内各加上: #include <GL/gl.h> #include <GL/glu.h> #include <GL/glaux.h> 2. 在集成环境中 Project | Settings | Link | Object/library module | "opengl32.lib glu32.lib glaux.lib" | OK 五、设置 OpenGL 工作环境:(下面各个操作,均针对 TestView.cpp ) 1. 处理 PreCreateWindow(): 设置 OpenGL 绘图窗口的风格 cs.style |= WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CS_OWNDC; 2. 处理 OnCreate():创建 OpenGL 的绘图设备。 OpenGL 绘图的机制是: 先用 OpenGL 的绘图上下文 Rendering Context (简称为 RC )把图画好,再把所绘结果通过 SwapBuffer() 函数传给 Window 的 绘图上下文 Device Context (简记为 DC).要注意的是,程序运行过程中,可以有多个 DC,但只能有一个 RC。因此当一个 DC 画完图后,要立即释放 RC,以便其它的 DC 也使用。在后面的代码中,将有详细注释。 int CTestView::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CView::OnCreate(lpCreateStruct) == -1) return -1; myInitOpenGL(); return 0; } void CTestView::myInitOpenGL() { m_pDC = new CClientDC(this); //创建 DC ASSERT(m_pDC != NULL); if (!mySetupPixelFormat()) //设定绘图的位图格式,函数下面列出 return; m_hRC = wglCreateContext(m_pDC->m_hDC);//创建 RC wglMakeCurrent(m_pDC->m_hDC, m_hRC); //RC 与当前 DC 相关联 } //CClient * m_pDC; HGLRC m_hRC; 是 CTestView 的成员变量 BOOL CTestView::mySetupPixelFormat() {//我们暂时不管格式的具体内容是什么,以后熟悉了再改变格式 static PIXELFORMATDESCRIPTOR pfd = { sizeof(PIXELFORMATDESCRIPTOR), // size of this pfd 1, // version number PFD_DRAW_TO_WINDOW | // support window PFD_SUPPORT_OPENGL | // support OpenGL PFD_DOUBLEBUFFER, // double buffered PFD_TYPE_RGBA, // RGBA type 24, // 24-bit color depth 0, 0, 0, 0, 0, 0, // color bits ignored 0, // no alpha buffer 0, // shift bit ignored 0, // no accumulation buffer 0, 0, 0, 0, // accum bits ignored 32, // 32-bit z-buffer 0, // no stencil buffer 0, // no auxiliary buffer PFD_MAIN_PLANE, // main layer 0, // reserved 0, 0, 0 // layer masks ignored }; int pixelformat; if ( (pixelformat = ChoosePixelFormat(m_pDC->m_hDC, &pfd)) == 0 ) { MessageBox("ChoosePixelFormat failed"); return FALSE; } if (SetPixelFormat(m_pDC->m_hDC, pixelformat, &pfd) == FALSE) { MessageBox("SetPixelFormat failed"); return FALSE; } return TRUE; } 3. 处理 OnDestroy() void CTestView::OnDestroy() { wglMakeCurrent(m_pDC->m_hDC,NULL); //释放与m_hDC 对应的 RC wglDeleteContext(m_hRC); //删除 RC if (m_pDC) delete m_pDC; //删除当前 View 拥有的 DC CView::OnDestroy(); } 4. 处理 OnEraseBkgnd() BOOL CTestView::OnEraseBkgnd(CDC* pDC) { // TODO: Add your message handler code here and/or call default // return CView::OnEraseBkgnd(pDC); //把这句话注释掉,若不然,Window //会用白色北景来刷新,导致画面闪烁 return TRUE;//只要空返回即可。 } 5. 处理 OnDraw() void CTestView::OnDraw(CDC* pDC) { wglMakeCurrent(m_pDC->m_hDC,m_hRC);//使 RC 与当前 DC 相关联 myDrawScene( ); //具体的绘图函数,在 RC 中绘制 SwapBuffers(m_pDC->m_hDC);//把 RC 中所绘传到当前的 DC 上,从而 //在屏幕上显示 wglMakeCurrent(m_pDC->m_hDC,NULL);//释放 RC,以便其它 DC 进行绘图 } void CTestView::myDrawScene( ) { glClearColor(0.0f,0.0f,0.0f,1.0f);//设置背景颜色为黑色 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glPushMatrix(); glTranslated(0.0f,0.0f,-3.0f);//把物体沿(0,0,-1)方向平移 //以便投影时可见。因为缺省的视点在(0,0,0),只有移开 //物体才能可见。 //本例是为了演示平面 Bezier 曲线的,只要作一个旋转 //变换,可更清楚的看到其 3D 效果。 //下面画一条 Bezier 曲线 bezier_curve.myPolygon();//画Bezier曲线的控制多边形 bezier_curve.myDraw(); //CBezierCurve bezier_curve //是 CTestView 的成员变量 //具体的函数见附录 glPopMatrix(); glFlush(); //结束 RC 绘图 return; } 6. 处理 OnSize() void CTestView::OnSize(UINT nType, int cx, int cy) { CView::OnSize(nType, cx, cy); VERIFY(wglMakeCurrent(m_pDC->m_hDC,m_hRC));//确认RC与当前DC关联 w=cx; h=cy; VERIFY(wglMakeCurrent(NULL,NULL));//确认DC释放RC } 7 处理 OnLButtonDown() void CTestView::OnLButtonDown(UINT nFlags, CPoint point) { CView::OnLButtonDown(nFlags, point); if(bezier_curve.m_N>MAX-1) { MessageBox("顶点个数超过了最大数MAX=50"); return; } //以下为坐标变换作准备 GetClientRect(&m_ClientRect);//获取视口区域大小 w=m_ClientRect.right-m_ClientRect.left;//视口宽度 w h=m_ClientRect.bottom-m_ClientRect.top;//视口高度 h //w,h 是CTestView的成员变量 centerx=(m_ClientRect.left+m_ClientRect.right)/2;//中心位置, centery=(m_ClientRect.top+m_ClientRect.bottom)/2;//取之作原点 //centerx,centery 是 CTestView 的成员变量 GLdouble tmpx,tmpy; tmpx=scrx2glx(point.x);//屏幕上点坐标转化为OpenGL画图的规范坐标 tmpy=scry2gly(point.y); bezier_curve.m_Vertex[bezier_curve.m_N].x=tmpx;//加一个顶点 bezier_curve.m_Vertex[bezier_curve.m_N].y=tmpy; bezier_curve.m_N++;//顶点数加一 InvalidateRect(NULL,TRUE);//发送刷新重绘消息 } double CTestView::scrx2glx(int scrx) { return (double)(scrx-centerx)/double(h); } double CTestView::scry2gly(int scry) { } 附录: 1.CBezierCurve 的声明: (BezierCurve.h) class CBezierCurve { public: myPOINT2D m_Vertex[MAX];//控制顶点,以数组存储 //myPOINT2D 是一个存二维点的结构 //成员为Gldouble x,y int m_N; //控制顶点的个数 public: CBezierCurve(); virtual ~CBezierCurve(); void bezier_generation(myPOINT2D P[MAX],int level); //算法的具体实现 void myDraw();//画曲线函数 void myPolygon(); //画控制多边形 }; 2. CBezierCurve 的实现: (BezierCurve.cpp) CBezierCurve::CBezierCurve() { m_N=4; m_Vertex[0].x=-0.5f; m_Vertex[0].y=-0.5f; m_Vertex[1].x=-0.5f; m_Vertex[1].y=0.5f; m_Vertex[2].x=0.5f; m_Vertex[2].y=0.5f; m_Vertex[3].x=0.5f; m_Vertex[3].y=-0.5f; } CBezierCurve::~CBezierCurve() { } void CBezierCurve::myDraw() { bezier_generation(m_Vertex,LEVEL); } void CBezierCurve::bezier_generation(myPOINT2D P[MAX], int level) { //算法的具体描述,请参考相关书本 int i,j; level--; if(level<0)return; if(level==0) { glColor3f(1.0f,1.0f,1.0f); glBegin(GL_LINES); //画出线段 glVertex2d(P[0].x,P[0].y); glVertex2d(P[m_N-1].x,P[m_N-1].y); glEnd();//结束画线段 return; //递归到了最底层,跳出递归 } myPOINT2D Q[MAX],R[MAX]; for(i=0;i { Q.x=P.x; Q.y=P.y; } for(i=1;i<m_N;i++) { R[m_N-i].x=Q[m_N-1].x; R[m_N-i].y=Q[m_N-1].y; for(j=m_N-1;j>=i;j--) { Q[j].x=(Q[j-1].x+Q[j].x)/double(2); Q[j].y=(Q[j-1].y+Q[j].y)/double(2); } } R[0].x=Q[m_N-1].x; R[0].y=Q[m_N-1].y; bezier_generation(Q,level); bezier_generation(R,level); } void CBezierCurve::myPolygon() { glBegin(GL_LINE_STRIP); //画出连线段 glColor3f(0.2f,0.4f,0.4f); for(int i=0;i<m_N;i++) { glVertex2d(m_Vertex.x,m_Vertex.y); } glEnd();//结束画连线段 }
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
找江苏的特色零食
关于回忆美好的古诗词,有关回忆的古诗句
组装电脑只要主机配件中上配置有什么介绍
求属鼠女宝宝姓管
发送什么短信内容开通会员和黄钻?
电脑开机慢,频繁死机
野山药腊排骨火腿鸡地址在哪,我要去那里办事
谁给我个凤凰刷机2008破解版的下载网址
大明龙权怎样升级快呢
怎么向空间传视频?
有灵魂的近义词,精神领袖的近义词是什么?
我的女朋友体制弱,经常生病感冒的,打病小病
身份证最快多长时候可以办好
快速增高有咩办法
黄钻游戏人生怎么开?
推荐资讯
笔记本的风扇在哪,联想G40的风扇除尘在哪?
电工这个专业目前到底怎么样
某原素R的氯化物的化学式为RCl n,这个氯化物
怎么能减肥?谁有好方法
中国人是谁唱的?
悲远嫁有什么诗词,描写华夏的诗词
生鱼片好不好吃
天龙八部哪派最牛B?
我用的是诺基亚6700c的手机,为什么我下载的
神木市隆星化工有限公司这个地址在什么地方,
牧羊犬肝腹水 怎么办
孔子名言中有关德治的问题
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?