在Visual Studio 2010上搭建Opengl环境

来源:互联网 发布:linux curl 命令 post 编辑:程序博客网 时间:2024/05/29 03:22

在Visual Studio 2010上搭建Opengl环境

最近在看Opengl编程指南第8版,第八版采用的是Opengl4.3的环境,我将它与之前的第7版的目录对比了一下,发现第8版与第7版有了翻天覆地的变化,好像第八版把重点都放在了着色语言上面。
那么为了满足好奇心,于是就想从第一个例子开始敲进电脑看看,正好我装了vs2010,而且之前使用过别的计算机图形学课程给的Opengl框架做的程序,于是直接去Opengl编程指南给定的网站下载了例程,发现example1.1没有包含在例程里面,本着试一下的心态,我把他的程序弄到vs2010里面,一编译,我的天,茫茫多的报错,查了一晚上的网上的解决办法,最后终于搞定了,下面记录一下如何在vs2010里面搭建Openg4.3支持的环境:
首先上最后显示的图:
这里写图片描述
就是为了这两个三角形,我可是折腾了一晚上,从6点一直搞到了12点多!

由于我用的是VS2010所以仅描述我是如何搭建起来vs2010 环境的过程,后面会给出代码,其实代码在书中都有,不过例1.1就剩去了大家敲打的时间了:) 。

书中提到他所用的是Opengl4.3,然后用了个freeglut库,glew库。
freeglut是glut之后的扩展库,因为glut没人维护了。
glew库是opengl的扩展包,支持显卡厂商以及高版本Opengl所需的库

首先打开你的vs2010安装目录,找到vc的文件夹,我的是:
:\Program Files (x86)\Microsoft Visual Studio 10.0\VC
进入下面的\include看看有没有\GL目录,然后回到VC目录,看看\lib下有没有opengl32.lib,glaux.lib等等,至少我新装的vs2010是没有的,这个可以从网上找到资源,比如这里Opengl库文件工具包这是别人提供的一个基础包,里面有所需的一些基本文件(但是没有freeglew,后面再说)。把此包打开,发现里面有三种类型的文件:.dll, .lib, .h
所有文件名字

这里对这三种文件请记住一个规律,后面也是如此:

  • 所有.dll文件放到\windows\system32\下,如果是64位操作系统,放到\windows\syswow64下面
  • 所有.lib放到\Program Files (x86)\Microsoft Visual Studio 10.0\VC\lib\下
  • 所有.h放到\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\GL\下,如果没有\GL目录自己建立一个

这样可以使vs2010自动加载这些库,而无需在文件前加入#include的命令了。
在vs2010里面的已有工程的” 项目-属性-配置属性-链接器-输入“右侧的附加依赖项添加glew32.lib;glut32.lib;glu32.lib;opengl32.lib;
如果以上文件不想放在提到的地方的话可以自行在vs2010里面“ 项目-属性-配置属性-vc++目录“右面的包涵目录和库目录自行指定。例如添加书中源代码提供的库地址,里面有gl3目录下的一些文件。

去网上下载新的freeglut和glew库,一般都会有个readme.txt之类的说明文档,并要求你在其下载下来的解压缩的目录里找到vs2010的工程目录,用vs2010打开它,生成release的解决方案(默认是debug,在上面下拉菜单),然后会有生成的.dll, .lib, .h三种文件在不同目录,复制并覆盖之前的三个位置,如此编译vs2010的例程基本就不会产生库的错误了。

此外,经实验,只要装了freeglut后,就无需旧版本的glut了包括lib,dll,h,可以删除或者改个后缀名。

下面给出example1.1的例程

#include <iostream>#include "vgl.h"#include "LoadShaders.h"using namespace std;enum VAO_IDs { Triangles , NumVAOs  };enum Buffer_IDs { ArrayBuffer, NumBuffers };enum Attrib_IDs { vPosition = 0 };GLuint VAOs[NumVAOs];GLuint Buffers[NumBuffers];const GLuint NumVertices = 6;//#pragma comment(lib,"glew32.lib")//#pragma comment(lib,"glut32.lib")//#pragma comment(lib,"freeglut.lib")//#   pragma comment (lib, "opengl32.lib")  /* link withMicrosoft OpenGL lib */voidinit(void){    glGenVertexArrays(NumVAOs, VAOs);    glBindVertexArray(VAOs[Triangles]);    GLfloat vertices[NumVertices][2] = {    { -0.90, -0.90 }, // Triangle 1    { 0.85, -0.90 },    { -0.90, 0.85 },    { 0.90, -0.85 }, // Triangle 2    { 0.90, 0.90 },    { -0.85, 0.90 }    };    glGenBuffers(NumBuffers, Buffers);    glBindBuffer(GL_ARRAY_BUFFER, Buffers[ArrayBuffer]);    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices),    vertices, GL_STATIC_DRAW);    ShaderInfo shaders[] = {    { GL_VERTEX_SHADER, "triangles.vert" },    { GL_FRAGMENT_SHADER, "triangles.frag" },    { GL_NONE, NULL }    };    GLuint program = LoadShaders(shaders);    glUseProgram(program);    glVertexAttribPointer(vPosition, 2, GL_FLOAT,    GL_FALSE, 0, BUFFER_OFFSET(0));    glEnableVertexAttribArray(vPosition);}//---------------------------------------------------------------------//// display//voiddisplay(void){    glClear(GL_COLOR_BUFFER_BIT);    glBindVertexArray(VAOs[Triangles]);    glDrawArrays(GL_TRIANGLES, 0, NumVertices);    glFlush();}intmain(int argc, char** argv){    glutInit(&argc, argv);    glutInitDisplayMode(GLUT_RGBA);    glutInitWindowSize(512, 512);    glutInitContextVersion(4, 3);    glutInitContextProfile(GLUT_CORE_PROFILE);    glutCreateWindow(argv[0]);    glewExperimental = GL_TRUE;     if (glewInit()) {    cerr << "Unable to initialize GLEW ... exiting" << endl;    exit(EXIT_FAILURE);    }    init();    glutDisplayFunc(display);    glutMainLoop();}

在原始程序上加了一句:glewExperimental = GL_TRUE;
官方的解释:

GLEW obtains information on the supported extensions from the graphics driver. Experimental or pre-release drivers, however, might not report every available extension through the standard mechanism, in which case GLEW will report it unsupported. To circumvent this situation, the glewExperimental global switch can be turned on by setting it to GL_TRUE before calling glewInit(), which ensures that all extensions with valid entry points will be exposed.

大意就是加上这个语句后强制让glweinit返回正确的值。

头文件vgl.h loadshader.h都在书中代码下载下来后的include目录里面
文件triangles.frag

#version 430 coreout vec4 fColor;voidmain(){fColor = vec4(0.0, 0.0, 1.0, 1.0);}

文件triangles.vert

#version 430 corelayout(location = 0) in vec4 vPosition;voidmain() {     gl_Position = vPosition;}

这里简单介绍一下后面这俩货是干嘛的:
主程序指定了这俩程序作为显卡上运行的两个程序,用着色语言写的,跟我们用的c比较像,但不完全一样,triangles.vert是处理每个顶点干什么的程序,这里就是把顶点的位置放到了gl_Position里, triangles.frag是决定顶点之间怎么填颜色的,暂时不用管它怎么知道顶点在哪得,里面有通信机制,这里就直接指定了一种颜色蓝色放进去。所以主程序说,我有几个点,然后还有几个颜色,然后就扔给triangles.vert,然后triangles.vert又把位置原封不动的扔给了triangles.frag,triangles.frag简单粗暴的把点之间的部分全部涂了蓝色,于是就出现了我们看见的两个蓝色三角。

总结:环境搭建确实比较坑爹,因为例程也没给出一个标准的几个库地址去哪里找,或者说用的什么版本,至少我在第一章没发现,如果按照上面方法还是不成功,就多找几个版本换着看看,这是学习Opengl的第一道门槛,迈过了就是一片坦途。

0 0
原创粉丝点击