GLUT

用GLUT库的好处是不用学习windows编程只学GLUT库的编写就能做出windows下的OpenGL程序,不过我刚学的时候,发现GLUT库编写的程序会有一个控制台窗口,就是dos窗口,这一点让我对GLUT库没了兴趣,

不过后来我无意中发现在源代码里加一条命令就可以去掉控制台窗口,我马上在GLUT库编写的程序里试了一下,真的去掉了控制台窗口,这让我对GLUT库又有了兴趣.在源程序中包含完头文件之后加入下边的命令:

#pragma comment(linker, "/subsystem:/"windows/" /entry:/"mainCRTStartup/"")

就去掉了控制台窗口.此命令适用于任何基于控制台窗口编写的windows程序

下边转一篇GLUT库的简介.

"GLUT"[I] 全称为 OpenGL Utility Toolkit.[/I] Mark J. Kilgard 创作的 GLUT 库, 是我们创建完全独立于窗口系统的 OpenGL 程序成为可能. 感谢 GLUT, 我们能够在不了解 X Windows 或者 Microsoft Windows 窗口系统本身的情况下编写3D应用程序. Kilgard 编写了GLUT的 X Windows 版本, 后来, Nate Robins 又将之移植到 Microsoft Windows 系统之上. 谢谢你们二位, 你们完成了一项伟大的ぷ?

在这份教程里, 我将向你介绍一些关于编写 GLUT 应用程序的一些基础. 为了简单起见, 这片教程不会介绍复杂的视觉效果.

你需要什么?
首先, 你需要一份最新版本的 GLUT 库(在这份文档编写的时候, 我相信是 3.7版). 当你完成了这份基础教程后, 你可以在 GLUT主页 中, 你可以找到大量的实例.

通过 C语言编写 GLUT 程序, 你需要以下三个文件: 
GLUT.H - 你需要在你的源代码中包含这个文件. 通常情况下, 这个文件应该放在你系统的包含目录下的 GL 文件夹中 
GLUT.LIB (SGI windows版本) 以及 glut32.lib (微软版本) - 这个文件必须被连接到你的程序中, 确保它放在 LIB 目录中 
glut32.dll (Windows) 和 glut.dll (SGI Windows版本) - 根据你所使用的OpenGL选择一个, 如果你正在使用微软公司的版本, 那么你必须选择 glut32.dll. 你应该把DLL放置在你的系统文件夹中
设置Visual C/C++ 6.0
Visual C/C++的工程有两个重要选项: Console (控制台) 和 Win32. 应用程序将会有两个窗口: 一个控制台窗口, 以及一个 OpenGL 窗口. 选择 Win32 仍然可以让你在不需要关心Windows程序设计的情况下编写 GLUT 程序. 你需要做以下设置: 
选择 Project -> settings 
选择 Link 选项卡 
从 Category 中选择 Output 
在 Entry-point synmbol 文本框中键入 mainCRTStartup
对于已存在的控制台工程, 有一个简单的办法将它转换成Win32应用程序: 
根据上面的步骤修改入口点 
在 Project options 文本框中用 subsystem:windows 覆盖 subsystem:console
或者你可以直接在你的源代码开头处添加:

代码 

// #pragma comment( linker, "/subsystem:/"windows/" /entry:/"mainCRTStartup/"" ) 

注意: 这是一行注释 
如此一来, 应用程序就不会出现控制台窗口, 而只是一个 OpenGL 窗口了. 在Visual C/C++ 中你需要一下步骤来连接一个 GLUT 程序: 
选择 Proejct/Settings 
选择 LINK 选项卡 
添加一下文件到 Object/library: opengl32.lib glut32.lib glu32.lib
请注意: 我同时添加了glu32.lib 和 opengl32.lib. 他们是标准OpenGL库.

好的,现在一切准备就绪, 我们可以开始编写 GLUT 应用程序了. 如果有任何不清楚的地方, 请您告诉我, 您的回馈非常之重要.

再附两个用GLUT库编写的小代码:

//hello.c

#include <GL/glut.h>
#pragma comment(linker, "/subsystem:/"windows/" /entry:/"mainCRTStartup/"")

void display(void)
{
    glClear (GL_COLOR_BUFFER_BIT);/* clear all pixels   */
    glColor3f (1.0, 1.0, 1.0);
    glBegin(GL_POLYGON);/* draw white polygon with corners at(0.25, 0.25, 0.0) and (0.75, 0.75, 0.0)*/
       glVertex3f (0.25, 0.25, 0.0);
       glVertex3f (0.75, 0.25, 0.0);
       glVertex3f (0.75, 0.75, 0.0);
       glVertex3f (0.25, 0.75, 0.0);
    glEnd();
    glFlush ();/* start processing buffered OpenGL routines   */
}

void init (void) 
{
    glClearColor (0.0, 0.0, 0.0, 0.0);/* select clearing color   */
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);/* initialize viewing values   */
}

int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);/*Declare initial display mode(single buffer and RGBA).*/
    glutInitWindowSize (250, 250); /*Declare initial window size.*/
    glutInitWindowPosition (100, 100);/*Declare initial window position.*/
    glutCreateWindow ("hello");/*Open window with "hello"in its title bar.*/ 
    init ();/*Call initialization routines.*/
    glutDisplayFunc(display); /*Register callback function to display graphics.*/
    glutMainLoop();/*Enter main loop and process events.*/
    return 0;    /* ANSI C requires main to return int. */
}

另一组代码

//opengl.c

#include <windows.h> 
#include <gl/glut.h> 
#pragma comment(linker, "/subsystem:/"windows/" /entry:/"mainCRTStartup/"")


//绘图子程序

void display( void ) {

       glClearColor( 1.0f,1.0f,1.0f,1.0f );              // 设置清除窗口时将窗口设为白色

       glClear( GL_COLOR_BUFFER_BIT );// 执行窗口清理

       glFlush();       // 刷新OpenGL中的命令队列和缓冲区,使所有尚未被执行的命令执行

}

 

void main( int argc,char** argv ) {

       glutInit( &argc, argv );         // 初始化GLUT库

       glutInitDisplayMode( GLUT_SINGLE| GLUT_RGB ); // 显示模式

       glutCreateWindow( "Hello OpenGL!" ); // 创建一个窗口,参数为窗口的标题

       glutDisplayFunc( display );           // 绘制当前窗口

       glutMainLoop();//通常用于程序的结尾,表示开始运行程序.显示出所有创建的窗口

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值