首    页 界面/窗口 网络/通讯 数据库 组件开发 图像/多媒体 NET/Web 其它技术 源码下载 资料下载 软件共享 软件外包 曲艺杂谈
栏目导航:  首    页  |  图像/多媒体  |  OpenGL   


VC中使用OpenGL编程的初步


原作者:不详    源出处:CSDN    发布者:施昌权    发布类型:转载    发布日期:2008-11-14

  

  首先将OpenGL的连接文件,库文件导入到相应文件夹,如:库文件GLAUX.LIB、GLU32.LIB、GLUT32.LIB等等。

下面用到的变量:CClientDC* m_pDC

1、先要初始化OpenGL场景
void COpenView::Init()
{
//初始化openGL场景
  PIXELFORMATDESCRIPTOR pfd;
  int n;
  HGLRC hrc;
  m_pDC = new CClientDC(this);
  ASSERT(m_pDC != NULL);
  if(!bSetupPixeFormat())
   return ;
  n = ::GetPixelFormat(m_pDC->GetSafeHdc());
  ::DescribePixelFormat(m_pDC->GetSafeHdc(),n,sizeof(pfd),&pfd);
  hrc = wglCreateContext(m_pDC->GetSafeHdc());
  wglMakeCurrent(m_pDC->GetSafeHdc(),hrc);
//根据客户区的初始值定透视投影
  glClearDepth(1.0f);
  glEnable(GL_DEPTH_TEST);
}

BOOL COpenView::bSetupPixeFormat()
{
//设置像素格式
  PIXELFORMATDESCRIPTOR pfd = {
     sizeof(PIXELFORMATDESCRIPTOR),    // pfd结构的大小
     1,                                // 版本号
     PFD_DRAW_TO_WINDOW |              // 支持在窗口中绘图
     PFD_SUPPORT_OPENGL |              // 支持 OpenGL
     PFD_DOUBLEBUFFER,                 // 双缓存模式
     PFD_TYPE_RGBA,                    // RGBA 颜色模式
     24,                               // 24 位颜色深度
     0, 0, 0, 0, 0, 0,                 // 忽略颜色位
     0,                                // 没有非透明度缓存
     0,                                // 忽略移位位
     0,                                // 无累加缓存
     0, 0, 0, 0,                       // 忽略累加位
     32,                               // 32 位深度缓存    
     0,                                // 无模板缓存
     0,                                // 无辅助缓存
     PFD_MAIN_PLANE,                   // 主层
     0,                                // 保留
     0, 0, 0                           // 忽略层,可见性和损毁掩模
  };  
  int pixelformat;
  //选择像素格式
  if((pixelformat = ChoosePixelFormat(m_pDC->GetSafeHdc(),&pfd))==0)
  {
   MessageBox("ChoosePixelFormat Failed");
   return FALSE;
  }
  //设置像素格式
  if(SetPixelFormat(m_pDC->GetSafeHdc(),pixelformat,&pfd)==FALSE)
  {
   MessageBox("SetPixeLFormat failed");
   return FALSE;
  }

 return TRUE;
}


2、在OnSize()中,确定视窗与窗口的匹配
void COpenView::OnSize(UINT nType, int cx, int cy)
{
  CView::OnSize(nType, cx, cy);
 
  int w = cx;
  int h = cy;
  //避免除数为0
  if(h==0)
   h = 1;
  //设置视口与窗口匹配
  glViewport(0,0,w,h);
  //重新设置坐标系统
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  //建立透视投影
  gluPerspective(30.0,(GLfloat)w/(GLfloat)h,1.0,20.0);
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();
}

3、按自己的想法画图(以下只是个例子)
void COpenView::DrawScene(void)
{
  GLfloat position[] = {0.0,0.0,1.0,1.0};
  GLfloat mat_torus[] = {0.75,0.5,0.0,1.0};
  GLfloat mat_cylinder[] = {0.0,0.75,0.75,0.15};

 glClearColor(0.0,0.0,0.0,0.0);
  //清除颜色缓冲区和深度缓冲区
  glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

 glLightfv(GL_LIGHT0,GL_POSITION,position);
  glPushMatrix();
  if(eyePosition)
   gluLookAt(0.0,0.0,9.0,0.0,0.0,0.0,0.0,1.0,0.0);
  else
   gluLookAt(0.0,0.0,-9.0,0.0,0.0,0.0,0.0,1.0,0.0);
  glPushMatrix();
  glTranslatef(0.0,0.0,1.0);
  glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_torus);
  auxSolidTorus(0.275,0.85);
  glPopMatrix();
  glEnable(GL_BLEND);
  glDepthMask(GL_FALSE);
  glBlendFunc(GL_SRC_ALPHA,GL_ONE);
  glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_cylinder);
  glTranslatef(0.0,0.0,-1.0);
  auxSolidCylinder(1.0,2.0);
  glDepthMask(GL_TRUE);
  glDisable(GL_BLEND);
  glPopMatrix();
  //刷新屏幕,绘制图形
  glFinish();
  ::SwapBuffers(wglGetCurrentDC());


关于我们 版权声明 广告服务 联系我们 友情链接 加入收藏
站长:施昌权    Email:scq2099yt@163.com    MSN:scq2099yt@live.cn    QQ:14046300    本站QQ群:67202409
Copyright © 2008     卓为VC(www.joyvc.cn)    All Rights Reserved    建议分辨率 1024×768
本站由施昌权制作维护
京ICP备09012297号