OpenGL及其在VC_开发环境下的编程实现
- 格式:pdf
- 大小:190.91 KB
- 文档页数:4
如何在vc++6.0里面使用openGl?你既可以建立Win32项目使用API,也可以建立MFC工程(一般不用MFC框架直接用API)我给你一个例子吧,建立Win32空项目,添加一个cpp文件,编译执行就行了(这是一个经典的opengl框架了)代码如下:#pragma comment(lib,"opengl32.lib")#pragma comment(lib,"glu32.lib")#pragma comment(lib,"glaux.lib")#include <windows.h>#include <gl/gl.h>#include <gl/glu.h>#include <gl/glaux.h>HDC hDC=NULL;HGLRC hRC=NULL;HWND hWnd=NULL;HINSTANCE hInstance;BOOL keys[256];BOOL active=TRUE;BOOL fullscreen=TRUE;GLfloat rtri;GLfloat rquad;LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);GLvoid ResizeGLScene(GLsizei width,GLsizei height){if(height==0)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();}int InitGL(GLvoid){glShadeModel(GL_SMOOTH);glClearColor(0.0f,0.0f,0.0f,0.5f);glClearDepth(1.0f);glEnable(GL_DEPTH_TEST);glDepthFunc(GL_LEQUAL);glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST); return TRUE;}int DrawGLScene(GLvoid){glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glLoadIdentity();glTranslatef(-1.5f,0.0f,-6.0f);glRotatef(rtri,0.0f,1.0f,0.0f);glBegin(GL_TRIANGLES);glColor3f(1.0f,0.0f,0.0f);glVertex3f(0.0f,1.0f,0.0f);glColor3f(0.0f,1.0f,0.0f);glVertex3f(-1.0f,-1.0f,1.0f);glColor3f(0.0f,0.0f,1.0f);glVertex3f(1.0f,-1.0f,1.0f);glColor3f(1.0f,0.0f,0.0f);glVertex3f(0.0f,1.0f,0.0f);glColor3f(0.0f,0.0f,1.0f);glVertex3f(1.0f,-1.0f,1.0f);glColor3f(0.0f,1.0f,0.0f);glVertex3f(1.0f,-1.0f,-1.0f);glColor3f(1.0f,0.0f,0.0f);glVertex3f(0.0f,1.0f,0.0f);glColor3f(0.0f,1.0f,0.0f);glVertex3f(1.0f,-1.0f,-1.0f);glColor3f(0.0f,0.0f,1.0f);glVertex3f(-1.0f,-1.0f,-1.0f);glColor3f(1.0f,0.0f,0.0f);glVertex3f(0.0f,1.0f,0.0f);glVertex3f(-1.0f,-1.0f,-1.0f); glColor3f(0.0f,1.0f,0.0f); glVertex3f(-1.0f,-1.0f,1.0f); glEnd();glLoadIdentity(); glTranslatef(1.5f,0.0f,-7.0f); glRotatef(rquad,1.0f,1.0f,1.0f); glBegin(GL_QUADS); glColor3f(0.0f,1.0f,0.0f); glVertex3f(1.0f,1.0f,-1.0f); glVertex3f(-1.0f,1.0f,-1.0f); glVertex3f(-1.0f,1.0f,1.0f); glVertex3f(1.0f,1.0f,1.0f);glColor3f(1.0f,0.5f,0.0f); glVertex3f(1.0f,-1.0f,1.0f); glVertex3f(-1.0f,-1.0f,1.0f); glVertex3f(-1.0f,-1.0f,-1.0f); glVertex3f(1.0f,-1.0f,-1.0f);glColor3f(1.0f,0.0f,0.0f); glVertex3f(1.0f,1.0f,1.0f); glVertex3f(-1.0f,1.0f,1.0f); glVertex3f(-1.0f,-1.0f,1.0f); glVertex3f(1.0f,-1.0f,1.0f);glColor3f(1.0f,1.0f,0.0f);//glVertex3f(1.0f,-1.0f,-1.0f); //glVertex3f(-1.0f,-1.0f,-1.0f); //glVertex3f(-1.0f,1.0f,-1.0f); //glVertex3f(1.0f,1.0f,-1.0f); glVertex3f(-1.0f,1.0f,-1.0f); glVertex3f(1.0f,1.0f,-1.0f); glVertex3f(1.0f,-1.0f,-1.0f); glVertex3f(-1.0f,-1.0f,-1.0f);glColor3f(0.0f,0.0f,1.0f); glVertex3f(-1.0f,1.0f,1.0f); glVertex3f(-1.0f,1.0f,-1.0f); glVertex3f(-1.0f,-1.0f,-1.0f); glVertex3f(-1.0f,-1.0f,1.0f);glVertex3f(1.0f,1.0f,-1.0f);glVertex3f(1.0f,1.0f,1.0f);glVertex3f(1.0f,-1.0f,1.0f);glVertex3f(1.0f,-1.0f,-1.0f);glEnd();rtri+=0.2f;rquad-=0.15f;return TRUE;}GLvoid KillGLWindow(GLvoid){if(fullscreen){ChangeDisplaySettings(NULL,0);ShowCursor(TRUE);}if(hRC){if(!wglMakeCurrent(NULL,NULL))MessageBox(NULL,"释放DC或RC失败","关闭错误",MB_OK|MB_ICONINFORMA TION);if(!wglDeleteContext(hRC))MessageBox(NULL,"释放RC失败","关闭错误",MB_OK|MB_ICONINFORMATION); hRC=NULL;}if(hDC && !ReleaseDC(hWnd,hDC)){MessageBox(NULL,"释放DC失败","关闭错误",MB_OK|MB_ICONINFORMATION); hDC=NULL;}if(hWnd && !DestroyWindow(hWnd)){MessageBox(NULL,"释放窗口句柄失败","关闭错误",MB_OK|MB_ICONINFORMA TION); hWnd=NULL;}if(!UnregisterClass("OpenG",hInstance)){MessageBox(NULL,"不能注销窗口类","关闭错误",MB_OK|MB_ICONINFORMATION); hInstance=NULL;}}BOOL CreateGLWindow(char* title,int width,int height,int bits,BOOL fullscreenflag){GLuint PixelFormat;WNDCLASS wc;DWORD dwExStyle;DWORD dwStyle;RECT WindowRect;WindowRect.left=(long)0;WindowRect.right=(long)width;WindowRect.top=(long)0;WindowRect.bottom=(long)height;fullscreen=fullscreenflag;hInstance=GetModuleHandle(NULL);wc.style=CS_HREDRAW|CS_VREDRAW|CS_OWNDC;wc.lpfnWndProc=(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;wc.lpszMenuName=NULL;wc.lpszClassName="OpenG";if(!RegisterClass(&wc)){MessageBox(NULL,"注册窗口失败","错误",MB_OK|MB_ICONINFORMATION); return FALSE;}if(fullscreen){DEVMODE dmScreenSettings;memset(&dmScreenSettings,0,sizeof(dmScreenSettings));dmScreenSettings.dmSize=sizeof(dmScreenSettings);dmScreenSettings.dmPelsWidth=width;dmScreenSettings.dmPelsHeight=height;dmScreenSettings.dmBitsPerPel=bits;dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;if(ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN)!=DISP_CHANGE_SUCCE SSFUL){if(MessageBox(NULL,"全屏模式设置失败!\n使用窗口模式?","OpenGL 3D游戏编程",MB_YESNO|MB_ICONEXCLAMA TION)==IDYES){fullscreen=FALSE;}else{MessageBox(NULL,"程序将被关闭","错误",MB_OK|MB_ICONINFORMA TION);return FALSE;}}}if(fullscreen){dwExStyle=WS_EX_APPWINDOW;dwStyle=WS_POPUP;ShowCursor(FALSE);}else{dwExStyle=WS_EX_APPWINDOW|WS_EX_WINDOWEDGE;dwStyle=WS_OVERLAPPEDWINDOW;}AdjustWindowRectEx(&WindowRect,dwStyle,FALSE,dwExStyle);if(!(hWnd=CreateWindowEx(dwExStyle,"OpenG",title,dwStyle|WS_CLIPSIBLINGS|WS_CLIPCHILDREN,0,0,WindowRect.right-WindowRect.left,WindowRect.bottom-WindowRect.top,NULL,NULL,hInstance,NULL))){KillGLWindow();MessageBox(NULL,"窗口创建失败","错误",MB_OK|MB_ICONINFORMATION);return FALSE;}static PIXELFORMA TDESCRIPTOR pfd={sizeof(PIXELFORMA TDESCRIPTOR),1,PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|PFD_DOUBLEBUFFER,PFD_TYPE_RGBA,bits,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,PFD_MAIN_PLANE,0,0,0,0};if(!(hDC=GetDC(hWnd))){KillGLWindow();MessageBox(NULL,"不能创建一个窗口设备描述表","错误",MB_OK|MB_ICONINFORMA TION);return FALSE;}if(!(PixelFormat=ChoosePixelFormat(hDC,&pfd))){KillGLWindow();MessageBox(NULL,"不能创建一个匹配的像素格式","错误",MB_OK|MB_ICONINFORMA TION);return FALSE;}if(!SetPixelFormat(hDC,PixelFormat,&pfd)){KillGLWindow();MessageBox(NULL,"不能设置像素格式","错误",MB_OK|MB_ICONINFORMATION); return FALSE;}if(!(hRC=wglCreateContext(hDC))){KillGLWindow();MessageBox(NULL,"不能创建OpenGL渲染描述表","错误",MB_OK|MB_ICONINFORMA TION);return FALSE;}if(!wglMakeCurrent(hDC,hRC)){KillGLWindow();MessageBox(NULL,"不能激活当前的OpenGL渲染描述表","错误",MB_OK|MB_ICONINFORMA TION);return FALSE;}ShowWindow(hWnd,SW_SHOW);SetForegroundWindow(hWnd);SetFocus(hWnd);ResizeGLScene(width,height);if(!InitGL()){KillGLWindow();MessageBox(NULL,"初始化失败","错误",MB_OK|MB_ICONINFORMA TION);return FALSE;}return TRUE;}LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam){switch(uMsg){case WM_ACTIV ATE:{if(!HIWORD(wParam))active=TRUE;elseactive=FALSE;return 0;}case WM_SYSCOMMAND:{switch(wParam){case SC_SCREENSA VE:case SC_MONITORPOWER:return 0;}break;}case WM_CLOSE:{PostQuitMessage(0);return 0;}case WM_KEYDOWN:{keys[wParam]=TRUE;return 0;}case WM_KEYUP:{keys[wParam]=FALSE;return 0;}case WM_SIZE:{ResizeGLScene(LOWORD(lParam),HIWORD(lParam));return 0;}}return DefWindowProc(hWnd,uMsg,wParam,lParam);}int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){MSG msg;BOOL done=FALSE;if(MessageBox(NULL,"你想在全屏模式下运行吗?","设置全屏模式",MB_YESNO|MB_ICONQUESTION)==IDNO){fullscreen=FALSE;}if(!CreateGLWindow("Win32 SDK风格OpenGL程序框架",640,480,16,fullscreen)) return 0;while(!done){if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)){if(msg.message==WM_QUIT)done=TRUE;else{TranslateMessage(&msg);DispatchMessage(&msg);}}else{if(active){if(keys[VK_ESCAPE])done=TRUE;else{DrawGLScene();SwapBuffers(hDC);}}if(keys[VK_F1]){keys[VK_F1]=FALSE;KillGLWindow();fullscreen=!fullscreen;if(!CreateGLWindow("Win32 SDK风格OpenGL程序框架",640,480,16,fullscreen)) return 0;}}}KillGLWindow();return msg.wParam;}。
基于VC++的OpenGL编程讲座之曲线和曲面计算机图形学中,所有的光滑曲线、曲面都采用线段或三角形逼近来模拟,但为了精确地表现曲线,通常需要成千上万个线段或三角形来逼近,这种方法对于计算机的硬件资源有相当高的要求。
然而,许多有用的曲线、曲面在数学上只需要用少数几个参数(如控制点等)来描述。
这种方法所需要的存储空间比线段、三角形逼近的方法来所需要的空间要小得多,并且控制点方法描述的曲线、曲面比线段、三角形逼近的曲线、曲面更精确。
为了说明如何在OpenGL中绘制复杂曲线和曲面,我们对上述两类比方法都进行了介绍。
下面我们先来介绍有关基础知识,然后再看是如何实现的吧。
一、曲线的绘制OpenGL通过一种求值器的机制来产生曲线和曲面,该机制非常灵活,可以生成任意角度的多项式曲线,并可以将其他类型的多边形曲线和曲面转换成贝塞尔曲线和曲面。
这些求值器能在任何度的曲线及曲面上计算指定数目的点。
随后,OpenGL利用曲线和曲面上的点生成标准OpenGL图元,例如与曲线或曲面近似的线段和多边形。
由于可让OpenGL计算在曲线上所需的任意数量的点,因此可以达到应用所需的精度。
对于曲线,OpenGL中使用glMap1*()函数来创建一维求值器,该函数原型为:函数的第一个参数target指出控制顶点的意义以及在参数points中需要提供多少值,具体值见表一所示。
参数points指针可以指向控制点集、RGBA颜色值或纹理坐标串等。
例如若target是GL_MAP1_COLOR_4,则就能在RGBA 四维空间中生成一条带有颜色信息的曲线,这在数据场可视化中应用极广。
参数u1和u2,指明变量U的范围,U一般从0变化到1。
参数stride是跨度,表示在每块存储区内浮点数或双精度数的个数,即两个控制点间的偏移量,比如上例中的控制点集ctrpoint[4][3]的跨度就为3,即单个控制点的坐标元素个数。
函数参数order是次数加1,叫阶数,与控制点数一致。
利用OpenGL实现三维绘图在三维绘图蓬勃发展的过程中,计算机公司推出了大量的三维绘图软件包。
其中SGI公司推出的OpenGL,作为一个性能优越的图形应用程序设计界面(API)异军突起,取得了很大的成就。
它以高性能的交互式三维图形建模能力和易于编程开发,得到了Microsoft、IBM、DEC、Sun、HP等大公司的认同。
因此,OpenGL已经成为一种三维图形开发标准,是从事三维图形开发工作的必要工具。
1、初始化OpenGL绘图环境1.1 定义颜色格式和缓冲模式OpenGL提供两种颜色模式:RGB(RGBA)模式和颜色索引模式(调色板)。
在RGBA 模式下所有颜色的定义用RGB三个值来表示,有时也加上Alpha值(表示透明度)。
RGB 三个分量值的范围都在0和1之间,它们在最终颜色中所占的比例与它们的值成正比。
如:(1、1、0)表示黄色,(0、0、1)表示蓝色。
颜色索引模式下每个象素的颜色是用颜色索引表中的某个颜色索引值表示(类似于从调色板中选取颜色)。
由于三维图形处理中要求颜色灵活,而且在阴影,光照,雾化,融合等效果处理中RGBA的效果要比颜色索引模式好,所以,在编程时大多采用RGBA模式。
OpenGL提供了双缓存来绘制图像。
即在显示前台缓存中的图像同时,后台缓存绘制第二幅图像。
当后台绘制完成后,后台缓存中的图像就显示出来,此时原来的前台缓存开始绘制第三幅图像,如此循环往复,以增加图像的输出速度。
设置窗口显示模式函数:void auxInitDisplayMode(AUX_DOUBLE | // 双缓存方式AUX_RGBA// RGBA颜色模式);1.2 设置光源OpenGL的光源大体分为三种:环境光(Ambient light),即来自于周围环境没有固定方向的光。
漫射光(Diffuse light)来自同一个方向,照射到物体表面时在物体的各个方向上均匀发散。
镜面光(Specular light)则是来自于同一方向,也沿同一个方向反射。
VC(MFC)开发OPENGL程序作者:李英江日期: 2006-08-10 19:07:00网站:转载请保留作者内容!利用使用VC开发OPENGL程序,运用MFC库,做一个简单例子我简单介绍一下图形接口,现在流行的两大图形接口Direct3D 和OpenGL,Direct3D主要是针对游戏,像starcaft星际争霸,它支持DX5.0以上的版本,但是不少游戏同时支持两种图形加速,如CS,魔兽争霸。
OpenGL主要是针对专业的图形应用,在军事,医学,GIS地理信息系统,动画(3dsmax,maya...),电影,等应用广泛,并且可以在不同的平台上应用,DX相对来说就只能限于Windows操作系统了。
1.运用MFC向导,生成一个单文档应用程序,不做任何事的MFC 框架程序。
2.视图类中添加窗口样式。
/************************************************************** *******/BOOL CMfc_basicView::PreCreateWindow(CREATESTRUCT& cs){// Add Window styles required for OpenGL before window iscreatedcs.style |= (WS_CLIPCHILDREN | WS_CLIPSIBLINGS | CS_OWNDC);return CView::PreCreateWindow(cs);}/************************************************************** *******/3.在afxcmn.h中包含OPENGL头文件。
/************************************************************** *******/#include <afxcmn.h>// MFC support for Windows Common Controls// Inserted these files for openGL#include <gl.h>#include <glut.h>#include <glu.h>#include <glaux.h>#endif // _AFX_NO_AFXCMN_SUPPORT/************************************************************** *******/4.视图类中 .h文件中加入四个public 成员变量/************************************************************** *******/HGLRC m_hRC; // Permanent Rendering ContextHDC m_myhDC; // Private GDI Device Contextint m_height; // Stores the height of the Viewint m_width; // Stores the width of the view/************************************************************** *******/5.视图类中右键添加一个BOOL成员函数SetupPixelFormat/************************************************************** *******/BOOL COglm_demoView::SetupPixelFormat(){GLuint PixelFormat;static PIXELFORMATDESCRIPTOR pfd= {sizeof(PIXELFORMATDESCRIPTOR),// Size Of This Pixel Format Descriptor1,// Version Number (?)PFD_DRAW_TO_WINDOW | // Format Must Support WindowPFD_SUPPORT_OPENGL | // Format Must Support OpenGL PFD_DOUBLEBUFFER, // Must Support Double Buffering PFD_TYPE_RGBA, // Request An RGBA Format24, // Select A 24Bit Color Depth0, 0, 0, 0, 0, 0, // Color Bits Ignored (?)0, // No Alpha Buffer0, // Shift Bit Ignored (?)0, // No Accumulation Buffer0, 0, 0, 0, // Accumulation Bits Ignored (?)16, // 16Bit Z-Buffer (Depth Buffer)0, // No Stencil Buffer0, // No Auxiliary Buffer (?)PFD_MAIN_PLANE, // Main Drawing Layer0, // Reserved (?)0, 0, 0 // Layer Masks Ignored (?)};m_myhDC = ::GetDC(m_hWnd); // Gets A Device Context For The WindowPixelFormat = ChoosePixelFormat(m_myhDC, &pfd); // Finds The Closest Match To The Pixel Format We Set Aboveif (!PixelFormat){::MessageBox(0,"Can't Find A Suitable PixelFormat.","Error",MB_OK|MB_ICONERROR);PostQuitMessage(0);// This Sends A 'Message' Telling The Program To Quitreturn false ; // Prevents The Rest Of The Code From Running}if(!SetPixelFormat(m_myhDC,PixelFormat,&pfd)){::MessageBox(0,"Can't Set The PixelFormat.","Error",MB_OK|MB_ICONERROR);PostQuitMessage(0);return false;}m_hRC = wglCreateContext(m_myhDC);if(!m_hRC){::MessageBox(0,"Can't Create A GL Rendering Context.","Error",MB_OK|MB_ICONERROR);PostQuitMessage(0);return false;}if(!wglMakeCurrent(m_myhDC, m_hRC)){::MessageBox(0,"Can't activate GLRC.","Error",MB_OK|MB_ICONERROR);PostQuitMessage(0);return false;}// Now that the screen is setup we can// initialize OpenGL();InitGL();return true;}/************************************************************** *******/6.关闭WM_ERASEBACKGROUND消息,不关闭的话,画图时会闪动.在视图类中选择“Add Windows Message Handler”加入消息处理函数./************************************************************** *******/BOOL CMfc_basicView::OnEraseBkgnd(CDC* pDC){return FALSE;}/************************************************************** *******/7.初始化OPENGL 添加InitGL()函数./************************************************************** *******/void CMfc_basicView::InitGL(){// Enables Depth TestingglEnable(GL_DEPTH_TEST);// Enable the point size for selected pointsglPointSize(5.0f);// This Will Clear The Background Color To BlackglClearColor(.4, 0.2, 0.0, 0.0f);// Reset the current projection matrixSetProjection();glMatrixMode(GL_MODELVIEW);glLoadIdentity();//Enable back face culling, defaults to Clock wise vertices.glEnable(GL_CULL_FACE);glEnable(GL_COLOR_MATERIAL);glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);glShadeModel(GL_SMOOTH);glPolygonMode(GL_FRONT, GL_FILL);}/************************************************************** *******/8. 在视图类中添加调窗口大小的处理函数OnSize() 消息句柄/************************************************************** *******/void CMfc_basicView::OnSize(UINT nType, int cx, int cy){CView::OnSize(nType, cx, cy);glMatrixMode(GL_MODELVIEW);glLoadIdentity();// Make the rendering context currentwglMakeCurrent(m_myhDC,m_hRC);// Reset The Current Viewport And Perspective TransformationglViewport(0, 0, cx, cy);m_height= cy;m_width = cx;// Calculate The Aspect Ratio Of The WindowgluPerspective(60.0f,(GLfloat)cx/(GLfloat)cy,0.1f,1000.0f);}9.添加SetPorjection()函数void CMfc_basicView::SetProjection(){glViewport(0, 0, m_width, m_height);// Reset The Projection MatrixglMatrixMode(GL_PROJECTION);glLoadIdentity();// It's a perspective projection// Calculate The Aspect Ratio Of The WindowgluPerspective(60.0f,(GLfloat)m_width/(GLfloat)m_height, 0.1f,3000.0f);}/************************************************************** *******/10.在Project 菜单选择Settings. 单击Link 选项页Object/library Module添加库文件.opengl32.lib glu32.lib glut.lib glaux.lib11.在视图类中加入OnCreate消息句柄/*********************************************************************/int CMfc_basicView::OnCreate(LPCREATESTRUCT lpCreateStruct){if (CView::OnCreate(lpCreateStruct) == -1)return -1;SetupPixelFormat();wglMakeCurrent(NULL,NULL);return 0;}/************************************************************** *******///现在编译程序的话,会看到一个无法刷新的应用程序了。
OpenGL作图非常方便,故日益流行,但对许多人来说,是在微机上进行的,首先碰到的问题是,如何适应微机环境。
这往往是最关键的一步,虽然也是最初级的。
一般的,我不建议使用glut 包.那样难以充分发挥windows 的界面上的功能.下面介绍如何在VC++ 上进行OpenGL 编程。
OpenGL 绘图的一般过程可以看作这样的,先用OpenGL 语句在OpenGL 的绘图环境RenderContext (RC)中画好图, 然后再通过一个Swap buffer 的过程把图传给操作系统的绘图环境DeviceContext (DC)中,实实在在地画出到屏幕上.下面以画一条Bezier 曲线为例,详细介绍VC++ 上OpenGL编程的方法。
文中给出了详细注释,以便给初学者明确的指引。
一步一步地按所述去做,你将顺利地画出第一个OpenGL 平台上的图形来。
一、产生程序框架Test.dswNew 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 的绘图设备。
VC++配置OpenGL开发环境Hanford2016年06月12日目录目录第1章配置 (1)第2章核心文件 (5)2.1 核心文件 (5)2.2 编译时使用核心文件 (5)2.3 运行时使用核心文件 (6)2.4 依赖关系 (6)第3章AUX (7)3.1 AUX的作用 (7)3.2 使用AUX (7)第4章GLUT (8)4.1 GLUT的作用 (8)4.2 相关文件 (8)4.3 使用GLUT (8)4.4 编译GLUT (9)4.5 替代产品 (9)第5章GLEXT (10)5.1 GLEXT的作用 (10)5.2 相关文件 (10)5.3 使用GLEXT (10)5.3.1 使用wglGetProcAddress (11)5.3.2 使用glext.dll导出函数 (11)第6章GLEW (13)6.1 相关文件 (13)6.2 使用GLEW (13)I第1章配置配置就是将OpenGL的头文件(*.h)、库文件(*.lib)、动态库文件(*.dll)复制到相应的目录内。
如下图所示,有三个文件夹和三个批处理文件。
图1.1文件夹bin用来存放*.dll文件,如:glut32.dll。
注意:32位的dll文件存放在x86子目录内;64位的dll文件存放在x64子目录内。
文件夹inc用来存放*.h文件,如:glew.h。
文件夹lib用来存放*.lib文件,如:glut32.lib。
注意:32位的lib文件存放在x86子目录内;64位的lib文件存放在x64子目录内。
注意:本文不考虑安腾处理器(Itanium)。
运行setup.bat,将把bin、inc、lib内的文件复制到相应的目录内。
其内容setup.bat的工作为判断环境变量ProgramFiles(x86)是否已被定义。
如果该环境变量已被定义,说明操作系统是64位的,将运行x64.bat;如果该环境变量未被定义,说明操作系统是32位的,将运行x86.bat。
VC 环境下基于OpenGL 的编程步骤下面介绍在VC 环境中建立基于OpenGL 标准的应用程序框架的具体方法与步骤:1. 创建项目文件:选择File /New 菜单选项,建立一个名为MyTest 项目文件,MyTest 基于单文档(SDI),View 类基于Cview。
2. 选择Build /Setting 菜单选项,在Link 栏的Lib 输入域中添加openg132.lib、glu32.lib,若需使用OpenGL 的辅助库函数,则还需添加glut32.lib。
3. 选择View /ClassWizard 菜单选项,打开MFC 对话框,在ClassName 栏中选择CMyTestView 类,进行以下操作:1) 选择WM_CREATE 消息,鼠标单击EditCode,将OpenGL 初始化代码添加到OnCreate() 函数中:/*定义像素存储格式*/PIXELFORMATDESCRIPTOR pfd={sizeof(PIXELFORMATDESCRIPTOR),1,PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL,PFD_TYPE_RGBA,24,0,0,0,0,0,0,0,0,0,0,0,0,032,0,0,PFD_MAIN_PLANE,0,0,0,0};CCLient dc(this);int pixelFormat=ChoosePixelFormat(dc.m_hDC,&pfd);BOOL success=SetPixelFormat(dc.m_hDC,pixelFormat,&pfd);m_hRC=wglCreateContext(dc.m_hDC);(可以自己定义一个初始化函数(init()),将上述代码进行封装)2) 选择WM_DESTORY消息,在OnDestory()中添加以下代码:wglDeleteContext(m_hRC);3) 在MyTestView.cpp中,将以下代码添加到PreCreateWindows()函数中:cs.style|=WS_CLIPCHILDREN|WS_CLIPSIBLINGS;OpenGL只对WS_CLIPCHILDREN|WS_CLIPSIBLINGS类型窗口有效;4) 在MyTestView.cpp中,将以下代码添加到OnDraw()函数中:wglMakeCurrent(pDC->m_hDC,m_hRC);DrawScene(); //用户自定义函数,用于绘制三维场景;wglMakeCurrent(pDC->m_hDC,NULL);5) 在MyTestView.cpp中,添加成员函数DrawScene():void CMyTestView::DrawScene(){/*绘制三维场景*/}6) 选择WM_SIZE 消息,鼠标单击EditCode,在OnSize()中添加观察变换函数。
第20卷第4期2006年7月山东理工大学学报(自然科学版)Journal of Shandong University of Technology(Sci&Tech)Vol.20No.4J ul.2006文章编号:1672-6197(2006)04-0036-03Open G L及其在VC++开发环境下的编程实现王兰美1,赵继成2,秦华东2(1.山东理工大学轻工与农业工程学院,山东淄博255049;2.山东理工大学机械工程学院,山东淄博255049)摘 要:介绍了Open G L的基本知识,阐述了Open G L与VC++应用接口的建立步骤以及如何设置Open G L的绘制环境,从而实现Open G L在VC++开发环境下编程.关键词:Open G L;VC++;接口;三维图形中图分类号:TP391文献标识码:AOpen G L and itπs programming under VC++developing environment WAN G Lan2mei1,ZHAO Ji2cheng2,Q IN Hua2dong2(1.School of Light Industry and Agricultural Engineering,Shandong University of Technology,Zibo255049,China;2.School of Mechanical Engineering,Shandong University of Technology,Zibo255049,China)Abstract:The basic t heory of Open G L was int roduced,t he step s t hrough which A PI was built between Open G L and VC++and how to set t he drawing environment s of Open G L were expounded.Thus,Open G L programming using VC++is realized.K ey w ords:Open G L;VC++;interface;t hree dimension grap hics “开放式图形库”Open G L是一个三维图形和模型库,它是由美国SGI(Silicom Grap hics Inc.)公司开发及优化的.1997年SGI和微软公司一起将Open G L放入Windows2000中,VC++集成了Open G L图形标准,使得Open G L在三维图形设计领域得到广泛应用.目前,Open G L在图形开发领域已经成为工业标准,如何利用VC++和Open G L构建三维图形开发环境,是利用Open2 G L开发三维图形软件的前提和关键.1 Open G L及工作流程Open G L是一个与硬件图形发生器的软件接口,也是一个高性能的图形开发软件包,它包括了100多个图形操作函数,程序设计者可以利用这些函数来构造景物模型、进行三维图形交互软件的开发.Open G L支持网络,在网络系统中收稿日期:20051123基金项目:山东省自然科学基金资助项目(2004ZX33)作者简介:王兰美(1956),女,教授.用户可以在不同的图形终端上运行程序显示图形.Open G L 作为一个与硬件独立的图形接口,它不提供与硬件密切相关的设备操作函数,用户必须从点、线、面等最基本的图形单元开始构造自己的三维模型.因此,Open G L 的图形操作函数十分灵活.几何顶点数据包括模型的顶点集、线集、多边形集,这些数据需经过运算器、逐个顶点操作等;图像数据包括像素集、影像集、位图集等,图像像素数据的处理方式与几何顶点数据的处理方式是不同的,但它们需经过光栅化、逐个片元处理,直至把最后的光栅数据写入帧缓冲器.在Open G L 中的所有数据包括几何顶点数据和像素数据都可以被存储在显示列表中或者立即得到处理.Open G L 中,显示列表技术是一项重要的技术[1].Open G L 要求把所有的几何图形单元都用顶点来描述,因此,运算器和逐个顶点计算操作都可以针对每个顶点进行计算和操作,然后进行光栅化形成图形碎片.对于像素数据,其操作结果被存储在纹理组装用的内存中,经光栅化形成图形片元.图形片元经过一系列的逐个片元操作,最后的像素值BZ 送入帧缓冲器实现图形的显示.Open G L 的基本工作流程如图1[2]所示.图1 Open G L 基本工作流程图2 Windows N T 下Open G L 的结构Open G L 的作用机制是客户(client )/服务器(server )机制,即客户(用Open G L 绘制景物的应用程序)向服务器(即Open G L 内核)发布Open 2G L 命令,服务器则解释这些命令.大多数情况下,客户和服务器在同一机器上运行.正是Open 2G L 的这种客户/服务器机制,使得它可以十分方便地在网络环境下使用.因此,Windows N T 下的Open G L 是网络透明的.正如Windows 的图形设备接口(GDI )把图形函数库封装在一个动态链接库(Windows N T 下的GDI32.DLL )内一样,Open G L 图形库也被封装在一个动态链接库内(Open G L32.DLL ).受客户应用程序调用的Open G L 函数都先在Open 2G L32.DLL 中处理,然后传给服务器WINSRV.DLL.Open G L 的命令得到处理后直接传给Win32的设备驱动接口(Device Drive Interface ,DDI ),这样就把经过处理的图形命令送给视频显示驱动程序,其过程如图2所示.图2 Open G L 在Windows N T 下的运行机制3 VC ++与OpenG L 应用接口的建立实现VC ++6.0和Open G L 之间图形接口的机制是像素格式设置以及关联DC (Device Context )与RC (Rendering Context )[3].在创建一个渲染环境RC 之前,首先要设置像素格式,然后为Open G L 建立RC ,只有建立RC 后,Open G L 才能调用绘图原语在窗口中绘出图形.Win32A PI 提供了几个操作RC 的函数,包括建立、复制、使用、删除、查询等,它们都以wgl 为词头.RC 是以线程为单位的,每个线程必须使用一个RC 作为当前RC ,才能执行Open G L 绘图原语.VC ++6.0和Open G L 图形接口的实现步骤如下:首先建立一个新的VC ++Win32A PI ,然后设置连接Open G L 库文件,在菜单中选择Pro 2ject ->Settings ,最后选择L IN K 选项,在“Ob 2ject/Library Modules ”下增加Open G L 所需的库程序,如Open G L32.lib ,Glu32.lib ,Glaux.lib [4].做完以上工作后,就可以编写Open G L 程序了.3.1 Include 文件及全局变量的设置每个程序开始的4行包括了窗口及Open G L 所使用的库的头文件.程序代码如下:73第4期 王兰美,等:Open G L 及其在VC ++开发环境下的编程实现#include<windows.h>//视窗文件#include<gl\gl.h>//Open G L库文件的头文件#include<gl\glu.h>//G Lu32.lib的头文件#include<gl\glaux.h>//Glaux.lib的头文件接下来是定义在程序中计划使用的所有变量.程序代码如下:H G L RC hRC=NULL;//定义渲染环境HDC hDC=NULL;//私有的GDI设备环境HWND hWnd=NULL;//得到窗口句柄HINSTANCE hInstance;//得到程序的例子第1行是建立一个渲染环境RC.每一个Open G L程序都会被链接到渲染环境,渲染环境的作用是将Open G L调用连结到设备环境,它被定义为hRC.第2行的任务是为程序在窗口中绘制的需要创建一个设备环境,窗口设备环境被定义为hDC.DC,它将窗口连结到图形设备接口(GDI),RC将Open G L连结到DC.在第3行中,参数hWnd将得到Windows分配给窗口的句柄(handle).第4行为建立一个程序的例子Instance (事件).3.2 设置窗口大小、斜率及全屏标志变量由于变量f ullscreen在全屏模式下值为TRU E,在窗口模式下值为FAL SE.因此,将其设置为全局变量是很重要的,这可使程序的每个过程和函数都知道程序是否运行在全屏模式.其代码如下:REC T rect;int sw=640;int sh=480;bool f ullscreen=1;Glfloat aspect;3.3 设置程序链接时所需要调用的Open G L程序通过设置Open G L,可以灵活地切换Debug 模式及Release模式,而不用担心链接时由于没有设定Open G L程序库而出现错误信息.程序代码如下:#p ragma comment(lib,“opengl32.lib”)#p ragma comment(lib,“glu32.lib”)#p ragma comment(lib,“glaux.lib”)4 Open G L的绘制下面通过一个实体透明处理的实例描述来说明Open G L的绘制方法.创建好VC++与Open G L的应用接口以后,就可以进行编程了,其程序如下:BOOL CTransparent::PreCreateWindow (CREA TESTRUC T&cs)//重载基类PreCreate2 Window函数{cs.style|=WS_CL IPSIBL IN GS|WS_ CL IPCH ILDREN;//设置窗口类型ret urn Cview::PreCreateWindow(cs);}void CT ransparentView::OnDraw(CDC3pDC){RenderScene();//渲染场景}//窗口必须设置以上属性,否则像素格式不能正确设置.const DWORD Transparent_color= 0x7FFFFFFF;//设定透明值,0x7F代表50%透明void SceneShow(G L void)//这里进行所有的绘图工作{glClear(G L_COLOR_BU FFER_BIT|G L_ D EP T H_BU FFER_B IT);//清屏和清除深度缓冲区glLoadIdentity();//重置当前Modelview矩阵my_vertex g_Transparent[]={ {-1.0f,-1.0f,-1.0f,0.0f,0.0f, 0.0f,Transparent_color,0.0f,1.0f},//前面 {-1.0f,-1.0f,-1.0f,0.0f,0.0f, 0.0f,Transparent_color,0.0f,0.0f}, {1.0f,-1.0f,-1.0f,0.0f,0.0f,0. 0f,Transparent_color,1.0f,0.0f}, {1.0f,-1.0f,-1.0f,0.0f,0.0f,0. 0f,Transparent_color,1.0f,0.0f}, {1.0f,-1.0f,-1.0f,0.0f,0.0f,0. 0f,Transparent_color,1.0f,1.0f},(下转第42页)4 结束语计算机技术不断发展和普及,为微电子企业质量管理技术和方法的应用提供了崭新的数据分析和处理的手段.计算机辅助控制图的应用,使控制图的设计、描点和准则判断准确、方便、直观和快捷.质量控制图系统建立在SPC和控制图理论的基础上,并运用计算机软件技术实现.电子产品制造中运用质量控制图系统,可以根据对检测数据自动绘制控制图,分析加工过程的异常,以达到降低不良率、减少返工和浪费、改进与保证产品质量的目的.随着国内电子组装制造业对统计过程控制重要性认识,实时控制图技术会被越来越广泛地应用于企业生产中,从而推动电子产品制造工艺技术和管理技术的进步.参考文献:[1]孙 静,张公绪.常规控制图标准及其应用[M].北京:中国标准出版社,2001.[2]张根保.现代质量工程[M].北京:机械工业出版社,2000.[3]黄晓兰.统计过程控制技术在半导体生产中的应用[J].电子标准化与质量,1999,(3):15218.[4]徐 哲,段晓江.计算机辅助质量控制图的应用[J].北京航空航天大学学报,1999,25(2):2122215.(上接第38页) {-1.0f,-1.0f,-1.0f,0.0f,0.0f,0.0f,Transparent_color,0.0f,1.0f},//其它5个面的绘制与此类似.ret urn TRU E;//程序运行正确}//程序设计者可以在glLoadIdentity()之下并且在TRU E值之前增加创建基本形体的Open G L代码.//在Open G L程序结束之前关闭Open G L,代码如下:void DisableOpen G L(){ wglMakeCurrent(NULL,NULL); wglDeleteContex(hRC); 图形开发软件包.ReleaseDC(hWnd, hDC);}透明处理后的效果图与原图对比如图3所示.图3 立方体透明处理前后的对比图5 结束语以上阐述了Open G L的工作流程及其在VC++环境下的编程实现步骤,并通过实例展示了其仿真功能.利用这个强大的开放式图形库可以开发出绚烂的三维图形世界及逼真的三维动画.参考文献:[1]廖朵朵,张华军.Open G L三维图形程序设计[M].北京:星球地图出版社,2004.[2]李文强,华祖耀.基于Open G L的仿真可视化技术研究[J].计算机仿真,2005,6:1582161.[3]李长春,戴国洪.基于VC++与Open G L的三维图形环境的构建[J].电脑开发与应用,2004,17(6):10213.[4]万 斌.Visual C++Open G L Direct X三维动画编程宝典[M].北京:北京希望电子出版社,2003.。