如何在vc++环境下建立OpenGL程序
第一步:将glut32.dll按路径:windows\system32\放入,
第二步:将glut32.lib按路径:Microsoft Visual Studio\vc98\lib\放入
第三步:将glut.h按路径:Microsoft Visual Studio\vc98\include\gl\放入 其次建立一个新工程
一:打开VC++6.0:工具栏:文件\新建,出现一个名为新建的对话框,选择工程选项卡,在其中选择WIN32 Console Application,并在右侧:工程名称(N)底下键入名称,在位置(Z)底下设置好存放路径,点击确定创建一个空的工程。
二:工具栏:工程\设置,出现一个名为Project Setting的对话框,选择连接项卡,在对象\库模块底下白框里最前面添上opengl32.lib glu32.lib glut32.lib,之后点击确定
三:文件\新建,出现一个名为新建的对话框,选择文件选项卡,在其中选择C++ Source File, 并在右侧:文件名(N)底下键入名称,开始敲代码,这样只要代码无误,就可以运行出我们想要的结果
首先需要配置环境 在 http://www.xmission.com/~nate/glut/glut-3.7.6-bin.zip中下载最新的glut.h glut32.lib glut32.dll. 第一步:将glut32.dll按路径:windows\system32\放入, 第二步:将glut32.lib按路径:Microsoft Visual Studio\vc98\lib\放入 第三步:将glut.h按路径:Microsoft Visual Studio\vc98\include\gl\放入 其次建立一个新工程 第一步:打开VC++6.0:工具栏:文件\新建,出现一个名为新建的对话框,选择工程选项卡,在其中选择WIN32 Console Application,并在右侧:工程名称(N)底下键入名称,在位置(Z)底下设置好存放路径,点击确定创建一个空的工程。 第二步:工具栏:工程\设置,出现一个名为Project Setting的对话框,选择连接项卡,在对象\库模块底下白框里最前面添上opengl32.lib glu32.lib glut32.lib,之后点击确定 第三步:文件\新建,出现一个名为新建的对话框,选择文件选项卡,在其中选择C++ Source File, 并在右侧:文件名(N)底下键入名称,开始敲代码,这样只要代码无误,就可以运行出我们想要的结果
copy的,参考下OpenGL作图非常方便,故日益流行,但对许多人来说,是在微机上进行的,首先碰到的问题是,如何适应微机环境。这往往是最关键的一步,虽然也是最初级的。一般的,我不建议使用glut 包.那样难以充分发挥 Windows 的界面上的功能.
下面介绍如何在 VC++ 上进行 OpenGL 编程。 OpenGL 绘图的一般过程可以看作这样的,先用 OpenGL 语句在 OpenGL 的绘图环境 RenderContext (RC)中画好图, 然后再通过一个 Swap buffer 的过程把图传给操作系统的绘图环境 DeviceContext (DC)中,实实在在地画出到屏幕上.
下面以画一条 Bezier 曲线为例,详细介绍VC++ 上 OpenGL编程的方法。文中给出了详细注释,以便给初学者明确的指引。一步一步地按所述去做,你将顺利地画出第一个 OpenGL 平台上的图形来。
一、产生程序框架 Test.dsw
New Project | MFC Application Wizard (EXE) | "Test" | OK
*注* : 加“”者指要手工敲入的字串
二、导入 Bezier 曲线类的文件
用下面方法产生 BezierCurve.h BezierCurve.cpp 两个文件:
WorkSpace | ClassView | Test Classes| <右击弹出> New Class | Generic Class(不用MFC类) | "CBezierCurve" | OK
三、编辑好 Bezier 曲线类的定义与实现
写好下面两个文件:
BezierCurve.h BezierCurve.cpp
四、设置编译环境:
1. 在 BezierCurve.h 和 TestView.h 内各加上:
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glaux.h>
2. 在集成环境中
Project | Settings | Link | Object/library module | "opengl32.lib glu32.lib glaux.lib" | OK
五、设置 OpenGL 工作环境:(下面各个操作,均针对 TestView.cpp )
1. 处理 PreCreateWindow(): 设置 OpenGL 绘图窗口的风格
cs.style |= WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CS_OWNDC;
2. 处理 OnCreate():创建 OpenGL 的绘图设备。
OpenGL 绘图的机制是: 先用 OpenGL 的绘图上下文 Rendering Context (简称为 RC )把图画好,再把所绘结果通过 SwaPBuffer() 函数传给 Window 的 绘图上下文 Device Context (简记为 DC).要注意的是,程序运行过程中,可以有多个 DC,但只能有一个 RC。因此当一个 DC 画完图后,要立即释放 RC,以便其它的 DC 也使用。在后面的代码中,将有详细注释。
int CTestView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
myInitOpenGL();
return 0;
}
void CTestView::myInitOpenGL()
{
m_pDC = new CClientDC(this); //创建 DC
ASSERT(m_pDC != NULL);
if (!mySetupPixelFormat()) //设定绘图的位图格式,函数下面列出
return;
m_hRC = wglCreateContext(m_pDC->m_hDC);//创建 RC
wglMakeCurrent(m_pDC->m_hDC, m_hRC); //RC 与当前 DC 相关联
} //CClient * m_pDC; HGLRC m_hRC; 是 CTestView 的成员变量
BOOL CTestView::mySetupPixelFormat()
{//我们暂时不管格式的具体内容是什么,以后熟悉了再改变格式
static PIXELFORMATDESCRIPTOR pfd =
{
sizeof(PIXELFORMATDESCRIPTOR), // size of this pfd
1, // version number
PFD_DRAW_TO_WINDOW | // support window
PFD_SUPPORT_OPENGL | // support OpenGL
PFD_DOUBLEBUFFER, // double buffered
PFD_TYPE_RGBA, // RGBA type
24, // 24-bit color depth
0, 0, 0, 0, 0, 0, // color bits ignored
0, // no alpha buffer
0, // shift bit ignored
0, // no accumulation buffer
0, 0, 0, 0, // accum bits ignored
32, // 32-bit z-buffer
0, // no stencil buffer
0, // no auxiliary buffer
PFD_MAIN_PLANE, // main layer
0, // reserved
0, 0, 0 // layer masks ignored
};
int pixelformat;
if ( (pixelformat = ChoosePixelFormat(m_pDC->m_hDC, &pfd)) == 0 )
{
MessageBox("ChoosePixelFormat failed");
return FALSE;
}
if (SetPixelFormat(m_pDC->m_hDC, pixelformat, &pfd) == FALSE)
{
MessageBox("SetPixelFormat failed");
return FALSE;
}
return TRUE;
}
3. 处理 OnDestroy()
void CTestView::OnDestroy()
{
wglMakeCurrent(m_pDC->m_hDC,NULL); //释放与m_hDC 对应的 RC
wglDeleteContext(m_hRC); //删除 RC
if (m_pDC)
delete m_pDC; //删除当前 View 拥有的 DC
CView::OnDestroy();
}
4. 处理 OnEraseBkgnd()
BOOL CTestView::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
// return CView::OnEraseBkgnd(pDC);
//把这句话注释掉,若不然,Window
//会用白色北景来刷新,导致画面闪烁
return TRUE;//只要空返回即可。
}
5. 处理 OnDraw()
void CTestView::OnDraw(CDC* pDC)
{
wglMakeCurrent(m_pDC->m_hDC,m_hRC);//使 RC 与当前 DC 相关联
myDrawScene( ); //具体的绘图函数,在 RC 中绘制
SwapBuffers(m_pDC->m_hDC);//把 RC 中所绘传到当前的 DC 上,从而
//在屏幕上显示
wglMakeCurrent(m_pDC->m_hDC,NULL);//释放 RC,以便其它 DC 进行绘图
}
void CTestView::myDrawScene( )
{
glClearColor(0.0f,0.0f,0.0f,1.0f);//设置背景颜色为黑色
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glTranslated(0.0f,0.0f,-3.0f);//把物体沿(0,0,-1)方向平移
//以便投影时可见。因为缺省的视点在(0,0,0),只有移开
//物体才能可见。
//本例是为了演示平面 Bezier 曲线的,只要作一个旋转
//变换,可更清楚的看到其 3D 效果。
//下面画一条 Bezier 曲线
bezier_curve.myPolygon();//画Bezier曲线的控制多边形
bezier_curve.myDraw(); //CBezierCurve bezier_curve
//是 CTestView 的成员变量
//具体的函数见附录
glPopMatrix();
glFlush(); //结束 RC 绘图
return;
}
6. 处理 OnSize()
void CTestView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);
VERIFY(wglMakeCurrent(m_pDC->m_hDC,m_hRC));//确认RC与当前DC关联
w=cx;
h=cy;
VERIFY(wglMakeCurrent(NULL,NULL));//确认DC释放RC
}
7 处理 OnLButtonDown()
void CTestView::OnLButtonDown(UINT nFlags, CPoint point)
{
CView::OnLButtonDown(nFlags, point);
if(bezier_curve.m_N>MAX-1)
{
MessageBox("顶点个数超过了最大数MAX=50");
return;
}
//以下为坐标变换作准备
GetClientRect(&m_ClientRect);//获取视口区域大小
w=m_ClientRect.right-m_ClientRect.left;//视口宽度 w
h=m_ClientRect.bottom-m_ClientRect.top;//视口高度 h
//w,h 是CTestView的成员变量
centerx=(m_ClientRect.left+m_ClientRect.right)/2;//中心位置,
centery=(m_ClientRect.top+m_ClientRect.bottom)/2;//取之作原点
//centerx,centery 是 CTestView 的成员变量
GLdouble tmpx,tmpy;
tmpx=scrx2glx(point.x);//屏幕上点坐标转化为OpenGL画图的规范坐标
tmpy=scry2gly(point.y);
bezier_curve.m_Vertex[bezier_curve.m_N].x=tmpx;//加一个顶点
bezier_curve.m_Vertex[bezier_curve.m_N].y=tmpy;
bezier_curve.m_N++;//顶点数加一
InvalidateRect(NULL,TRUE);//发送刷新重绘消息
}
double CTestView::scrx2glx(int scrx)
{
return (double)(scrx-centerx)/double(h);
}
double CTestView::scry2gly(int scry)
{
}
附录:
1.CBezierCurve 的声明: (BezierCurve.h)
class CBezierCurve
{
public:
myPOINT2D m_Vertex[MAX];//控制顶点,以数组存储
//myPOINT2D 是一个存二维点的结构
//成员为Gldouble x,y
int m_N; //控制顶点的个数
public:
CBezierCurve();
virtual ~CBezierCurve();
void bezier_generation(myPOINT2D P[MAX],int level);
//算法的具体实现
void myDraw();//画曲线函数
void myPolygon(); //画控制多边形
};
2. CBezierCurve 的实现: (BezierCurve.cpp)
CBezierCurve::CBezierCurve()
{
m_N=4;
m_Vertex[0].x=-0.5f;
m_Vertex[0].y=-0.5f;
m_Vertex[1].x=-0.5f;
m_Vertex[1].y=0.5f;
m_Vertex[2].x=0.5f;
m_Vertex[2].y=0.5f;
m_Vertex[3].x=0.5f;
m_Vertex[3].y=-0.5f;
}
CBezierCurve::~CBezierCurve()
{
}
void CBezierCurve::myDraw()
{
bezier_generation(m_Vertex,LEVEL);
}
void CBezierCurve::bezier_generation(myPOINT2D P[MAX], int level)
{ //算法的具体描述,请参考相关书本
int i,j;
level--;
if(level<0)return;
if(level==0)
{
glColor3f(1.0f,1.0f,1.0f);
glBegin(GL_LINES); //画出线段
glVertex2d(P[0].x,P[0].y);
glVertex2d(P[m_N-1].x,P[m_N-1].y);
glEnd();//结束画线段
return; //递归到了最底层,跳出递归
}
myPOINT2D Q[MAX],R[MAX];
for(i=0;i {
Q[i].x=P[i].x;
Q[i].y=P[i].y;
}
for(i=1;i<m_N;i++)
{
R[m_N-i].x=Q[m_N-1].x;
R[m_N-i].y=Q[m_N-1].y;
for(j=m_N-1;j>=i;j--)
{
Q[j].x=(Q[j-1].x+Q[j].x)/double(2);
Q[j].y=(Q[j-1].y+Q[j].y)/double(2);
}
}
R[0].x=Q[m_N-1].x;
R[0].y=Q[m_N-1].y;
bezier_generation(Q,level);
bezier_generation(R,level);
}
void CBezierCurve::myPolygon()
{
glBegin(GL_LINE_STRIP); //画出连线段
glColor3f(0.2f,0.4f,0.4f);
for(int i=0;i<m_N;i++)
{
glVertex2d(m_Vertex[i].x,m_Vertex[i].y);
}
glEnd();//结束画连线段
}
windows下安装opengl的glut库
GLUT不是OpenGL所必须的,但它会给我们的学习带来一定的方便,推荐安装。
Windows环境下的GLUT下载地址:(大小约为150k)
http://www.opengl.org/resources/libraries/glut/glutdlls37beta.zip
无法从以上地址下载的话请使用下面的连接:
http://upload.programfan.com/upfile/200607311626279.zip
Windows环境下安装GLUT的步骤:
1、将下载的压缩包解开,将得到5个文件
2、在“我的电脑”中搜索“gl.h”,并找到其所在文件夹(如果是VisualStudio2005,则应该是其安装目录下面的“VC\PlatformSDK\include\gl文件夹”)。把解压得到的glut.h放到这个文件夹。
3、把解压得到的glut.lib和glut32.lib放到静态函数库所在文件夹(如果是VisualStudio2005,则应该是其安装目录下面的“VC\lib”文件夹)。
4、把解压得到的glut.dll和glut32.dll放到操作系统目录下面的system32文件夹内。(典型的位置为:C:\Windows\System32)
你说的是MFC还是WIN32??
我假设你的编译器是vc++6.0
1.加入头文件
#include <gl\glut.h>
#include <gl\gl.h>
#include <gl\glaux.h>
2.alt+f7
在link选项卡添加
opengl32.lib glu32.lib glaux.lib
就这样了吧。
关键不知道你想建立什么项目,这很让人纠结
谁知道海鲜和什么维生素同时吃会生成砒霜?
此外,在学理上,已纯化的维生素C与五价砷,如果在实验室的环境下,加以化学催化作用,或许有可能使原来无毒的五价砷转变为三价砷(俗称的砒霜)。然而餐点当中所食用之维生素C及虾子,其分别所含之维生素C与五价砷量甚低,又无化学催化剂及适当之反应条件,实际并没有产生砒霜的疑虑。 2010-6-1 07:04 回复 日照人民...
吃虾后隔多久吃水果?
然而无机砷(包括三价砷及五价砷)确实有毒,若保守估计无机砷含量为海鲜含砷量的十分之一,而虾含量若以4ppm计算的话,欲达到最低可能致死剂量二十毫克,必须一口气吃下五十公斤的虾,才可能致命。 此外,在学理上,已纯化的维生素C与五价砷,如果在实验室的环境下,加以化学催化作用,或许有可能使原来无毒的五价砷转变为...
关于鲁迅先生的资料
幼时的保姆长妈妈,在备受歧视的环境中给予过他真诚的关心的藤野先生,一生坎坷、孤傲不羁的老友范爱农,...xymervc 已赞过 已踩过< 你对这个回答的评价是? 评论 收起 764425519 2008-11-19 · TA获得
西红柿可以和虾一起吃吗
就我日常的饮食来看虾和西红柿在一起吃是没有什么问题的,不知道小伙伴你是从哪里得的消息是虾和西红柿不能一起吃,至少现在没有,相关的证据表明,虾和西红柿是不能一起吃的,他们之间应该没有在一起吃会导致中毒的物质存在吧!如果有人吃这两样东西中毒的话,我觉得应该不是这两种食物自身的原因...
西安石油大学机械系07级数控机床呢编程技术试卷和答案 急急急 快的...
A.生产场地 B.生产环境 C.生产空间(二) 基础知识2.2.2 加工(B)零件,宜采用数控加工设备。A. 大...措施(减小Vc的办法):改善导轨面间和摩擦特性(滚动--静压--滑动(塑料))、提高传动刚度、减轻运动件的
谁知道祖国在我心中演讲稿500字?
乌云笼罩下的中国在艰难的行进。祖国的路在何方?民族的希望何在?此时此刻,是一个又一个中华儿女,在这母亲生死存忘的危难关头,是他们用一股股豪情,一片...但是我们可能要阻挡不期而来的洪水,抗击非典,预防禽流感,我们的飞船要上天,我们的足球要获胜,我们要研究转基因,我们要征服沙尘暴,我们要保护环境、维护世界...
安利怎么样
而我们中医,找到为什么别人的癌细胞控制在安全的标准,而你的怎么就没有控制住了呢,原来是你某方面创造了细菌生存的环境,只要把这个人体的环境变一下,细胞就不会大量繁殖,控制在一个安全的范围内。我们从来没有想过要杀死什么细胞,只要你对我们人体不造成伤害的话,我们就不伤害你,所以可以这样和...
鲁迅 风筝
幼时的保姆长妈妈,在备受歧视的环境中给予过他真诚的关心的藤野先生,一生坎坷、孤傲不羁的老友范爱农,给过他无限乐趣的“百草园”,吸引着他的好奇心的民间戏剧和民间娱乐活动……所有这一切,都是在这个险恶世界的背景上透露出亮色和暖意的事物,是他们,滋养了鲁迅的生命。这些散文,把抒情、叙述、议论...
创业计划书怎么写
[你公司或项目名称]目前正致力于[界定一下环境或有潜力的技术,或者生产线]的研究工作,这项五、价值...参考资料: http:\/\/bbs.chinavcpe.com\/forum.action?forumId=13 49 已赞过 已踩过< 你对这个回答
吃葡萄锌对皮肤有好处吗
葡萄中所含的抗氧化剂也对皮肤具有益处。抗氧化剂可以中和自由基,减少氧化应激对皮肤造成的伤害。而葡萄中丰富的多酚类化合物就是一种有效的抗氧化剂。这些抗氧化剂能够保护皮肤细胞免受外界环境的侵害,减少因紫外线、污染物等引起的皮肤问题,如色斑、皱纹等。因此,适量摄入葡萄可以提供皮肤所需的抗...
戴策纳尔: 在 Windows7 下安装Visual C++ 6.0 要注意: 1在安装或者使用 Visual C++ 6.0 时,凡是出现兼容性问题提示对话框,一律按以下方式处理 把"不再显示此消息"打上勾,然后选择"运行程序". 2在安装 VC 的时候,选择"custom(自定义安装)";接下来就要注意了
香洲区15885507331: 如何在vc6.0配置opengl - ?
戴策纳尔: 第一步:选择一个编译环境现在Windows系统的主流编译环境有VisualStudio,BrolandC++Builder,Dev-C++等,它们都是支持OpenGL的. 但这里选择VC++6.0作为学习OpenGL的环境. 第二步:安装GLUT工具包GLUT不是OpenGL所必须的...
香洲区15885507331: 在vc++6.0怎么建立一个关于OpenGL的工程?
戴策纳尔:首先需要配置环境 在 http://www.xmission.com/~nate/glut/glut-3.7.6-bin.zip中下载最新的glut.h glut32.lib glut32.dll. 第一步:将glut32.dll按路径:windows\system32\放入, 第二步:将glut32.lib按路径:Microsoft Visual Studio\vc98\lib\放入 第三步:...
香洲区15885507331: 在vc++6.0怎么建立一个关于OpenGL的工程 - ?
戴策纳尔: 跟写普通的C程序一样,创建C控制台和C++ source file,只是要把opengl的函数库include
香洲区15885507331: win7系统,求在VC++6.0中配置openGL的方法! - ?
戴策纳尔: 扩展库的配置吧 (1)“d:\Program Files\Microsoft Visual Studio\VC98\include\GL文件夹”.把扩展库头文件放这里,比如glut.h glew.h (2)“d:\Program Files\Microsoft Visual Studio\VC98\lib文件夹”.把lib文件放这里,比如glut.lib glut32.lib (3)“C:\Windows\System32”.把dll文件放在这里,比如glut.dll glut32.dll
香洲区15885507331: 在2010版的VC++环境下,构造基于OpenGL的框架步骤有哪些啊?请好心人赐教.?
戴策纳尔: 还是我来告诉你吧!一般都分4步吧.记得不是很清楚,推荐你看《学OPENGL编3D游戏》这本书讲解的一般,但是提供完整的程序以及源代码.以前自学的时候看过下下,好久没接触OPENGL这个库了. 1OPENGL的检测安装 2INIT视口的转换 3清除OPENGL 4render图像的处理
香洲区15885507331: 如何在win7系统,VC++6.0中配置openGL的方法!还有在vc2010环境下野怎么弄... - ?
戴策纳尔: 在这个地方[http://www.opengl.org/resources/libraries/glut/glutdlls37beta.zip]下载glut的预编译包.1.里面的glut.h头文件和vc include目录下的gl目录下面.2.里面的glut32.lib放在lib目录下.3.里面的glut32.dll放在windows系统目录下4.之后在代码中添加“#include <gl/glut.h> ”就可以了.2010也一样.
香洲区15885507331: 请各位指教:我在中文版vc6.0中设置opengl按照以下步骤进行的,但是运行示例程序时出现了错误,显示 - ?
戴策纳尔: 在任意 .cpp 文件中加入#pragma comment( lib, "glut32.lib" )
香洲区15885507331: 本人刚学opengl,请问用VC++编写opengl程序如何操作,需建立什么工程和文件类型,谢谢?
戴策纳尔: 我来告诉你标准答案!主要就是设置编译环境的包含目录和库目录,让代码能include到gl.h等头文件,链接时能找到opengl32.lib等文件,或者把相关文件直接复制到代码目录里也行.工程类型就看需要了,简单调试opengl部分代码,命令行就够用,命令行的需要glut,aux等里面的简单的窗口支持,通过它们使用系统的.win32,mfc等的图形界面的工程就需要wgl等函数创建和管理opengl渲染环境:GLXX窗口系统的(LINUX,UNIX...)AGLAppleMacintoshPGLIBMOS/2WarpWGLMicrosoftWindows
香洲区15885507331: 如何在VC++中使用OPENGL - ?
戴策纳尔: 很简单,你下载一个OPENGL的库. 然后安装, 在VC编程开头加入这个库文件 就可以调用OPENGL了!