导航:首页 > 编程语言 > opengl编程示例

opengl编程示例

发布时间:2022-09-02 07:04:46

Ⅰ 菜鸟学习OpenGL,做了下书上例子编译通过,运行到glGenBuffers(1,&vbo)出错;求指导

关于缓冲区的一些GL接口,是从GL1.5才开始有的,而windows自带的GL只支持到1.1版本。但如果你的显卡支持GL1.5以上的话,glew就很好的帮你完成了扩展工作,既然你用glew,那么就应该在使用GL任何一个接口前首先调用glewInit来初始化这些扩展,否则那些GL接口都不能使用。在你的init方法开头加glewInit就可以了。

Ⅱ opengl编写游戏的可移植性 具体表现在什么方面呢 请举几个例子.

OpenGL是个与硬件无关的软件接口,可以在不同的平台如Windows 95、Windows NT、Unix、Linux、MacOS、OS/2之间进行移植。
OpenGL是图形的底层图形库,不同的系统下有不同的库,在编程时调用它的库函数就可以了,具体库函数是怎么实现的编程时并不需要关心,所以一套源代码可以在不同系统中编译运行,我们只是在不同的系统下安装系统适用的OpenGL库就可以了。

而DirectX仅能用于Windows系列平台,所以不能被移植到其他的系统中。

opengl和directx并不都是游戏专用的,但因为游戏中都是有强大的图形界面,所以都要用到opengl和directx。

Ⅲ 求vc6.0下的openGL编程实例

3D魔方游戏,OpenGL编写,源程序
http://61.137.90.75/downloads104/sourcecode/game/655207603Dm.zip

Ⅳ vc ++6.0下 opengl系统开发环境文字

嘿嘿,我帮你凑一章出来

第三章 开发环境及相关技术的介绍
3.1 C语言特点
1. C是中级语言。它把高级语言的基本结构和语句与低级语言的实用性结合起来。C 语言可以像汇编语言一样对位、字节和地址进行操作, 而这三者是计算机最基本的工作单元。
2.C是结构式语言。结构式语言的显着特点是代码及数据的分隔化,即程序的各个部分除了必要的信息交流外彼此独立。这种结构化方式可使程序层次清晰,便于使用、维护以及调试。C 语言是以函数形式提供给用户的,这些函数可方便的调用,并具有多种循环、条件语句控制程序流向,从而使程序完全结构化。
3.C语言功能齐全。具有各种各样的数据类型,并引入了指针概念,可使程序效率更高。另外C语言也具有强大的图形功能,支持多种显示器和驱动器。而且计算功能、逻辑判断功能也比较强大,可以实现决策目的的游戏。
4. C语言适用范围大。适合于多种操作系统,如Windows、DOS、UNIX等等;也适用于多种机型。
C语言对编写需要硬件进行操作的场合,明显优于其它解释型高级语言,有一些大型应用软件也是用C语言编写的。
C语言具有绘图能力强,可移植性,并具备很强的数据处理能力,因此适于编写系统软件,三维,二维图形和动画。它是数值计算的高级语言。
5.C语言文件由数据序列组成,可以构成二进制文件或文本文件
3.2 C++语言特点
C++是一种静态数据类型检查的,支持多重编程范式的通用程序设计语言。它是由贝尔实验室的Bjarne Stroustrup设计和实现的。简单性是C++的一个重要设计准则:如果在某个地方有一个选择,简化语言的定义或者简化编译器,那么我们一定选前者。当然,还有一个最重要的考虑是保持与C的高度兼容性,这也就排除了对C语法的清理。C++语言的特性体现在以下方面:
C++没有内部的高级数据类型,也没有高级的基本操作。举例来说,它既没有提供带有求逆运算的矩阵类型,也没有带拼接运算的字符串类型。如果某个用户需要一个类型,那么可以在语言本身之中定义它。事实上,定义新的通用或者专用类型就是在C++里最基本的程序设计活动。一个设计良好的用户定义类型与一个内部类型之间的差异仅仅在于其定义的方式,而不在其使用方式。
在C++的设计中,极力避免了那些即使不用也会带来运行时间或者空间额外开销的特征。
C++被设计为能使用传统的编译和运行时的环境,也就是那种在UNIX上的C程序设计环境。幸运的是,C++从来没有被束缚于UNIX,它只是简单地采用UNIX和C作为一种语言、库、编译器、连接器、执行环境等之间关系的模型。这种最小化的模型帮助C++在几乎每个计算平台上取得了成功。然而,在那些提供了更多有意义的支持的环境里,使用C++当然就更好了,像动态加载、增量编译、类型定义数据库等都能得到很好的收效,又不会影响语言本身。
C++的类型检查和数据隐藏特征依赖于编译时对程序的分析,以防止因为意外而破坏数据的情况。它们并不提供系统安全性或防止某些人有意地打破这些规则。它们当然可以随意使用而不会带来运行时额外的时间或空间开销。这种想法是很有用的,一种语言特征必须不仅是优美的,还是在真实程序的环境中能够负担起的东西。
C++中特别强主见程序的结构。因此,良好的程序设计习惯及面向对象的编程思想在C++程序设计中是相当重要的。[6]
3.3 Windows SDK简介
微软每推出一个重要的Windows版本,一般都会同时推出一个SDK(Software Development Kit)。SDK包含了开发该Windows版本所需的Windows函数和常数定义、API函数说明文档、相关工具和示例。SDK一般使用C语言,但不包括编译器。SDK是Software Development Kit的缩写,中文意思是“软件开发工具包”。这是一个覆盖面相当广泛的名词,可以这么说:辅助开发某一类软件的相关文档、范例和工具的集合都可以叫做“SDK”。 开发 Windows 平台下的应用程序所使用的 SDK只是广义 SDK 的一个子集。首先要接触的是“API”,也就是 Application Programming Interface,其实就是操作系统留给应用程序的一个调用接口,应用程序通过调用操作系统的 API 而使操作系统去执行应用程序的命令(动作)。早在 DOS 时代就有 API 的概念,只不过那个时候的 API 是以中断调用的形式(INT 21h)提供的,在 DOS 下跑的应用程序都直接或间接的通过中断调用来使用操作系统功能,比如将 AH 置为 30h 后调用 INT 21h 就可以得到 DOS 操作系统的版本号。而在 Windows 中,系统 API 是以函数调用的方式提供的。同样是取得操作系统的版本号,在 Windows 中你所要做的就是调用 GetVersionEx() 函数。可以这么说,DOS API 是“Thinking in 汇编语言”的,而 Windows API 则是“Thinking in 高级语言”的。DOS API 是系统程序的一部分,他们与系统一同被载入内存并且可以通过中断矢量表找到他们的入口。DLL即 Dynamic Link Library(动态链接库)。我们经常会看到一些 .dll 格式的文件,这些文件就是动态链接库文件,其实也是一种可执行文件格式。跟 .exe 文件不同的是,.dll 文件不能直接执行,他们通常由 .exe 在执行时装入,内含有一些资源以及可执行代码等。其实 Windows 的三大模块就是以 DLL 的形式提供的(Kernel32.dll,User32.dll,GDI32.dll),里面就含有了 API 函数的执行代码。为了使用 DLL 中的 API 函数,我们必须要有 API 函数的声明(.H)和导入库(.LIB)。导入库可以理解为是为了在 DLL 中找到 API 的入口点而使用的。

3.4开发环境的搭建
1.下载并安装Visual C++ 6.0
Visual C++是微软公司推出的基于Windows环境的一种面向对象的可视化编程环境,被公认为微软第一计算机语言。借助于微软公司的MFC类库和应用程序框架能够轻易开发出Windows标准界面的应用程序⋯。尽管Visual C++是可视化编程中的佼佼者,但它并不是图形图像编程的最好选择。OpenGL是一个与图形硬件无关的应用程序开发接口(API),是一个完全可移植、速度很快的3D图形和建模库,具有图形质量高、可靠性高、可移植性好等众多优点,可以运行在Window平台和UNIX平台上。为了利用Visual C++6.0的强大功能来实现对OpenGL三维图形的绘制,微软将OpenGL集成到了Windows中,Windows提供了OpenGL32.DLL和GLU32.DLL动态链接库,Visual C++6.0包含了GL库(opengl32.Lib)、辅助库(glaux.1ib)和实用库(glu32.1ib)旧。,这使OpenGL成为最优秀的可视化编程接口之一。开发者可以方便地利用这个图形库,使编程简单、快速,OpenGL中的RGBA颜色模式,结合反走样和颜色融合,使图形图像更加逼真。所以,Visual C++结合OpenGL编程是一种比较合理的选择。

Ⅳ OpenGL编程指南第八版VS2015怎么配置

一、环境搭建指南

书中的地址

http://www.opengl-redbook.com/

去这里打包下载OpenGL红宝书的示例代码,解压后是这样

虽然没有第一章的代码但第一章的内容好歹算一个完整的例子,网上各种环境搭建教程也都以第一章的代码为例,我们就拿过来直接用一下。

1、打开VS2015创建一个空的控制台项目,然后新建一个cpp文件,粘贴红宝书第一章的示例代码

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

///////////////////////////////////////////////////////////////////////
//
// triangles.cpp
//
///////////////////////////////////////////////////////////////////////
#include <iostream>
using namespace std;
#include "vgl.h"
#include "LoadShaders.h"
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;
//---------------------------------------------------------------------
//
// init
//
void init(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
//
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glBindVertexArray(VAOs[Triangles]);
glDrawArrays(GL_TRIANGLES, 0, NumVertices);
glFlush();
}

//---------------------------------------------------------------------
//
// main
//
int main(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();
}

2、打开项目属性,在“VC++ Directories”选项卡中,将前面下载回来的红宝书示例代码中的include目录加入“Include Directories”,将lib目录加入“Library Directories”

3、打开项目属性,在“General”选项卡中,将“Platform Toolset”设置为VS2013

4、在项目管理器中右击Source Files的Filter,添加现有项,然后找到红宝书源码目录中的lib目录,添加LoadShaders.cpp文件

5、打开项目属性,在“Linker/Input”选项卡中,在“Ignore Specific Default Libraries”中添加libcmtd.lib

6、在项目目录中新建两个文本分别命名为triangles.vert和triangles.frag,也就是我们的顶点着色器和片段着色器啦

triangles.vert

1
2
3
4
5
6
7

#version 430 core
layout(location = 0) in vec4 vPosition;
void
main()
{
gl_Position = vPosition;
}

triangles.frag

1
2
3
4
5
6
7

#version 430 core
out vec4 fColor;
void
main()
{
fColor = vec4(0.0, 0.0, 1.0, 1.0);
}

7、编译,运行,搞定

二、所以然

1、关于第一步

这里的示例代码其实比书中的多了一句

glewExperimental = GL_TRUE;

书里的代码用到了GLEW库,GLEW可以跨平台支持OpenGL高级扩展特性,没有GLEW的话在Win平台是无法使用4.3的那些功能的。这句
代码是GLEW所有扩展的一个开关,需要在glewInit()之前执行。如果没有这一句,编译是可以通过的,但在运行时会崩溃。

2、关于第二步

主要目的是将示例代码中用到的GLUT和GLEW库的头文件和库文件引入项目目录。这一步没设置好的话编译无法通过,现象一般是无法打开freeglut相关库文件或者某些函数没有声明。

网上有些教程让你自己去下载并编译freeglut和glew,然后拷贝到各种系统目录和VS的目录,其实没用。所有用到的头文件和库文件在第八版示例代码include和lib目录中都有了,你只要正确引入项目中就不会有问题。

3、关于第三步

只有VS2015需要这一步

VS2015更改了很多标准库的链接方式和宏定义,而红宝书第八版中用到的freeglut库中用到了这些标准库和宏。所以如果报_sscanf或者__iob_func是无法解析的外部符号之类的错误,只需要把平台工具集改成旧的就行了。

4、关于第四步

没有这一项,LoadShaders中定义的函数会报无法解析的外部符号错误。

5、关于第五步

如果不忽略这个默认库,会报库冲突或者无法打开库文件的错误。

6、关于第六步

没着色器画个卵,运行漆黑一片。

7、双显卡电脑又躺枪了

我折腾了半天运行CMD显示Unable to create OpenGL 4.3 context,尼玛双显卡电脑默认用核心显卡启动应用。打开NVidia控制面板-管理3D设置-全局设置-首选图形处理器,把独显设为默认就OK了。
http://www.cnblogs.com/gagugagu/p/5211452.html

Ⅵ win7旗舰版 visual studio 2010 旗舰版 opengl超级宝典 随书代码 使用

额. 这类最好先确认下 随机例子的VC版本,
MS的 嗷嗷多的版 真的很烦人.

Ⅶ 如何使用openGL模式

NBa我不太清楚,,war3可以按照如下方法

右键单击游戏的快捷方式,点击属性

给目标那一栏的路径前后打上引号"

注意没有正反引号之分

然后在后引号后面空一格加上-openGL

就会自动开启openGL模式

Ⅷ VS中OpenGL编程,老师示例代码放入VS中编译出错 ,求教

C++中自带保留字true,false,请不要使用这两个关键字来定义变量,函数等

Ⅸ Dev C++下的一个简单的OpenGL程序

在devc++的include目录中的gl目录下有三个opengl头文件,分别是gl.h,glu.h,glext.h没有你包含的glut.h所以会提示找不到头文件,改正后连接错误如图:

可以看出来并没有定义你的main函数里的各种init函数,我在上述三个头文件里也没有找到这些函数,没有这些函数说明没有这些函数的库文件,当然就链接不到了。

devc++是一个轻量级的IDE,缺少很多进行某项专门开发所需的api函数,要进行opengl开发建议你还是找下openglsdk一类专门的开发工具,它们提供完整的这些api函数

如果已经添加了头文件,但是还是出现以上的错误,那你你应该检查是不是添加了所需的扩展库文件(*.a)了,上面的linkerror是因为虽然头文件有声明但链接不到库文件的原因。glut库解压后包含一个.h,一个.def,一个.lib和一个.dll文件。将.h拷贝到include目录下,.dll拷贝到windows的系统目录下(windowssystem32),貌似你只将dll放在系统目录下而没有配置扩展库文件,对于库文件可以使用reimp工具将.lib文件转换成.a文件。命令如下:

reimpglut32.lib

这样,就会在同一目录下生成一个glut32.def和一个libglut32.a文件,将libglut32.a拷贝到lib目录下。同时记得要删除原来的glut库(如果有的话),否则link时可能会出错。

上面所说的mingw-utils可在下面的地方下载到,解压后在bin里有reimp

mingw-utils-0.3:

http://sourceforge.net/project/downloading.php?groupname=mingw&filename=mingw-utils-0.3.tar.gz&use_mirror=jaist

Ⅹ OpenGL的控制机理:OpenGL是怎么实现动画的控制的

openGL通过模型视图矩阵(GL_MODELVIEW)控制绘制的物体的位置,你绘制的环境肯定是有个坐标,你画小车的时候相对这个坐标设定小车的坐标,小车就能画上去了。然后控制,比如glTranslatef(x,y,z)是沿着X,Y,Z轴平移,如果想用键盘控制,比如D键控制沿X平移,可以在keyboard()函数里写上
switch(key){ case 'D': x=x+1; break; },
这样你按下D小车就沿X轴移动1单位的距离,感觉就在移动。所以说原理就是通过键盘和程序交互改变模型视图矩阵的值来控制小车的坐标位置。当然要实现这个功能还需要许多openGL函数和命令的配合。还有必须使用双缓冲才能实现比较好的动画效果。
强烈建议你好好看看《openGL编程指南(第七版)》(红宝书)

阅读全文

与opengl编程示例相关的资料

热点内容
海南压缩机在哪里 浏览:487
电脑文件夹清晰的文件结构 浏览:837
如何把苹果手机的app转到安卓 浏览:303
java同步并发 浏览:249
fw压缩图片 浏览:256
淘宝申请源码靠谱吗 浏览:872
androidupdater 浏览:635
c2d游戏源码大全可复制版 浏览:771
电脑怎样重置网关命令 浏览:411
winftplinux 浏览:335
推特app界面如何设置成中文 浏览:452
太空工程师转子编程属性 浏览:32
windowscmd关机命令 浏览:342
云桌面只要服务器装一套软件 浏览:247
电脑右键按到什么导致文件夹全屏 浏览:454
我的世界如何制造服务器主城 浏览:365
linuxssh连不上 浏览:297
永宏plc用什么编程电缆 浏览:371
win激活命令行 浏览:886
新手学电脑编程语言 浏览:893