日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

VC++下的OpenGL编程

發(fā)布時間:2025/3/15 c/c++ 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 VC++下的OpenGL编程 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1.值得記住的約定

一般情況下,VC++下進行OpenGL應(yīng)用程序開發(fā)步驟如下: 1.通過PIXELFORMATDESCRIPTOR結(jié)構(gòu)設(shè)置備注描述表DC的像素格式屬性。 2.創(chuàng)建渲染描述表RC,并與設(shè)備描述表DC建立聯(lián)系。 3.使用OpenGL作圖 4.釋放所占用的資源,包括解除DC和RC的聯(lián)系、刪除RC及其關(guān)聯(lián)的DC。 在這里,應(yīng)該先為應(yīng)用程序添加所需的變量和函數(shù),對相關(guān)變量進行初始化,然后在相應(yīng)函數(shù)中實現(xiàn)DC像素格式設(shè)置、RC的創(chuàng)建及其和DC的關(guān)聯(lián)、圖形繪制以及資源釋放等功能。

2.一個典型實例

2.1 添加成員變量和成員函數(shù)

CClientDC* pDrawDC; // 用于指向當前DC的指針BOOL PixelformatSetting(void); // 用于設(shè)置像素格式 void GLSetting(void); // 用于創(chuàng)建渲染描述表RC 并關(guān)聯(lián)RC/DC void DrawGraphics(void); //OpenGL作圖

2.2 添加消息響應(yīng)函數(shù)

WM_CREATE ?--- OnCreate(); //該消息響應(yīng)函數(shù)在建立一個窗體前被調(diào)用。 WM_DESTROY --- OnDestroy(); //窗口撤銷時響應(yīng)此函數(shù),因此在該函數(shù)中釋放所有被占用的資源。 WM_SIZE ? ?--- OnSize(); ? ?//改變窗口大小時響應(yīng)此函數(shù),可以調(diào)整視場。 afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); afx_msg void OnDestroy(); afx_msg void OnSize(UINT nType, int cx, int cy);

2.3 成員函數(shù)和消息響應(yīng)函數(shù)添加代碼

  • 設(shè)置像素格式
BOOL CtestGLView::PixelformatSetting(void) {static PIXELFORMATDESCRIPTOR pdf ={sizeof(PIXELFORMATDESCRIPTOR),1,PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|PFD_DOUBLEBUFFER,PFD_TYPE_RGBA,24,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,PFD_MAIN_PLANE,0,0,0,0}; //填充PIXELFORMATDISCRIPTORint ipixelformat;//獲得最佳匹配的像素格式索引if((ipixelformat = ChoosePixelFormat(pDrawDC->GetSafeHdc(), &pdf))==0){MessageBox(_T("Choose pixel format failed!"));return FALSE;}//把DC的像素格式設(shè)置成由索引值ipixelformat指向的像素格式if(SetPixelFormat(pDrawDC->GetSafeHdc(),ipixelformat, &pdf) == FALSE){MessageBox(_T("Set pixel format failed"));return FALSE;}return TRUE; }
  • 創(chuàng)建渲染描述表,調(diào)用PixelFormatSetting()設(shè)置像素格式,創(chuàng)建和DC關(guān)聯(lián)的RC
void CtestGLView::GLSetting(void) {HGLRC hRC; //渲染描述表句柄pDrawDC = new CClientDC (this); //使用pDrawDC指向當前DCASSERT(pDrawDC != NULL);if( !PixelformatSetting()) //設(shè)置像素格式return;//創(chuàng)建和當前DC兼容的RC,并和當前DC關(guān)聯(lián)hRC = wglCreateContext(pDrawDC->GetSafeHdc());wglMakeCurrent(pDrawDC->GetSafeHdc(),hRC); }
  • 在消息響應(yīng)函數(shù)OnCreate()中調(diào)用函數(shù)GLSetting(),使得GL環(huán)境生效
int CtestGLView::OnCreate(LPCREATESTRUCT lpCreateStruct) {if (CView::OnCreate(lpCreateStruct) == -1)return -1;GLSetting();return 0; }
  • 繪制幾何拓撲
void CtestGLView::DrawGraphics(void) {//移動物體到顯示區(qū)glTranslatef(0.0,0.0,-6.0); //相當于在調(diào)整照相機 避免像太大glRotated(RotateAngle,1,1,1);//以邊線的方式繪制三角形glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);//繪制三角形,順序給出3個三角形的頂點glBegin(GL_TRIANGLES);glVertex3f(-0.6,0,0);glVertex3f(0.6,0,0);glVertex3f(0.0,0.15,0.6);glVertex3f(-0.6,0,0);glVertex3f(0,0.15,0.6);glVertex3f(0,0.9,0.6);glVertex3f(0,0.9,0.6);glVertex3f(0,0.15,0.6);glVertex3f(0.6,0,0);glEnd(); }
  • OnDraw函數(shù)中,圖像顯示
void CtestGLView::OnDraw(CDC* /*pDC*/) {CtestGLDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);if (!pDoc)return;static BOOL bBusy = FALSE; //定義開關(guān)變量if(bBusy) //開關(guān) 繪制完成后才可以更新緩存{return;}bBusy = TRUE;glClearColor(0,0,0.5,0.5);//設(shè)置背景顏色glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清除深度緩存和顏色緩存glMatrixMode(GL_MODELVIEW); //啟動模型視圖矩陣glLoadIdentity();DrawGraphics();SwapBuffers(wglGetCurrentDC()); //更新緩存bBusy = FALSE; }
  • 刪除渲染描述表RC及其綁定的設(shè)備描述表DC
void CtestGLView::OnDestroy() {CView::OnDestroy();//刪除渲染描述表及其綁定的設(shè)備描述表HGLRC hRC; //OpenGL的渲染描述表 hRC = ::wglGetCurrentContext();::wglMakeCurrent(NULL,NULL); //解除當前RC和DC的關(guān)聯(lián),并把當前RC非當前化if(hRC){::wglDeleteContext(hRC);}if(pDrawDC){delete pDrawDC;} }

2.4 添加人機交互(旋轉(zhuǎn)功能)

采用鼠標左鍵控制開關(guān),定時旋轉(zhuǎn)方案。 WM_BUTTONDOWN ?--- ?OnLButtonDown(); WM_TIMER ? ? ? --- ?OnTimer(); 添加變量: BOOL bRotate; float RotateAngle;void CtestGLView::OnLButtonDown(UINT nFlags, CPoint point) {if (bRotate){SetTimer(1,100,NULL);} else{KillTimer(1);}bRotate = !bRotate;CView::OnLButtonDown(nFlags, point); }void CtestGLView::OnTimer(UINT_PTR nIDEvent) {//定時器計時達到預(yù)定時刻 則旋轉(zhuǎn)角度增加10if( nIDEvent == 1){RotateAngle += 10;Invalidate(FALSE); //重新繪制}CView::OnTimer(nIDEvent); }

3.輸出結(jié)果


總結(jié)

以上是生活随笔為你收集整理的VC++下的OpenGL编程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。