主题:[原创]OpenGL入门学习——写给想用计算机画图的朋友
eastcowboy
[专家分:25370] 发布于 2006-07-30 14:09:00
说起编程作图,大概还有很多人想起TC的#include <graphics.h>吧?
但是各位是否想过,那些画面绚丽的PC游戏是如何编写出来的?就靠TC那可怜的640*480分辨率、16色来做吗?显然是不行的。
[color=0000FF]本帖的目的是让大家放弃TC的老旧图形接口,让大家接触一些新事物。[/color]
OpenGL作为当前主流的图形API之一,它在一些场合具有比DirectX更优越的特性。
[color=FF0000]1、与C语言紧密结合[/color]。
OpenGL命令最初就是用C语言函数来进行描述的,对于学习过C语言的人来讲,OpenGL是容易理解和学习的。如果你曾经接触过TC的graphics.h,你会发现,[color=0000FF]使用OpenGL作图甚至比TC更加简单[/color]。
[color=FF0000]2、强大的可移植性[/color]。
微软的Direct3D虽然也是十分优秀的图形API,但它只用于Windows系统(现在还要加上一个XBOX游戏机)。而OpenGL不仅用于Windows,还可以用于Unix/Linux等其它系统,它甚至在大型计算机、各种专业计算机(如:医疗用显示设备)上都有应用。并且,OpenGL的基本命令都做到了硬件无关,甚至是平台无关。
[color=FF0000]3、高性能的图形渲染[/color]。
OpenGL是一个工业标准,它的技术紧跟时代,现今各个显卡厂家无一不对OpenGL提供强力支持,激烈的竞争中使得OpenGL性能一直领先。
总之,OpenGL是一个很NB的图形软件接口。至于究竟有多NB,去看看DOOM3和QUAKE4等专业游戏就知道了。
OpenGL官方网站(英文)
[color=0000FF]http://www.opengl.org[/color]
下面我将对Windows下的OpenGL编程进行简单介绍。
=====================未完,请勿跟帖=====================
回复列表 (共70个回复)
11 楼
paobo [专家分:0] 发布于 2006-07-31 17:34:00
MARK
12 楼
paobo [专家分:0] 发布于 2006-07-31 17:35:00
学习学习
13 楼
HankStar [专家分:830] 发布于 2006-07-31 19:22:00
我也打算瞧瞧~~
14 楼
roumots [专家分:350] 发布于 2006-07-31 22:06:00
请问楼主,怎么吧那个DOS窗口去掉啊??
15 楼
rickone [专家分:15390] 发布于 2006-07-31 22:17:00
支持支持!期待期待!
16 楼
eastcowboy [专家分:25370] 发布于 2006-08-01 05:07:00
[quote]怎么把那个DOS窗口去掉啊?[/quote]
答:首先,那个窗口不叫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
17 楼
roumots [专家分:350] 发布于 2006-08-01 09:23:00
[quote][quote]怎么把那个DOS窗口去掉啊?[/quote]
答:首先,那个窗口不叫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[/quote]
谢谢了!
18 楼
justforfun626 [专家分:18460] 发布于 2006-08-01 09:45:00
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!!!!
19 楼
eastcowboy [专家分:25370] 发布于 2006-08-01 15:56:00
谢谢justforfun626的建议,这个其实我也想过,但考虑到目前内容还较少,不适合这样做。等内容多到一定程度时,我会加上目录的。
20 楼
dolphin2000 [专家分:10] 发布于 2006-08-02 01:50:00
按课程提供程序,选择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
我来回复