當前位置:編程學習大全網 - 源碼下載 - vc++做opengl圖形無法顯示

vc++做opengl圖形無法顯示

都讓妳說完了,代碼正確,編譯正確。那妳還來問什麽?

首先來說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);

}

  • 上一篇:神奇的macd指標源代碼
  • 下一篇:女性聊天源代碼
  • copyright 2024編程學習大全網