




已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
VC中如何配置OpenGL李永红摘要: 阐述了Windows中如何设置引用OpenGL进行三维图形绘制,在VC和openGL之间建立桥梁和纽带。关键词:OpenGL,VC程序设计1. 概述OpenGL(全写Open Graphics Library)是个定义了一个跨编程语言、跨平台的编程接口的规格,它用于三维图像。OpenGL是个专业的图形程序接口,是一个功能强大、调用方便的底层图形库。OpenGL能够兼容Windows系统,但不能提供图形用户界面,本文特别介绍了如何在VC中引用OpenGL进行图形绘制。2. 直接将OpenGL绘制的图形输出到系统窗口利用VC的AppWizard建立单文档界面的工程文件,在VC环境中进行编译。2.1 建立适合于OpenGL的运行环境调用VC设置,将OpenGL所在的头文件目录和静态库文件添加到文件目录中,选择连接设置,增加连接库“opengl32.lib glu32.lib glaux.li”,打开stdafx.h文件,在该文件中加入#include#include2.2 在VC生成的视类中添加BOOL SetWindowPixelFormat(HDC hDC),并给予实现。BOOL CTestOpenGLView:SetWindowPixelFormat(HDC hDC)PIXELFORMATDESCRIPTOR pixelDesc;pixelDesc.nSize=sizeof(PIXELFORMATDESCRIPTOR);pixelDesc.nVersion=1;pixelDesc.dwFlags=PFD_DRAW_TO_WINDOW|PFD_DRAW_TO_BITMAP|PFD_SUPPORT_OPENGL|PFD_SUPPORT_GDI|PFD_STEREO_DONTCARE;pixelDesc.iPixelType=PFD_TYPE_RGBA;pixelDesc.cColorBits=32;pixelDesc.cRedBits=8;pixelDesc.cRedShift=16;pixelDesc.cGreenBits=8;pixelDesc.cGreenShift=8;pixelDesc.cBlueBits=8;pixelDesc.cBlueShift=0;pixelDesc.cAlphaBits=0;pixelDesc.cAlphaShift=0;pixelDesc.cAccumBits=64;pixelDesc.cAccumRedBits=16;pixelDesc.cAccumGreenBits=16;pixelDesc.cAccumBlueBits=16;pixelDesc.cAccumAlphaBits=0;pixelDesc.cDepthBits=32;pixelDesc.cStencilBits=8;pixelDesc.cAuxBuffers=0;pixelDesc.iLayerType=PFD_MAIN_PLANE;pixelDesc.bReserved=0;pixelDesc.dwLayerMask=0;pixelDesc.dwVisibleMask=0;pixelDesc.dwDamageMask=0;m_GLPixelIndex = ChoosePixelFormat(hDC, &pixelDesc);if(m_GLPixelIndex=0)m_GLPixelIndex=1;if(DescribePixelFormat(hDC,m_GLPixelIndex,sizeof(PIXELFORMATDESCRIPTOR),&pixelDesc)=0)return FALSE;if(SetPixelFormat(hDC,m_GLPixelIndex, &pixelDesc)=FALSE)return FALSE;if(CreateViewGLContext( hDC ) = FALSE)return 0;return TRUE;在视类头文件中添加成员变量int m_GLPixelIndex; 2.3 建立函数使得程序的设备描述符CDC与OpenGL发生联系。BOOL CTestOpenGLView:CreateViewGLContext(HDC hDC)m_hGLContext=wglCreateContext(hDC);if(m_hGLContext=NULL)return FALSE;if(wglMakeCurrent(hDC,m_hGLContext)=FALSE)return FALSE;return TRUE;在头文件中添加以下成员变量:HGLRC m_hGLContext; /protect2.4 重载OnCreate函数,在其中加入调用OpenGL的语句int CTestOpenGLView:OnCreate(LPCREATESTRUCT lpCreateStruct)if (CView:OnCreate(lpCreateStruct) = -1)return -1;/ TODO: Add your specialized creation code hereHWND hWnd = GetSafeHwnd();HDC hDC = :GetDC(hWnd);if(SetWindowPixelFormat( hDC ) = FALSE)return 0;return 0;2.5 在OnSize()中增加与OpenGL坐标设置相关的代码。void CTestOpenGLView:OnSize(UINT nType, int cx, int cy)CView:OnSize(nType, cx, cy);/ TODO: Add your message handler code hereGLsizei width, height;GLdouble aspect;width = cx;height = cy;if(cy=0)aspect = (GLdouble)width;elseaspect = (GLdouble)width/(GLdouble)height;glViewport(0, 0, width, height);glMatrixMode(GL_PROJECTION);glLoadIdentity();glMatrixMode(GL_MODELVIEW);glLoadIdentity();2.6 重载OnDestroy( )函数,在其中增加释放资源、恢复系统环境的代码。void CTestOpenGLView:OnDestroy()CView:OnDestroy();/ TODO: Add your message handler code hereif(wglGetCurrentContext()!=NULL)/make the rendering context not currentwglMakeCurrent(NULL,NULL);if(m_hGLContext!=NULL)wglDeleteContext(m_hGLContext);m_hGLContext=NULL;2.7 在onDraw()中加入OpenGL的三维图形绘制代码,可以直接将openGL的绘制结果输出到VC的视框中。void CTestOpenGLView:OnDraw(CDC* /*pDC*/)CTestOpenGLDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);if (!pDoc)return;/ TODO: add draw code for native data hereglLoadIdentity();glClear(GL_COLOR_BUFFER_BIT);glBegin(GL_QUADS); glColor4f(1.0f, 0.0f, 0.0f, 1.0f); glVertex3f(-0.5f, -0.5f, 1.0f); glColor4f(0.0f,1.0f,0.0f,1.0f); glVertex3f( 0.0f, -0.5f, 1.0f); glColor4f(0.0f,0.0f,1.0f,1.0f); glVertex3f( -0.5f, 0.5f, -1.0f); glColor4f(0.0f,1.0f,1.0f,1.0f); glVertex3f(0.5f, 0.5f, 0.0f);glEnd();glFlush();2.8 软件最终运行效果3. 将OpenGL绘制的图形输出为位图在某些窗体中,可以利用位图作为中间介质,将OpenGL三维图形的绘制结果输出到位图,利用位图进行图像的显示。3.1 位图类的设计利用位图作为桥梁,必须先设计位图类,该类具有创建位图、存储位图、显示位图、调入位图等操作成员,位图类的设计较多,此处不再阐述。3.2 利用VC中的Appwizard设计一个基于对话框的类,在其中加入静态框,然后加入基于CWnd的类,在类中,加入成员变量:CreateOpenGL( )、SetLogicalPalette( )、 DestroyOpenGL( )等,其中,最重要的是CreateOpenGL( ),具体实现代码为:int CGraphDraw:CreateOpenGL()CDC *dc;HDC hDC;m_DIB.Create(m_cx,m_cy,24);dc=m_DIB.GetDC( );hDC=dc-GetSafeHdc();CBitmap *pBitmap=dc-GetCurrentBitmap();BITMAP bmInfo;pBitmap-GetObject(sizeof(BITMAP),&bmInfo);PIXELFORMATDESCRIPTOR pfd = sizeof(PIXELFORMATDESCRIPTOR), 1, PFD_DRAW_TO_BITMAP | PFD_SUPPORT_OPENGL | PFD_SUPPORT_GDI, PFD_TYPE_RGBA, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, PFD_MAIN_PLANE, 0, 0, 0, 0 ; int pixelformat;pixelformat = :ChoosePixelFormat(hDC, &pfd);SetPixelFormat(hDC, pixelformat, &pfd);if(pfd.dwFlags & PFD_NEED_PALETTE)SetLogicalPalette(); m_hRC = wglCreateContext( hDC ); wglMakeCurrent( hDC, m_hRC ); glClearDepth(1.0); glDepthFunc(GL_LEQUAL); glPointSize(1.0); glLineWidth(1.0); glCullFace(GL_BACK); ReleaseDC(dc);return 0; 在上述代码中,最重要的代码是上述中的黑体部分,获得的设备描述符来自位图。3.3 程序中调用CRect r;CDC *pDC = m_Graph.GetDC();m_Graph.GetClientRect(&r);m_Graph.m_cx = r.Width();m_Graph.m_cy = r.Height();m_Graph.CreateOpenGL();glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );glMatrixMode( GL_PROJECTION );glLoadIdentity();glOrtho(-1.0,1.0,-1.0,1.0,-1.0,1.0);glColor3f(0.75f,0.75f,0.0f);glBegin(GL_LINES); glVertex3f(-1.0f,-0.3f,0.0f); glVertex3f(1.0f,-0.3f,0.0f);glEnd();glBegin(GL_LINES); glVertex3f(0.0f,-0.3f,0.0f); glVertex3f(0.0f,0.5f,0.0f);glEnd();glBegin(GL_LINES); glVertex3f(0.0f,0.5f,0.0f); glVertex3f(-0.02f,0.45f,0.0f);
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 沈阳药科大学《药物化学》试题及部分答案
- 锯工试题库及答案
- 2025年税务师之税法一题库练习试卷A卷附答案
- 压路机操作工职业考核试卷及答案
- 2025年第一季度“三基”考核考试试题(临床)含答案
- 填字造句游戏题库及答案
- 农发行吉安市吉安县2025秋招笔试价值观测评题专练及答案
- 矿井防灭工基础知识考核试卷及答案
- 中职运动系统题库及答案
- 铁路供电技师题库及答案
- 《氢科学技术应用》课件-3-1 氢气的储存
- 骨科手术铺巾
- 新质生产力助推乡村振兴 (修正版)
- 碳普惠制的实践检视与立法完善
- LNG加气站安全规章制度
- 建设工程监理安全资料(完整版)
- 客服人员绩效考核方案
- 苹果电脑macOS效率手册
- 城区绿地养护服务费项目成本预算绩效分析报告
- 职称英语A级词汇大全
- 某光伏发电工程EPC总承包投标文件技术文件
评论
0/150
提交评论