3DSMAX教程 建模 材质 动画 VRAY FinalRender Lightscape MaxWell Brazil Mental Ray
MAYA 建模 材质 渲染 动画 LightWave & Softimage XSI Rhino Poser CAD
发新话题 用WEB迅雷下载本页所有附件
打印

OpenGL 入门教程(四)

OpenGL 入门教程(四)

  OpenGL是一种基于客户/服务器和管道(PipeLine)的图形库。即一个应用程序(客户)将各种命令和数据写入管道,这命令和数据将被暂时保存起来,图形库(服务器)直到收到一条专门的指令才会开始处理它们,并将处理结果通过管道传给用户。   所以OpenGL应用程序的基本结构就是:

建立管道 根据需要向管道中写入数据和指令 关闭管道 在Windows95/NT环境中,这个管道就是OpenGL着色环境——(OpenGL Render Context)简称RC。因此建立管道实际上就是获取一个可用的RC。

而在Windows的GDI系统中进行图形显示是通过图形设备上下文——(Device Context)简称DC——进行的。所以获取RC就是: ①先获取一个DC, ②调整这个DC的象素格式(PixelFormat)以便OpenGL库进行绘制, ③用DC去调用wglCreateContext(hDC)建立一个RC, ④调用wglMakeCurrent(hRC,hDC)将刚才建立的RC指定为当前的RC。

当一个RC不再使用时就可以删除它,方法是:

使RC不是“当前RC”: wglMakeCurrent(NULL,NULL); //不再有当前RC wglMakeCurrent(hAnotherRC,hDC); //另一个RC成为当前RC wglDEleteContent(hRC); //删除之

为了避免反复建设/删除RC所带来的不必要的开支,我们在TForm1中定义了hDC、hRC以保存DC和RC,并在TForm1的构造函数中建立并保存RC,直到清除这个Form即Destory()成员函数运行时才删除RC和DC。

主要代码如下:

void __fastcall TForm1::CreateParams(TCreateParams& Params) {//再次说明:只在MDI应用有必要进行修改。2000.2.17.   TForm::CreateParams(Params); //调用原有函数预处理   Params.Style|=WS_CLIPCHILDREN|WS_CLIPSIBLINGS;//加上必要的属性 } //---------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner)     : TForm(Owner) {   hDC=GetDC(Handle); //获取一个DC,TForm1.Handle中保存有Form的窗口句柄   SetDCPixelFormat(hDC); //调整该DC的象素格式   hRC=wglCreateContext(hDC); //用这种DC去创建一个RC   wglMakeCurrent(hDC,hRC); //指定当前DC、当前RC为hDC、hRC } //------------------------------------------------------------------- void __fastcall TForm1::SetDCPixelFormat(HDC hDC) {   //本函数用于调整DC的象素格式,如缓冲区、颜色数等   //先不深究,只要知道它的作用就行 int nPixelFormat; static PIXELFORMATDESCRIPTOR pfd = { sizeof(PIXELFORMATDESCRIPTOR),      // Size of this structure  1,                    // Version of this structure  PFD_DRAW_TO_WINDOW |           // Draw to Window (not to bitmap)  PFD_SUPPORT_OPENGL |           // Support OpenGL calls in window  PFD_DOUBLEBUFFER             // Double buffered mode  PFD_TYPE_RGBA,              // RGBA Color mode  24,                    // Want 24bit color  0,0,0,0,0,0,               // Not used to select mode  0,0,                   // Not used to select mode  0,0,0,0,0,                // Not used to select mode  32,                    // Size of depth buffer  0,                    // Not used to select mode  0,                    // Not used to select mode  PFD_MAIN_PLANE,              // Draw in main plane  0,                    // Not used to select mode  0,0,0 };                 // Not used to select mode       // Choose a pixel format that best matches that described in pfd nPixelFormat = ChoosePixelFormat(hDC, &pfd);      // Set the pixel format for the device context SetPixelFormat(hDC, nPixelFormat, &pfd); } //----------------------------------------------------------------- void __fastcall TForm1::FormPaint(TObject *Sender) {   //该Form的绘制响应函数 glClearColor(0.5,0.7,0.9,1.0); //指定背景颜色(依次为RGBA) glClear(GL_COLOR_BUFFER_BIT); //用背景色清窗口 RenderScence();        //场景绘制 SwapBuffers(hDC);   //切交缓冲区,这就是可以启动图形库处理流程并得相应结果的两条命令之一   //如果当前RC相联DC具有DoubleBuffer的PixelFormat则用本命令   //否则就是单缓冲DC,用glFlush(void)进行更新。 } //----------------------------------------------------- void __fastcall TForm1::FormDestroy(TObject *Sender) { wglMakeCurrent(NULL,NULL); //取消当前RC和当前DC wglDeleteContext(hRC);   //删除该RC DeleteObject(hDC);     //删除Windows DC。 } //-------------------------------------------------------------------  

发新话题 用WEB迅雷下载本页所有附件