首先來說window上只支持 opengl1.1版本,所以好多API 都是不能用的。
但是可以用某些開源的 opengl實現,比如Mesa3D。註意,它是軟件實現OpenGL,效率很慢。
也可以根據妳的顯卡型號,去官方直接下載OpenGL 開發包。
另外,OpenGL API好像不直接支持線程控制幀率,需要自己開線程來繪制,給妳點例子代碼:
1、第壹部分,MFC中初始化OpenGL
void CXXXDlg::InitOpenGLWithWnd(HWND hWnd, HDC* hDC, HGLRC* hRC)
{
PIXELFORMATDESCRIPTOR pfd;
int iFormat;
*hDC = ::GetDC( hWnd );
ZeroMemory( &pfd, sizeof( pfd ) );
pfd.nSize = sizeof( pfd );
pfd.nVersion = 1;
pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
pfd.iPixelType = PFD_TYPE_RGBA;
pfd.cColorBits = 32;
pfd.cDepthBits = 32;
pfd.iLayerType = PFD_MAIN_PLANE;
iFormat = ChoosePixelFormat( *hDC, &pfd );
SetPixelFormat( *hDC, iFormat, &pfd );
*hRC = wglCreateContext( *hDC );
wglMakeCurrent( *hDC, *hRC );
}
hWnd是需要進行繪制的控件,m_hDrawGLRC是用來返回的 GL上下文。
然後妳自己開啟壹個線程,重復調用壹個繪制函數,比如叫 DrawFrame
2、第二部分,基本繪制
void COpenGLDemo01Dlg::DrawFrame()
{
CGLAutoLock autolock(m_glLock);
glMatrixMode(GL_PROJECTION); //修改投影矩陣
glLoadIdentity(); //復位,將投影矩陣歸零
glMatrixMode(GL_MODELVIEW); //修改模型視圖矩陣
glLoadIdentity();//復位,將模型視圖矩陣歸零
gluPerspective(60.0f,((float)width)/height,5.0f,150.0f); //投影方式。
glViewport(0,0,width,height);
gluLookAt(eye.x,eye.y,eye.z,eye.x+dir.x,eye.y+dir.y,eye.z+dir.z,up.x,up.y,up.z); //視角。
OpenGLDrawFrame(m_hDrawDC);
}
OpenGLDrawFrame 是另壹個函數,裏面畫妳的那些東西。。
eye,dir 這些都是緩存視角方向的變量,如果不需要場景漫遊,可以寫死。
//定義世界寬度高度和深度
GLint world_width = 1000 ;
GLint world_height = 1000 ;
GLint world_depth = 1000 ;
//將 X-Z平面畫成網格狀。每壹個單位壹個網格。
void drawWorld(void)
{
glColor4f(1.0f,0.0f,0.0f,1.0f);
for(GLint w=-(world_width/2); w<=world_width/2 ; w +=5){
glBegin(GL_LINE_STRIP);
glVertex3f(w,0,-world_depth/2);
glVertex3f(w,0,world_depth/2);
glEnd();
}
glColor4f(0.0f,0.0f,1.0f,1.0f);
for(GLint d=-(world_depth/2); d<=world_depth/2 ; d +=5){
glBegin(GL_LINE_STRIP);
glVertex3f(-world_width/2,0,d);
glVertex3f(world_width/2,0,d);
glEnd();
}
glColor4f(1.0f,0.0f,0.0f,1.0f);
for(GLint w=-(world_width/2); w<=world_width/2 ; w +=5){
glBegin(GL_LINE_STRIP);
glVertex3f(w,40.0f,-world_depth/2);
glVertex3f(w,40.0f,world_depth/2);
glEnd();
}
glColor4f(0.0f,0.0f,1.0f,1.0f);
for(GLint d=-(world_depth/2); d<=world_depth/2 ; d +=5){
glBegin(GL_LINE_STRIP);
glVertex3f(-world_width/2,40.0f,d);
glVertex3f(world_width/2,40.0f,d);
glEnd();
}
}
void OpenGLDrawFrame(HDC hDrawDC)
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
//畫世界
drawWorld();
//畫物體
//...
//提交
glFlush();
//使用緩存更新界面。
SwapBuffers(hDrawDC);
}