VS2008 openGL环境配置和glut库的加入 VS2008 openGL环境配置和glut库的加入

来源:互联网 发布:遗传算法 知乎 编辑:程序博客网 时间:2024/05/20 20:47

openGL VC6.0(Microsoft Visual C++ 6.0)环境配置

1,头文件的包含:openGL相关的头文件在 */include/gl 目录中,主要有 gl.h glu.h glaux.h 根据需要include就行。
2
,连接库的设置:菜单- 工程- 设置- 连接- 对象/库模块 中加入opengl32.lib glu32.lib,注意用空格隔开*.lib

[VC6.0具体示例]
1
,新建工程:菜单-文件-新建-工程-Win32 Application-工程名-确定-一个空工程-完成。
2
,加入源文件:文件-新建-C++ Source File-文件名-确定-编写代码(可以参考后面的示例代码)
3
,设置连接库: 工程- 设置- 连接- 对象/库模块 中加入opengl32.lib glu32.lib,注意用空格隔开各*.lib
4
,编译连接运行。


openGL VS2008(Microsoft Visual Studio 2008)环境配置

1,头文件的包含:openGL相关的头文件在 */include/gl 目录中,主要有 gl.h glu.h glaux.h 根据需要include就行。
2
,连接库的设置:项-属性(快捷键ALT+F7) -配置属性-连接器-输入-附加依赖项 中加入opengl32.lib glu32.lib,注意用空格隔开*.lib

[VS2008具体示例]
1
,新建工程:菜单-文件-新建-项目-Visual C++-Win32 项目-工程名-确定-空项目-完成。
2
,加入源文件:解决方案资源管理器中的源文件点击右键-添加-新建项-C++文件-输入名称-确定-编写代码(可以参考后面的示例代码)
3
,设置连接库: 项目-属性(快捷键ALT+F7) -配置属性-连接器-输入-附加依赖项 中加入opengl32.lib glu32.lib,注意用空格隔开各*.lib
4
,编译连接运行。

[示例代码]
#include <windows.h>
#include <gl/gl.h>
#include <gl/glu.h>

HWND hWnd;
HDC hDC;
HGLRC hRC;

void SetupPixelFormat()
{
PIXELFORMATDESCRIPTOR pfd,* ppfd;
int pixelformat;
ppfd=&pfd;
ppfd->nSize=sizeof(PIXELFORMATDESCRIPTOR);
ppfd->nVersion=1;
ppfd->dwFlags=PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
ppfd->dwLayerMask=PFD_MAIN_PLANE;
ppfd->iPixelType=PFD_TYPE_COLORINDEX;
ppfd->cColorBits=16;
ppfd->cDepthBits=16;
ppfd->cAccumBits=0;
ppfd->cStencilBits=0;

pixelformat=ChoosePixelFormat(hDC,ppfd);
SetPixelFormat(hDC,pixelformat,ppfd);
}

void InitGraphics()
{
hDC=GetDC(hWnd);
SetupPixelFormat();
hRC=wglCreateContext(hDC);
wglMakeCurrent(hDC,hRC);
glClearColor(0,0,0,0.5);
glClearDepth(1.0);
glEnable(GL_DEPTH_TEST);
}

void ResizeGraphics()
{
RECT rect;
GetClientRect(hWnd,&rect);
int width=rect.right;
int height=rect.bottom;

GLfloat aspect=(GLfloat)width/height;

glViewport(0,0,width,height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0,aspect,1.0,100.0);
glMatrixMode(GL_MODELVIEW);
}

void DrawGraphics()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslated(0,0,-10);
glBegin(GL_QUADS);
glColor3d(1,0,0);
glVertex3d(-2,2,0);
glVertex3d(2,2,0);
glVertex3d(2,-2,0);
glVertex3d(-2,-2,0);
glEnd();
SwapBuffers(hDC);
}

long WINAPI MainWndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
switch(uMsg)
{
case WM_SIZE:
   ResizeGraphics();
   break;
case WM_CLOSE:
   DestroyWindow(hWnd);
   break;
case WM_DESTROY:
   PostQuitMessage(0);
   break;
default:
   return DefWindowProc(hWnd,uMsg,wParam,lParam);
}
return 1;
}

int WINAPI WinMain(HINSTANCE hInstance,
       HINSTANCE hPrevInstance,
       LPSTR lpCmdLine,
       int nShowCmd)
{
const TCHAR AppName[]=TEXT("OpenGL Sample");
WNDCLASS cwnd;
MSG msg;

cwnd.style=0;
cwnd.lpfnWndProc=MainWndProc;
cwnd.cbClsExtra=0;
cwnd.cbWndExtra=0;
cwnd.hInstance=hInstance;
cwnd.hIcon=LoadIcon(hInstance,AppName);
cwnd.hCursor=LoadCursor(NULL,IDC_ARROW);
cwnd.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
cwnd.lpszMenuName=AppName;
cwnd.lpszClassName=AppName;

if(! RegisterClass(&cwnd))
   return 1;
hWnd=CreateWindow(AppName,AppName,
   WS_OVERLAPPEDWINDOW | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
   CW_USEDEFAULT,
   CW_USEDEFAULT,
   800,600,NULL,NULL,hInstance,NULL);
if(! hWnd) return 0;
InitGraphics();
ShowWindow(hWnd,nShowCmd);
UpdateWindow(hWnd);
while(1)
{
   if(PeekMessage(&msg,NULL,0,0,PM_NOREMOVE))
   {
    if(! GetMessage(&msg,NULL,0,0))
     return true;
    TranslateMessage(&msg);
    DispatchMessage(&msg);
   }
   DrawGraphics();
}

wglDeleteContext(hRC);
ReleaseDC(hWnd,hDC);
return msg.wParam;
}

另外:
openGL
有一个glut库能支持更快的开发openGL程序,里面包含了glut.h glut.lib glut.dll glut32.lib glut32.dll

glut库可以到官网下载http://www.opengl.org


*.dll 当然是复制到windows/system32
*.lib
如果是VC6.0,复制到 */VC98/Lib
如果是VS2008,复制到 */VC/lib
Glut.h
如果是VC6.0,复制到 */VC98/include/gl
如果是VS2008,复制到 */VC/include/gl (没有gl目录就新建一个)

[一个glut支持的代码(可以用来检测glut是否添加成功)]
#include <GL/glut.h>
void myDisplay()
{
glClear(GL_COLOR_BUFFER_BIT);
glRectf(-0.5f, -0.5f, 0.5f, 0.5f);
glFlush();
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowPosition(100, 100);
glutInitWindowSize(400, 400);
glutCreateWindow("
第一个OpenGL程序");
glutDisplayFunc(&myDisplay);
glutMainLoop();
return 0;
}

个人学习openGL笔记,如果有误,请在评论中指正。

 

  //  两个可以一起来看,方便学习

OpenGL作为当前主流的图形API之一,它在一些场合具有比DirectX更优越的特性。
1
、与C语言紧密结合。

OpenGL
命令最初就是用C语言函数来进行描述的,对于学习过C语言的人来讲,OpenGL是容易理解和学习的。如果你曾经接触过TCgraphics.h,你会发现,使用OpenGL作图甚至比TC更加简单。

2
、强大的可移植性。

微软的Direct3D虽然也是十分优秀的图形API,但它只用于Windows系统(现在还要加上一个XBOX游戏机)。而OpenGL不仅用于 Windows,还可以用于Unix/Linux等其它系统,它甚至在大型计算机、各种专业计算机(如:医疗用显示设备)上都有应用。并且,OpenGL 的基本命令都做到了硬件无关,甚至是平台无关。

3
、高性能的图形渲染。

OpenGL
是一个工业标准,它的技术紧跟时代,现今各个显卡厂家无一不对OpenGL提供强力支持,激烈的竞争中使得OpenGL性能一直领先。

总之,OpenGL是一个很NB的图形软件接口。至于究竟有多NB,去看看DOOM3QUAKE4等专业游戏就知道了。
 

下面将对Windows下的OpenGL编程进行简单介绍。


学习OpenGL前的准备工作

第一步,选择一个编译环境

现在Windows系统的主流编译环境有Visual StudioBroland C++ BuilderDev-C++等,它们都是支持OpenGL的。

我选择Visual Studio 2008VC6++作为学习OpenGL的环境。

第二步,安装GLUT工具包

GLUT
不是OpenGL所必须的,但它会给我们的学习带来一定的方便,推荐安装。

Windows
环境下的GLUT下载地址:(大小约为150k

自已找

Windows环境下安装GLUT的步骤:
1
、将下载的压缩包解开,将得到5个文件

2
、在我的电脑中搜索“gl.h”,并找到其所在文件夹


如果是VC++6,则应该将glut.h复制在“D:/Program Files/MicrosoftVisualStudio/VC98   /Include/GL文件夹)。 如果是VisualStudio2008,把glut.h复制到x:/Program Files/Microsoft/Visual Studio 9.0/VC/include/GL文件夹中,如果没有GL这个文件夹则可以自己新建一个。(x是你安装VS的盘符号,如果装的是VC++的话,里面有个gl文件,Visual Studio 2008则需要自己去新建一个)

3
、把解压得到的glut.libglut32.lib放到静态函数库所在文件夹(即与include并排的lib文件夹下)。

4
、把解压得到的glut.dllglut32.dll放到操作系统目录下面的system32文件夹内。(典型的位置为:C:/Windows/System32

第三步,建立一个OpenGL工程

无论VisualStudio2008还是VC++6

选择File->New->Project,然后选择Win32 Console Application(不是win32 application).选择一个名字,然后按OK。在谈出的对话框左边点Application Settings,找到Empty project并勾上,选择Finish。然后向该工程添加一个代码文件,取名为“OpenGL.c”,注意用.c来作为文件结尾。

搞定了,就跟平时的工程没什么两样的。


注意: 包含头文件
:

#include <GL/glut.h>
#pragma comment(lib, "opengl32.lib")
#pragma comment(lib, "glu32.lib")
#pragma comment(lib, "glut32.lib")

第一个OpenGL程序


一个简单的OpenGL程序如下:(注意,如果需要编译并运行,需要正确安装GLUT,安装方法如上所述)


#include <GL/glut.h>
void myDisplay(void)
{
    glClear(GL_COLOR_BUFFER_BIT);
    glRectf(-0.5f, -0.5f, 0.5f, 0.5f);
    glFlush();
}
int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(400, 400);
    glutCreateWindow("
第一个OpenGL程序
");
    glutDisplayFunc(&myDisplay);
    glutMainLoop();
    return 0;
}

该程序的作用是在一个黑色的窗口中央画一个白色的矩形。下面对各行语句进行说明。



首先,需要包含头文件#include <GL/glut.h>,这是GLUT的头文件。

本来OpenGL程序一般还要包含<GL/gl.h><GL/glu.h>,但GLUT的头文件中已经自动将这两个文件包含了,不必再次包含。



然后看main函数。

int main(int argc, char *argv[])
,这个是带命令行参数的main函数,各位应该见过吧?没见过的同志们请多翻翻书,等弄明白了再往下看。

注意main函数中的各语句,除了最后的return之外,其余全部以glut开头。这种以glut开头的函数都是GLUT工具包所提供的函数,下面对用到的几个函数进行介绍。

1
glutInit,对GLUT进行初始化,这个函数必须在其它的GLUT使用之前调用一次。其格式比较死板,一般照抄这句glutInit(&argc, argv)就可以了。

2
glutInitDisplayMode,设置显示方式,其中GLUT_RGB表示使用RGB颜色,与之对应的还有GLUT_INDEX(表示使用索引颜色)。GLUT_SINGLE表示使用单缓冲,与之对应的还有GLUT_DOUBLE(使用双缓冲)。更多信息,请自己Google。当然以后的教程也会有一些讲解。

3
glutInitWindowPosition,这个简单,设置窗口在屏幕中的位置。

4
glutInitWindowSize,这个也简单,设置窗口的大小。

5
glutCreateWindow,根据前面设置的信息创建窗口。参数将被作为窗口的标题。注意:窗口被创建后,并不立即显示到屏幕上。需要调用glutMainLoop才能看到窗口。

6
glutDisplayFunc,设置一个函数,当需要进行画图时,这个函数就会被调用。(这个说法不够准确,但准确的说法可能初学者不太好理解,暂时这样说吧)。

7
glutMainLoop,进行一个消息循环。(这个可能初学者也不太明白,现在只需要知道这个函数可以显示窗口,并且等待窗口关闭后才会返回,这就足够了。)


glutDisplayFunc函数中,我们设置了当需要画图时,请调用myDisplay函数。于是myDisplay函数就用来画图。观察myDisplay中的三个函数调用,发现它们都以gl开头。这种以gl开头的函数都是OpenGL的标准函数,下面对用到的函数进行介绍。

1
glClear,清除。GL_COLOR_BUFFER_BIT表示清除颜色,glClear函数还可以清除其它的东西,但这里不作介绍。

2
glRectf,画一个矩形。四个参数分别表示了位于对角线上的两个点的横、纵坐标。

3
glFlush,保证前面的OpenGL命令立即执行(而不是让它们在缓冲区中等待)。其作用跟fflush(stdout)类似。

原创粉丝点击