zoukankan      html  css  js  c++  java
  • Linux下OpenGL开发 -- 准备篇 (转)

    环境是Fedora 7
    首先需要安装OpenGL的开发环境。现在Linux下有很多OpenGL的实现,Fedora 7中已经附带了Mesa,这是OpenGL一个开源的实现。安装Fedora时如果选中了开发环境,那么Mesa可能就已经安装好了。如果你和我一样安装的时候没有选择开发,那么,可以通过yum来在线安装Mesa:
    首先查找Mesa相关的包:

        yum list mesa*

    返回结果应该是和Mesa相关的Lib以及开发包。

        Installed Packages
        mesa-libGL.i386                          6.5.2-13.fc7           installed       
        mesa-libGL-devel.i386                    6.5.2-13.fc7           installed       
        mesa-libGLU.i386                         6.5.2-13.fc7           installed       
        mesa-libGLU-devel.i386                   6.5.2-13.fc7           installed       
        mesa-libGLw.i386                         6.5.1-2.fc7            installed       
        mesa-libGLw-devel.i386                   6.5.1-2.fc7            installed       
        mesa-libOSMesa.i386                      6.5.2-13.fc7           installed       
        mesa-libOSMesa-devel.i386                6.5.2-13.fc7           installed       
        mesa-source.i386                         6.5.2-13.fc7           installed   

     
    然后安装这些包:

    yum install mesa*

    安装完成后,我们就拥有了一个基础的OpenGL开发环境了。

    但是仅仅是基础的开发环境是不够的,一般来讲,我们还要安装一个叫做Glut的库,这是一个OpenGL的辅助库,可以让我们创建与平台无关的OpenGL窗口。因此,安装Glut也是必要的。 Glut有很多种实现,在这里我用的是freeglut,是我在Fedore 7的源中找到的。当然还有其他的实现。
    查找Glut库的命令如下:

        yum list *glut*

    返回结果是

        Loading "installonlyn" plugin
        Installed Packages
        freeglut.i386                            2.4.0-11.fc7           installed       
        freeglut-devel.i386                      2.4.0-11.fc7           installed           
        Available Packages
        hugs98-glut.i386                         2006.09-3.fc7          fedora 


    然后可以从结果中选择自己偏爱的库进行安装,我选的是freeglut,安装命令是
     yum install freeglut*                         2006.09-3.fc7          fedora 

    安装成后,我们就可以开始写我们第一个Linux下的OpenGL程序了。
    代码如下(这段代码是从网上Copy的):
     1  /* light.c
     2 此程序利用GLUT绘制一个OpenGL窗口,并显示一个加以光照的球。
     3 */
     4 /* 由于头文件glut.h中已经包含了头文件gl.h和glu.h,所以只需要include 此文件*/
     5 # include <GL/glut.h>
     6 # include <stdlib.h>
     7  
     8 /* 初始化材料属性、光源属性、光照模型,打开深度缓冲区 */
     9 void init ( void )
    10 {
    11     GLfloat mat_specular [ ] = { 1.01.01.01.0 };
    12     GLfloat mat_shininess [ ] = { 50.0 };
    13     GLfloat light_position [ ] = { 1.01.01.00.0 };
    14 
    15     glClearColor ( 0.00.00.00.0 );
    16     glShadeModel ( GL_SMOOTH );
    17 
    18     glMaterialfv ( GL_FRONT, GL_SPECULAR, mat_specular);
    19     glMaterialfv ( GL_FRONT, GL_SHININESS, mat_shininess);
    20     glLightfv ( GL_LIGHT0, GL_POSITION, light_position);
    21 
    22     glEnable (GL_LIGHTING);
    23     glEnable (GL_LIGHT0);
    24     glEnable (GL_DEPTH_TEST);
    25 }
    26 
    27 /*调用GLUT函数,绘制一个球*/
    28 void display ( void )
    29 {
    30     glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    31     glutSolidSphere (1.04050);
    32     glFlush ();
    33 }
    34 
    35 
    36 /* 定义GLUT的reshape函数,w、h分别是当前窗口的宽和高*/
    37 void reshape (int w, int h)
    38 {
    39     glViewport (00, (GLsizei) w, (GLsizei) h);
    40     glMatrixMode (GL_PROJECTION);
    41     glLoadIdentity ( );
    42     if (w <= h)
    43         glOrtho (-1.51.5-1.5 * ( GLfloat ) h / ( GLfloat ) w, 1.5 * ( GLfloat ) h / ( GLfloat ) w, -10.010.0 );
    44     else
    45         glOrtho (-1.5 * ( GLfloat ) w / ( GLfloat ) h, 1.5 * ( GLfloat ) w / ( GLfloat ) h, -1.51.5-10.010.0);
    46     glMatrixMode ( GL_MODELVIEW );
    47     glLoadIdentity ( ) ;
    48 }
    49 
    50 
    51 /* 定义对键盘的响应函数 */
    52 void keyboard ( unsigned char key, int x, int y)
    53 {
    54     /*按Esc键退出*/
    55     switch (key) 
    56     {
    57         case 27:
    58         exit ( 0 );
    59         break;
    60     }
    61 }
    62 
    63 
    64 int main(int argc, char** argv)
    65 {
    66     /* GLUT环境初始化*/
    67     glutInit (&argc, argv);
    68     /* 显示模式初始化 */
    69     glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
    70     /* 定义窗口大小 */
    71     glutInitWindowSize (300300);
    72     /* 定义窗口位置 */
    73     glutInitWindowPosition (100100);
    74     /* 显示窗口,窗口标题为执行函数名 */
    75     glutCreateWindow ( argv [ 0 ] );
    76     /* 调用OpenGL初始化函数 */
    77     init ( );
    78     /* 注册OpenGL绘图函数 */
    79     glutDisplayFunc ( display );
    80     /* 注册窗口大小改变时的响应函数 */
    81     glutReshapeFunc ( reshape );
    82     /* 注册键盘响应函数 */
    83     glutKeyboardFunc ( keyboard );
    84     /* 进入GLUT消息循环,开始执行程序 */
    85     glutMainLoop( );
    86     return 0;
    87 }


    编译并运行:

        gcc -lglut -o light light.c
        ./light


    运行效果如下:


    至此第一个Linux下的OpenGL程序便诞生了..
    Enjoy it !

    v2. updated by Wentao Sun. 20081023

    如果大家希望在Linux, Mac OS X等跨平台下编写OpenGL程序,还是最好不要依赖于MesaGL的实现。尽量选择nVidia的显卡(ATI的卡质量,特别是跨平台驱动,Linux驱动太差了。我的卡是nVidia GTS8800的,总是装不到好的ATI卡的驱动,它的那个Control panel一般的东西总是无法正常运行。 ::我的Linux环境是Fedora 8, kernel是2.26.13),然后到nVidia的驱动网站上去下载一个最新的Linux驱动,它的OpenGL 3D加速做得非常不错。用glxgears可以测出来,MesaGL的速度在我的机器上是700-900帧,然而换成nVidia的自生驱动后,一下子达到了12000帧,这是几十倍的速度差别。当要渲染大一点场景的时候差别就特别明显了。

    祝大家在跨平台3D开发上走得更远。
  • 相关阅读:
    Python该怎么学?
    Python招聘需求
    最短路合集
    最小生成树prim算法
    最小生成树kruskal算法
    React-redux原理探索
    Redux原理探索
    头条前端面试题汇总,会持续更新
    阿里前面面试题(最全),持续更新中
    ASP.Net MVC3/4中Model验证错误信息的本地化
  • 原文地址:https://www.cnblogs.com/SunWentao/p/1258454.html
Copyright © 2011-2022 走看看