VC中使用OpenGL编程的初步

首先将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());

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值