请登陆或者注册新用户 用户名 密码 记住密码 注册新用户 忘记密码了

回 帖 快速回帖 发 新 帖 刷新版面
主题:[原创]OpenGL入门学习——写给想用计算机画图的朋友

作者:eastcowboy

专家分:22560

级别:113级别:113级别:113级别:113级别:113级别:113级别:113级别:113

发表时间:2006-7-30 14:09:00    [回复] 
楼主
说起编程作图,大概还有很多人想起TC的#include <graphics.h>吧?
但是各位是否想过,那些画面绚丽的PC游戏是如何编写出来的?就靠TC那可怜的640*480分辨率、16色来做吗?显然是不行的。

本帖的目的是让大家放弃TC的老旧图形接口,让大家接触一些新事物。

OpenGL作为当前主流的图形API之一,它在一些场合具有比DirectX更优越的特性。
1、与C语言紧密结合
OpenGL命令最初就是用C语言函数来进行描述的,对于学习过C语言的人来讲,OpenGL是容易理解和学习的。如果你曾经接触过TC的graphics.h,你会发现,使用OpenGL作图甚至比TC更加简单
2、强大的可移植性
微软的Direct3D虽然也是十分优秀的图形API,但它只用于Windows系统(现在还要加上一个XBOX游戏机)。而OpenGL不仅用于Windows,还可以用于Unix/Linux等其它系统,它甚至在大型计算机、各种专业计算机(如:医疗用显示设备)上都有应用。并且,OpenGL的基本命令都做到了硬件无关,甚至是平台无关。
3、高性能的图形渲染
OpenGL是一个工业标准,它的技术紧跟时代,现今各个显卡厂家无一不对OpenGL提供强力支持,激烈的竞争中使得OpenGL性能一直领先。
总之,OpenGL是一个很NB的图形软件接口。至于究竟有多NB,去看看DOOM3和QUAKE4等专业游戏就知道了。
OpenGL官方网站(英文)
http://www.opengl.org

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

=====================未完,请勿跟帖=====================

 

作者:eastcowboy

专家分:22560

级别:113级别:113级别:113级别:113级别:113级别:113级别:113级别:113

发表时间:2006-7-30 14:11:00    [回复]  [引用]
1楼
学习OpenGL前的准备工作
第一步,选择一个编译环境
现在Windows系统的主流编译环境有Visual Studio,Broland C++ Builder,Dev-C++等,它们都是支持OpenGL的。但这里我们选择Visual Studio 2005作为学习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)
第三步,建立一个OpenGL工程
这里以VisualStudio2005为例。
选择File->New->Project,然后选择Win32 Console Application,选择一个名字,然后按OK。
在谈出的对话框左边点Application Settings,找到Empty project并勾上,选择Finish。
然后向该工程添加一个代码文件,取名为“OpenGL.c”,注意用.c来作为文件结尾。
搞定了,就跟平时的工程没什么两样的。

=====================未完,请勿跟帖=====================

  最后修改于2006-7-31 16:27:00

作者:eastcowboy

专家分:22560

级别:113级别:113级别:113级别:113级别:113级别:113级别:113级别:113

发表时间:2006-7-30 14:14:00    [回复]  [引用]
2楼
第一个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;
}

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

=====================未完,请勿跟帖=====================

 

作者:eastcowboy

专家分:22560

级别:113级别:113级别:113级别:113级别:113级别:113级别:113级别:113

发表时间:2006-7-30 14:36:00    [回复]  [引用]
3楼
怎么样?代码还不算长吧?

首先,需要包含头文件#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)类似。

=====================未完,请勿跟帖=====================

 

作者:eastcowboy

专家分:22560

级别:113级别:113级别:113级别:113级别:113级别:113级别:113级别:113

发表时间:2006-7-30 14:41:00    [回复]  [引用]
4楼
好了,入门第一课到此结束。
大家可以按照上面的叙述,自己设置编译器,下载GLUT,并亲手编译示例代码。
祝大家成功~

以后有空我会陆续放出后面一点的教程。
声明:我本人也是OpenGL菜鸟,大家可不要指望我可以教大家写个“星际争霸”什么的。当然也欢迎有此能力的朋友能给我们上一上课了。


=====================   第一课 完   =====================
=====================TO BE CONTINUED=====================

 

作者:cracker007

专家分:22080

级别:111级别:111级别:111级别:111级别:111级别:111

发表时间:2006-7-30 14:48:00    [回复]  [引用]
5楼
强烈支持。大家都扔下tc吧。
只不过我目前都在写mfc下的openGL程序,框架与楼主的不一样,一些初始化工作也不一样,帮不上什么忙了。
但是楼主的教程对于那些刚刚入门的菜鸟很有用处,毕竟console下的程序相对较好理解。
另外我想说一点,使用openGL入门虽然轻松,但是要想作出个像样的程序,图形学/代数的基础还是要具备的,否则对于以后的模型变换以及视区变化操作会是个很大的阻碍。

 

作者:sarrow

专家分:35450

级别:178级别:178级别:178级别:178级别:178

发表时间:2006-7-30 15:02:00    [回复]  [引用]
6楼
楼主,你不厚道啊,这么快就给自己加“精”了!

 

作者:eastcowboy

专家分:22560

级别:113级别:113级别:113级别:113级别:113级别:113级别:113级别:113

发表时间:2006-7-30 15:36:00    [回复]  [引用]
7楼
不是我加的……

 

作者:bruceteen

专家分:39360

级别:197级别:197级别:197级别:197级别:197

发表时间:2006-7-31 10:29:00    [回复]  [引用]
8楼
支持,支持……

 

作者:roumots

专家分:350

级别:2

发表时间:2006-7-31 11:39:00    [回复]  [引用]
9楼
期待第二课!

 

作者:justforfun626

专家分:18430

级别:93级别:93级别:93级别:93级别:93级别:93级别:93级别:93

发表时间:2006-7-31 11:48:00    [回复]  [引用]
10楼
Add some more points

1) OpenGL is also supported by Java and other languages such as PHP, etc.
2) OpenGL is supported by almost all mobile devices

Learning OpenGL is the way to go!!!!!

Thanks!

  最后修改于2006-7-31 11:49:00

作者:paobo

专家分:0

级别:1

发表时间:2006-7-31 17:34:00    [回复]  [引用]
11楼
MARK

 

作者:paobo

专家分:0

级别:1

发表时间:2006-7-31 17:35:00    [回复]  [引用]
12楼
学习学习

 

作者:HankStar

专家分:830

级别:5级别:5级别:5级别:5

发表时间:2006-7-31 19:22:00    [回复]  [引用]
13楼
我也打算瞧瞧~~

 

作者:roumots

专家分:350

级别:2

发表时间:2006-7-31 22:06:00    [回复]  [引用]
14楼
请问楼主,怎么吧那个DOS窗口去掉啊??

 

作者:rickone

专家分:15310

级别:77级别:77级别:77级别:77

发表时间:2006-7-31 22:17:00    [回复]  [引用]
15楼
支持支持!期待期待!

 

作者:eastcowboy

专家分:22560

级别:113级别:113级别:113级别:113级别:113级别:113级别:113级别:113

发表时间:2006-8-1 5:07:00    [回复]  [引用]
16楼
引用
怎么把那个DOS窗口去掉啊?

答:首先,那个窗口不叫DOS窗口,而叫“命令行窗口”。
    如果使用GLUT的话,最好还是保留那个窗口,因为如果在使用GLUT过程中有任何错误或者警告,都会直接显示到命令行窗口——如果你绘制图形失败,多半可以根据命令行窗口中的信息找到一点原因。这样会给我们带来方便。
    另外,使用GLUT可以做到平台无关。也就是说,虽然我们现在讲的是Windows下面的编程,但这些代码拿到Linux,Apple Macintosh,IBM OS/2或者其它的窗口系统,都可以被正确的编译并执行(需要下载并安装相应版本的GLUT),不需要修改代码。如果需要去掉“命令行窗口”
    如果你真的感到“命令行窗口”很不爽,可以在建立工程时选择“Win32 Application”,而不是“Win32 Console Application”。(对于已经建好的工程,需要在Projcet->Properties->Configuration Properties->Linker->System那个窗口里面,把SubSystem选项由Console改为Windows),并在程序开始时使用WinMain作为程序入口,而不是main。然后,你还需要一些Win32的编程基础。如果你不介意的话,把下面的代码抄下来也可以。

#include <windows.h>
#include <GL/glut.h>

void myDisplay(void)
{
    glClear(GL_COLOR_BUFFER_BIT);
    glRectf(-0.5f, -0.5f, 0.5f, 0.5f);
    glFlush();
}

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev,
                   PSTR CmdLine, int iCmdShow)
{
    int argc = 1;
    char *argv[] = {"OpenGL Application"};
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(400, 400);
    glutCreateWindow("第一个OpenGL程序");
    glutDisplayFunc(&myDisplay);
    glutMainLoop();
    return 0;
}

注意这个程序和前面的示例所不同的地方:
1、多加了头文件:#include <windows.h>。
2、main变成了WinMain,并且函数的参数有所不同。
3、在WinMain中,定义了假的argc和argv,方便使用glutInit函数。虽然看起来有些别扭,但总算是成功的将GLUT给初始化好了。

建议:GLUT在学习的开始时期会给查错带来方便,因此使用GLUT,并且打开命令行是比较好的做法。当我们不再需要GLUT,打算一切自己干时,再来考虑如何写一个不带命令行的程序,这样可能会比较合适。

另:目前我已经放出第二课的教程,地址为:
http://www.programfan.com/club/showbbs.asp?id=184525

 

作者:roumots

专家分:350

级别:2

发表时间:2006-8-1 9:23:00    [回复]  [引用]
17楼
引用
引用
怎么把那个DOS窗口去掉啊?

答:首先,那个窗口不叫DOS窗口,而叫“命令行窗口”。
    如果使用GLUT的话,最好还是保留那个窗口,因为如果在使用GLUT过程中有任何错误或者警告,都会直接显示到命令行窗口——如果你绘制图形失败,多半可以根据命令行窗口中的信息找到一点原因。这样会给我们带来方便。
    另外,使用GLUT可以做到平台无关。也就是说,虽然我们现在讲的是Windows下面的编程,但这些代码拿到Linux,Apple Macintosh,IBM OS/2或者其它的窗口系统,都可以被正确的编译并执行(需要下载并安装相应版本的GLUT),不需要修改代码。如果需要去掉“命令行窗口”
    如果你真的感到“命令行窗口”很不爽,可以在建立工程时选择“Win32 Application”,而不是“Win32 Console Application”。(对于已经建好的工程,需要在Projcet->Properties->Configuration Properties->Linker->System那个窗口里面,把SubSystem选项由Console改为Windows),并在程序开始时使用WinMain作为程序入口,而不是main。然后,你还需要一些Win32的编程基础。如果你不介意的话,把下面的代码抄下来也可以。

#include <windows.h>
#include <GL/glut.h>

void myDisplay(void)
{
    glClear(GL_COLOR_BUFFER_BIT);
    glRectf(-0.5f, -0.5f, 0.5f, 0.5f);
    glFlush();
}

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev,
                   PSTR CmdLine, int iCmdShow)
{
    int argc = 1;
    char *argv[] = {"OpenGL Application"};
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(400, 400);
    glutCreateWindow("第一个OpenGL程序");
    glutDisplayFunc(&myDisplay);
    glutMainLoop();
    return 0;
}

注意这个程序和前面的示例所不同的地方:
1、多加了头文件:#include <windows.h>。
2、main变成了WinMain,并且函数的参数有所不同。
3、在WinMain中,定义了假的argc和argv,方便使用glutInit函数。虽然看起来有些别扭,但总算是成功的将GLUT给初始化好了。

建议:GLUT在学习的开始时期会给查错带来方便,因此使用GLUT,并且打开命令行是比较好的做法。当我们不再需要GLUT,打算一切自己干时,再来考虑如何写一个不带命令行的程序,这样可能会比较合适。

另:目前我已经放出第二课的教程,地址为:
http://www.programfan.com/club/showbbs.asp?id=184525


谢谢了!

 

作者:justforfun626

专家分:18430

级别:93级别:93级别:93级别:93级别:93级别:93级别:93级别:93

发表时间:2006-8-1 9:45:00    [回复]  [引用]
18楼
To eastcowboy:

You can make a table of contents with links and put on the top post of each lesson.

In this way, people will always find all lessons.

When you add a lesson, modify one, and copy paste to others. 

Thanks for your good work!!!!

 

作者:eastcowboy

专家分:22560

级别:113级别:113级别:113级别:113级别:113级别:113级别:113级别:113

发表时间:2006-8-1 15:56:00    [回复]  [引用]
19楼
谢谢justforfun626的建议,这个其实我也想过,但考虑到目前内容还较少,不适合这样做。等内容多到一定程度时,我会加上目录的。

 

作者:dolphin2000

专家分:10

级别:1

发表时间:2006-8-2 1:50:00    [回复]  [引用]
20楼

按课程提供程序,选择Dev-C++的环境,调试日志如下,请问大侠问题出在哪里?谢谢!

选择File->New->Project,然后选择 Console Application 和c Project,输入OpenGL,然后保存OpenGL.c 按OK。

日志:

Compiler: Default compiler
Building Makefile: "D:\temp\C语言编程\Makefile.win"
Executing  make...
make.exe -f "D:\temp\C语言编程\Makefile.win" all
gcc.exe -c OpenGL.c -o OpenGL.o -I"d:/Dev-Cpp/include"   

gcc.exe OpenGL.o  -o "OpenGL.exe" -L"d:/Dev-Cpp/lib"  

OpenGL.o(.text+0xe):OpenGL.c: undefined reference to `_imp__glClear'
OpenGL.o(.text+0x38):OpenGL.c: undefined reference to `_imp__glRectf'
OpenGL.o(.text+0x3f):OpenGL.c: undefined reference to `_imp__glFlush'
OpenGL.o(.text+0x7f):OpenGL.c: undefined reference to `glutInit'
OpenGL.o(.text+0x8b):OpenGL.c: undefined reference to `glutInitDisplayMode'
OpenGL.o(.text+0x9f):OpenGL.c: undefined reference to `glutInitWindowPosition'
OpenGL.o(.text+0xb3):OpenGL.c: undefined reference to `glutInitWindowSize'
OpenGL.o(.text+0xbf):OpenGL.c: undefined reference to `glutCreateWindow'
OpenGL.o(.text+0xcb):OpenGL.c: undefined reference to `glutDisplayFunc'
OpenGL.o(.text+0xd0):OpenGL.c: undefined reference to `glutMainLoop'
collect2: ld returned 1 exit status

make.exe: *** [OpenGL.exe] Error 1

Execution terminated

 

[首页] [上页] [下页] [尾页]     共有 70 回帖 当前第 1 页(共4页 20帖/页)     跳转至第
回 帖 快速回帖 发 新 帖 刷新版面

版主管理:  删除此帖   转贴   置顶   取消精华   强制结帖   >>>进入管理页面