Windows7+VS2010下OpenGL的环境配置

http://johnhany.net/2014/01/environment-for-opengl-with-vs2010/

OpenGL(Open Graphics Library)是一个开放的、跨编程语言、跨平台的API库,提供了大量的针对图形硬件的软件接口,主要用于绘制高性能的二维和三维图形。它的一个子集OpenGL ES主要针对嵌入式系统,比如手机、平板等,目前也开始流行起来。

GLSL(OpenGL Shading Language)是OpenGL 2.0版本开始引入的编程语言,用来编写运行在GPU上的着色程序,以代替之前所采用的固定功能管线(fixed-function pipeline)。直到3.x版本起,固定功能管线被彻底弃用,而完全被基于着色器(shader)的新功能所代替。OpenGL 3.0是最后一个同时存在新老两种功能的版本。

目前OpenGL最新版本是4.4,GLSL的最新版本是4.4。

由于OpenGL本身只包含涉及渲染的核心函数,而不包括平台相关的UI、文件输入输出、键盘鼠标交互等功能,在不同平台上一般采用不同的扩展库来辅助开发。在UNIX、Linux和Mac OS X平台上一般采用GLUT库实现图形界面,但已经很久没有更新了;在Windows平台上,freeglut会更实用一些。因为调用OpenGL的函数时需要频繁地调用和管理函数指针,可以使用GLEW代替这些繁琐的操作,而且GLEW还会根据你的平台决定使用哪些扩展。



检查兼容性

OpenGL版本众多,而且各显卡厂商也有自己开发的扩展库。要想使用某个版本进行开发,既需要显卡本身支持所需的功能,又需要驱动程序能兼容这个版本。决定使用哪一个版本之前,先要用GPU Caps Viewer检查一下支持的OpenGL和GLSL的最高版本和具体支持哪些扩展。我的笔记本比较老,仅能支持OpenGL 3.0和GLSL 1.3。

准备文件

http://www.opengl.org/resources/libraries/glut/glutdlls37beta.zip下载GLUT;

https://sourceforge.net/projects/glew/files/glew/1.10.0/glew-1.10.0-win32.zip/download下载GLEW。

可以在http://www.transmissionzero.co.uk/software/freeglut-devel/下载freeglut。为了尽可能减少干扰因素,下文的样例程序没有用freeglut,而仅使用GLUT库。

把解压得到的glutdlls37beta文件夹中的glut.h,和glew-1.10.0-win32\glew-1.10.0\include\GL文件夹中的glew.h、glxew.h、wglew.h共4个文件拷贝到C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Include\gl目录下。(粗体的2个文件是必需的)

把解压得到的glutdlls37beta文件夹中的glut.libglut32.lib,和glew-1.10.0-win32\glew-1.10.0\lib\Release\Win32文件夹中的glew32.lib、glew32s.lib,还有glew-1.10.0-win32\glew-1.10.0\lib\Release MX\Win32文件夹中的glew32mx.lib、glew32mxs.lib共6个文件拷贝到C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Lib目录下。(粗体的3个文件是必需的)

把解压得到的glutdlls37beta文件夹中的glut.dll、glut32.dll,和glew-1.10.0-win32\glew-1.10.0\bin\Release\Win32文件夹中的glew32.dll拷贝到C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin目录下。(粗体的2个文件是必需的)

如果发现这样运行下面的样例代码时提示缺少lib或dll文件,可以参考这篇文档修改添加文件的位置。

所需的文件也可以在这里下载。

如果想使用freeglut,其.h、.lib和.dll文件的位置与GLUT和GLEW是相同的。



配置工程

打开Visual Studio 2010,新建一个Visual C++的Win32 Console Application,选项使用默认的,即Application Type为Console Application,Additional Options选Precompiled Header,其他选项都不勾选。

打开项目Properties窗口,找到Configuration Properties -> Linker -> Input ->Additional Dependencies,添加glew32.lib。如果使用了freeglut,还要添加freeglut.lib。

如果还使用了freeglut库,还需要在Configuration Properties -> VC++ Directories -> Include Directories中增加 C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Include\freeglut。



样例代码

把下面的代码粘贴到main.cpp文件:

如果使用了freeglut,需要把第8行的“gl/glut.h”改为“freeglut.h”。


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

#include <stdafx.h>

#include <stdio.h>

#include <stdlib.h>

#include <gl/glew.h>

#ifdef __APPLE__

#  include <gl/glut.h>

#else

#  include <gl/glut.h>

#endif

static struct {

    GLuint vertex_buffer, element_buffer, color_buffer;

    GLuint vertex_shader, fragment_shader, program;

    //用于保存CPU端的object名称

    struct {

        GLint position;

        GLint inColor;

    } attributes;

    //用于保存GPU端attribute变量的地址

} names;

static const GLfloat position_data[] = {

    0.0, 0.6,

    -0.6, -0.4,

    0.6, -0.4

};

static const GLfloat color_data[] = {

    1.0, 0.0, 0.0, 1.0,

    0.0, 1.0, 0.0, 1.0,

    0.0, 0.0, 1.0, 1.0

};

static const GLushort element_data[] = { 0, 1, 2 };

static void infoLog(GLuint object, PFNGLGETSHADERIVPROC glGet__iv, PFNGLGETSHADERINFOLOGPROC glGet__InfoLog)

{

    GLint log_length;

    char *log;

    glGet__iv(object, GL_INFO_LOG_LENGTH, &log_length);

    log = (char *)malloc(log_length);

    glGet__InfoLog(object, log_length, NULL, log);

    fprintf(stderr, "%s", log);

    free(log);

}

void *readShader(const char *filename, GLint *length)

{

    FILE *f = fopen(filename, "r");

    void *buffer;

    if (!f) {

        fprintf(stderr, "Unable to open %s for reading\n", filename);

        return NULL;

    }

    fseek(f, 0, SEEK_END);

    *length = ftell(f);

    fseek(f, 0, SEEK_SET);

    buffer = malloc(*length+1);

    *length = fread(buffer, 1, *length, f);

    fclose(f);

    ((char*)buffer)[*length] = ‘\0‘;

    return buffer;

}

static GLuint initShader(GLenum type, const char *filename)

{

    GLint length;

    GLchar *source = (GLchar *)readShader(filename, &length);

    GLuint shader;

    GLint shader_ok;

    if (!source)

        return 0;

    shader = glCreateShader(type);

    //创建shader object

    glShaderSource(shader, 1, (const GLchar**)&source, &length);

    //导入shader的代码

    //count - string的行数

    //length - 指向包含string每行字数的数组

    free(source);

    glCompileShader(shader);

    //编译shader代码

    glGetShaderiv(shader, GL_COMPILE_STATUS, &shader_ok);

    //查询shader的状态,导出可能的编译错误

    if (!shader_ok) {

        fprintf(stderr, "Failed to compile %s:\n", filename);

        infoLog(shader, glGetShaderiv, glGetShaderInfoLog);

        glDeleteShader(shader);

        getchar();

    }

    return shader;

}

static void installShaders(void)

{

    names.vertex_shader = initShader(GL_VERTEX_SHADER, "HelloWorld-vs.glsl");

    names.fragment_shader = initShader(GL_FRAGMENT_SHADER, "HelloWorld-fs.glsl");

    GLint program_ok;

    names.program = glCreateProgram();

    glAttachShader(names.program, names.vertex_shader);

    glAttachShader(names.program, names.fragment_shader);

    //把shader依附在同一个program上,以连接两个shader

    glLinkProgram(names.program);

    //链接program,在GPU端创建相应可执行文件,并初始化uniform变量及其地址

    glGetProgramiv(names.program, GL_LINK_STATUS, &program_ok);

    //查询program的状态,并导出可能的错误

    if (!program_ok) {

        fprintf(stderr, "Failed to link shader program:\n");

        infoLog(names.program, glGetProgramiv, glGetProgramInfoLog);

        glDeleteProgram(names.program);

        getchar();

    }

    glUseProgram(names.program);

    //激活program后才能为shader指定uniform变量的值

}

static void initBuffers(void)

{

    names.attributes.position = glGetAttribLocation(names.program, "position");

    names.attributes.inColor = glGetAttribLocation(names.program, "inColor");

    //获取GPU端attribute变量的地址保存在本地变量中,用于值的传递

    glGenBuffers(1, &names.vertex_buffer);

    //产生1个buffer object的名称,并分配显存空间

    glBindBuffer(GL_ARRAY_BUFFER, names.vertex_buffer);

    //把产生的buffer object与相应target绑定,以改变其值

    glBufferData(GL_ARRAY_BUFFER, sizeof(position_data), position_data, GL_STATIC_DRAW);

    //GL_STATIC_DRAW其他可用参数:

    //STATIC - 长时间不更改的值     DYNAMIC - 需要频繁改变的值      STREAM - 需要偶尔重写整个buffer的值

    //DRAW - 保存于GPU用于绘制的值       READ - 保存于CPU用于读取的值     COPY - 折衷

    glVertexAttribPointer(names.attributes.position, 2, GL_FLOAT, GL_FALSE, sizeof(GLfloat)*2, (void*)0);

    glEnableVertexAttribArray(names.attributes.position);

    glGenBuffers(1, &names.color_buffer);

    glBindBuffer(GL_ARRAY_BUFFER, names.color_buffer);

    glBufferData(GL_ARRAY_BUFFER, sizeof(color_data), color_data, GL_STATIC_DRAW);

    glVertexAttribPointer(names.attributes.inColor, 4, GL_FLOAT, GL_FALSE, sizeof(GLfloat)*4, (void*)0);

    glEnableVertexAttribArray(names.attributes.inColor);

    glGenBuffers(1, &names.element_buffer);

    glBindBuffer(GL_ARRAY_BUFFER, names.element_buffer);

    glBufferData(GL_ARRAY_BUFFER, sizeof(element_data), element_data, GL_STATIC_DRAW);

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, names.element_buffer);

}

static void idleFunc(void)

{

}

static void displayFunc(void)

{

    glClearColor(1.0, 1.0, 1.0, 1.0);

    glClear(GL_COLOR_BUFFER_BIT);

    glDrawElements(GL_TRIANGLE_STRIP, 3, GL_UNSIGNED_SHORT, (void*)0);

    glutSwapBuffers();

}

int main(int argc, char** argv)

{

    glutInit(&argc, argv);

    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);

    glutInitWindowSize(400, 400);

    glutCreateWindow("Hello World");

    glutIdleFunc(&idleFunc);

    glutDisplayFunc(&displayFunc);

    glewInit();

    if (!GLEW_VERSION_2_0) {

        fprintf(stderr, "OpenGL 2.0 not available\n");

        getchar();

    }

    //与glew扩展库相关的函数要在glewInit()后执行

    installShaders();

    initBuffers();

    glutMainLoop();

    return 0;

}

在工程内新建一个名为HelloWorld-vs.glsl的文件,内容如下:


1

2

3

4

5

6

7

8

9

10

11

#version 130

attribute vec2 position;

attribute vec4 inColor;

varying vec4 outColor;

void main()

{

    gl_Position = vec4(position, 0.0, 1.0);

    outColor = inColor;

}

再新建一个名为HelloWorld-fs.glsl的文件,内容如下:


1

2

3

4

5

6

7

8

#version 130

varying vec4 outColor;

void main()

{

    gl_FragColor = outColor;

}

运行结果如下:

时间: 2024-10-11 06:17:08

Windows7+VS2010下OpenGL的环境配置的相关文章

计算机图形学-mac系统下Xcode中OpenGL开发环境配置。

mac系统下Xcode中OpenGL开发环境配置. 这学期有计算机图形学的课程,需要用到OpenGL,最近着手开始配置开发环境了,老师上课给的安装包都是基于windows系统的.网上也是windows上配置的教程比较多,Mac版的比较少.我综合了几个教程并自己总结,实践成功.特来分享配置过程.希望能帮到大家! 介绍 OpenGL(Open Graphics Library)是定义了一个跨编程语言,跨平台的编程接口规格的专业的图形程序接口.它用于三维图像(二维亦可),是一个功能强大,与硬件无关,调

(转)VC6.0中OpenGL开发环境配置

首先简单介绍一下OpenGL: OpenGL作为当前主流的图形API之一,它在一些场合具有比DirectX更优越的特性.       OpenGL官方网站(英文)    http://www.opengl.org 然后设置编程的一些环境,及其安装必备文件的步骤如下: 第一步:选择一个编译环境 现在Windows系统的主流编译环境有Visual Studio,Broland C++ Builder,Dev-C++等,它们都是支持OpenGL的.但这里我们选择VC++ 6.0作为学习OpenGL的环

windows7 x64下maven安装和配置

http://maven.apache.org/download.cgi下载maven 环境配置 验证配置是否成功 本地仓库配置 这是原来的配置文件: 更改为: link 离线安装 eclipse maven 插件 创建link文件指向插件位置(推荐) 1.把文件下的features目录和plugins目录解压到任意位置,我解压的位置是eclipse的文件目录myplugins下 2. 在Eclipse安装目录下的links目录新建文本文档,并更名为maven.link. 3. 编辑maven.

windows下spark开发环境配置

http://www.cnblogs.com/davidwang456/p/5032766.html windows下spark开发环境配置 --本篇随笔由同事葛同学提供. 特注:windows下开发spark不需要在本地安装hadoop,但是需要winutils.exe.hadoop.dll等文件,前提是你已经安装了eclipse.maven.jdk等软件 spark支持jdk版本建议是1.8及以上,如果开发spark建议将jdk编译版本设置为1.8 我选择的spark是spark-1.4.0

[傻瓜版] Redis在Windows下的开发环境配置步骤

redis默认运行在unix体系下,windows无法直接运行官方版.以下是几种解决方案, 一)Windows移植版.启动速度飞快,优先推荐使用. a) 2.6.12 是稳定版,我用来64位版做开发环境,数个月未发现重要问题.  下载地址: https://github.com/MSOpenTech/redis/tree/2.6/bin/release b) 2.8.4 是3月24发布的最新版,此版本运行时会临时占用内存大小的硬盘空间,下载地址: https://github.com/MSOpe

linux mint系统下编程相关环境配置

学习web开发,用到linux系统,在师兄的帮助下还算不是很费劲的把一些环境配置好了. 清单: skype ibus Google Chrome open-jdk-7.0 android-sdk ant github node.js rvm rvm.ruby rvm.rails yeoman RubyMine IntelliJ IDEA 注意:以下的命令行都是一行一行的在终端中执行 1. skype 和Chrome 在软件管理器中搜索skype,第一个,skype,点击安装. chrome 到h

Windows下Android开发环境配置

最近在配置安卓. 还是拿舍友没带回家的手机.. 自己手机是WP.. 搞了半天搞好了. 叹了口气,要是有人这样教我就好了,少走好多弯路. 废话不说,步骤如下" 一.安装JDK 为啥要安装JDK就不说了吧?java写安卓.. 传送门: http://www.oracle.com/technetwork/java/javase/downloads/index.html 安装完后,配置环境变量: 右击 "我的电脑"->属性->高级->环境变量->系统变量-&g

ubuntu下openoffice开发环境配置

安装openoffice或者liboffice 路径:/usr/lib/openoffice/program ,soffice 开启服务: 安装JDK - 其默认路径:jdk7 版本号:1.7...,jdk6版本号:1.6... jodconvert的安装 http://ncu.dl.sourceforge.net/project/jodconverter/JODConverter/2.2.2/jodconverter-2.2.2.zip java -jar /tmp/ppt2pdf/jodco

【Objective-C】Windows下Objective-C开发环境配置

[Objective-C]Windows下Objective-C开发环境配置 ftp://ftpmain.gnustep.org/pub/gnustep/binaries/windows/ 最近打算针对iPhone.iPod touch和iPad开发一些应用,所以,需要开始学习Objective C(苹果推出的类似C语言的开发语言).由于苹果的自我封闭的产业链发展模式(从芯片.机器.开发语言.终端产品.服务)的限制,要想开发针对苹果 iPhone等产品的应用程序,就需要用Mac机器,在Xcode