回 帖 发 新 帖 刷新版面

主题:[原创]OpenGL入门学习——写给想用计算机画图的朋友

说起编程作图,大概还有很多人想起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 楼

MARK

12 楼

学习学习

13 楼

我也打算瞧瞧~~

14 楼

请问楼主,怎么吧那个DOS窗口去掉啊??

15 楼

支持支持!期待期待!

16 楼

[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 楼

[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 楼

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 楼

谢谢justforfun626的建议,这个其实我也想过,但考虑到目前内容还较少,不适合这样做。等内容多到一定程度时,我会加上目录的。

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

我来回复

您尚未登录,请登录后再回复。点此登录或注册