第乙個基於mfc的opengl應用程式
開發環境:
vc6.0
1, glut
標頭檔案,dll
和lib
: glutdlls37beta.zip
(149 kilobytes),
解壓縮後把
gltu.h
放到"vc98/include/gl"
下,把glut.lib
和glut32.lib
放到"vc9/lib" 下
,glut32.dll
和glut.dll
放到你建立的應用程式的執行目錄下
2, 建立乙個
mfc sdi
應用程式,在專案屬性中加入所需要鏈結的庫檔案
1, 在
stdafx.h
中加入下列語句:
2, 開啟
classwizard,
選擇ccy457openglview
類,為下述訊息加入訊息處理函式:wm_create (for oncreate), wm_destroy (for ondestroy), wm_size (for onsize), wm_erasebackground (for onerasebkground). //
opengl headers
#include
<
gl/gl.h>
#include
<
gl/glu.h>
#include
<
gl/glut.h>
#include
<
gl/glaux.h>
3,在視窗建立之前我們必須設定視窗風格包含ws_clipchildren和
ws_clipsiblings,從而避免
opengl
繪製到其他視窗中去。這些應該放在precreatewindow()中。
bool ccy457openglview::precreatewindow(createstruct
& cs)
4, 在ccy457openglview.h
中加入如下語句:
hglrc m_hrc;
//rendering context
cdc*m_pdc;
//device context
bool initializeopengl();
//initialize opengl
bool setuppixelformat();
//set up the pixel format
void
renderscene();
//render the scene
5,在oncreate中我們將通過建立畫素格式和繪製上下文來初始化
opengl.
在initializeopengl()
中會建立乙個裝置上下文
(dc)
,為這個
dc選擇乙個畫素格式,建立和這個
dc相關的繪製上下文(rc)
,然後選擇這個
rc.這個函式會呼叫
setuppixelformat()
來建立畫素格式。
intccy457openglview::oncreate(lpcreatestruct lpcreatestruct)
bool ccy457openglview::initializeopengl()
//failure to set the pixel format
if(!
setuppixelformat())
//create rendering context
m_hrc
=::wglcreatecontext (m_pdc
->
getsafehdc ());
//failure to create rendering context
if(m_hrc ==0
)//make the rc current
if(::wglmakecurrent (m_pdc
->
getsafehdc (), m_hrc)
== false)
//specify black as the clear color
::glclearcolor(
0.0f
,0.0f
,0.0f
,0.0f
);//specify the back of the buffer as clear depth
::glcleardepth(
1.0f
);//enable depth testing
::glenable(gl_depth_test);
return
true;}//
setup pixel format
/////
bool ccy457openglview::setuppixelformat()
;int
m_npixelformat
=::choosepixelformat(m_pdc
->
getsafehdc(),
& pfd);
if( m_npixelformat ==0
)if( ::setpixelformat(m_pdc
->
getsafehdc(), m_npixelformat,
&pfd)
== false)
return
true;}
6, 在
onsize()
中一般用來設定視口和
視錐,因為這些是和視窗大小相關的。基本操作包括設定視口,選擇投影矩陣,設定模型檢視矩陣。
void
ccy457openglview::onsize(uint ntype,
intcx,
int cy)
//select the full client area
::glviewport(0,
0 , cx, cy);
// compute the aspect ratio
//this will keep all dimension scales equal
aspect_ratio
=(gldouble)cx
/ (gldouble)cy;
//select the projection matrix and clear it
::glmatrixmode(gl_projection);
::glloadidentity();
//select the viewing volume
::gluperspective(
45.0f
, aspect_ratio, .01f,
200.0f
);//switch back to the modelview matrix and clear it
::glmatrixmode(gl_modelview);
::glloadidentity();}
7,在繪製場景時,一般包括如下步驟:
1)清空快取。
2)繪製場景。3)
flush
掉渲染流水線。
4)若設定了雙緩衝,則交換前後臺緩衝區。
void
ccy457openglview::ondraw(cdc
* pdc)
void
ccy457openglview::renderscene () 8
,試試改變視窗的大小,你會看到很嚴重的閃爍,並且關閉程式後會報告記憶體洩露,因此我們這就來解決這兩個問題吧。
發生閃爍的原因是
windows
先繪製背景,然後再是
opengl
繪製,因為我們已經讓
opengl
負責清空背景色,因此我們不需要
windows
去清空背景了
bool ccy457openglview::onerasebkgnd(cdc
* pdc)
記憶體洩露的原因是我們在setuppixelformat()中使用了
new運算子來為cclientdc物件分配記憶體,因此需要顯示
delete掉。
void
ccy457openglview::ondestroy()
//delete the rendering context
if(::wgldeletecontext (m_hrc)
== false)
//delete the dc
if(m_pdc)
//set it to null
m_pdc
= null;
}
第乙個MFC程式
1.mfc使用c 語言把windows sdk api函式包裝成了幾百個類 2.最重要的兩個mfc類 2 cframewnd 3.兩種方法 1 乙個繼承 2 兩個繼承 4.具體實現 4.0vs設定 1 正常建立控制台程式 2 設定專案屬性 在常規中 a.將mfc的使用改為 在靜態庫中使用mfc 動態...
OpenGL系統設計 2 第乙個OpenGL應用
圖1 8顯示出來的實際上是乙個標準的windows視窗,和opengl好像沒有關係,儘管我們已經建立了opengl的rc。這是因為我們自己的三個主要的opengl函式glinit glmain glshutdown 都是空函式。為了真正實現opengl的功能,我們還需要將這三個函式進行填充。實際上,...
我的第乙個OPEN GL程式
我使用的是ubuntu 14.04版本的 具體安裝過程如下 sudo apt get install build essential 安裝opengl library 接下來要把我們會用到的 library 裝上去,首先安裝 opengl library sudo apt get install l...