• OpenGL编程指南(第七版)


    OpenGL编程指南(第七版)

    转自:http://blog.csdn.net/w540982016044/article/details/21287645

    在接触OpenGL中,配置显得相当麻烦,特别是在VS2012下配置时,存在许多问题,而网上的很多方法仅仅适用于VS2008,甚至仅适用于VC6.0,笔者经过自身的实践,参考了许多网上的资料,总结了一下配置的方法,当然这仅仅是笔者的个人理解,笔者个人水平有限,因此未必是万能的,如果解说存在错误或者不明白的地方,还望读者原谅和更正,谢谢。

    一、    先进行常用的GLUT相关的配置

    GLUT 代表OpenGL UtilityTookit。Mark J.Kilgard 为了使OpenGL应用程序结构能够真正独立于窗口系统构思了GLUT库。freeglut是一个GLUT的开源实现。

    1、  到freeglut的官方网站http://freeglut.sourceforge.net/上把最新版的Freeglut下载下来,解压,然后根据读者所安装的VS版本,运行相应的项目。由于笔者用的是VS2012,所以,进入下面的目录:

    运行freeglut.sln:

    2、  选择Release方式运行

    3、  出现错误,直接无视

    4、  到..freeglut-2.8.1libx86下多出了三个文件

    5、  到VS2012的安装目录下,笔者这里是:

     

    在VCinclude下建一个文件夹,名为“GL”,如果有了的话就不用建了。

    6、  收集下图所示的所有相关文件:

    (1)      h文件

    (2)      lib文件

    (3)      dll文件

             相关的压缩包如下,读者可以到网上搜索:

    与gl、glu有关的文件读者上网搜,都可以搜的到。

    与freeglut有关的h文件、lib文件、dll文件可从第4步中下载和编译的freeglut-2.8.1获得,即:

    与GLUT有关的可从网上下载压缩包:解压后可以得到如下目录内容:

    与glew相关的可从网上下载压缩包:(如果有最新的下载最新版本的),解压后可以从其下的include目录得到如下内容:

    但是这个压缩包的lib目录下是没有lib文件的,要获得这些lib,有两种方法:

    一是直接百度搜索相关名称的lib文件和dll文件,然后下载;

    二是从解压后的文件夹中找到如下目录内容:

    然后像编译freeglut那样的方法获得lib和dll,只不过这里只能用VC6.0来编译。

    与glaux相关的文件可以从网上下载压缩包:,解压后可以得到如下目录的内容:

    7、  所有的文件准备好以后,接着就要将这些文件存放到适当的地方,以使得VS2012能够顺利找到它们。

    (1)      h文件——VS2012安装目录下,第5步中建立的名为“GL”的文件夹:

    (2)      lib文件——VS2012安装目录VClib下:

    (3)      dll文件——C:WindowsSysWOW64(如果是32位电脑,则放在System32中)

    二、    所有这些文件都已经好了以后,下面进入VS2012进行相关配置。

    1、 创建Win32 控制台应用程序——选择空项目——添加cpp文件。这里都是正常的步骤。

    下面的这些步骤在每一个OpenGL项目中最好都配置一次,尽管可能有些配置不需要也能够正常运行,但是作为查错方案,如果在下面的步骤有些没做,程序无法运行时,这是可以考虑先进行下面的配置,如果问题仍然无法解决,再另想办法。

    2、 项目——项目属性——配置属性——链接器——输入——附加依赖项,添加

    glut32.lib;Opengl32.lib;Glu32.lib;glew32.lib等,总之需要哪个就添加哪个。

    3、 项目——项目属性——配置属性——链接器——系统——子系统,选择

    窗口(/SUBSYSTEM:WINDOWS)

    4、 项目——项目属性——配置属性——链接器——命令行——其它选项,添加

    /ENTRY:mainCRTStartup

    如果不这么做,会出现下面的错误:

    经过上面的配置以后,可以运行下面的程序了,这些程序中不需要用到GLTools。

    #include<windows.h>
    
    #include<GL/glu.h>
    
    #include<GL/gl.h>
    
    #include<GL/glut.h>
    
    #include<GL/glaux.h>
    
    voidbackground(void)
    
    {
    
    //设置背景颜色为黑色
    
    glClearColor(0.0,0.0,0.0,0.0);
    
    }
    
    voidmyDisplay(void)
    
    {
    
    //buffer设置为颜色可写
    
    glClear(GL_COLOR_BUFFER_BIT);
    
    //开始画三角形
    
    glBegin(GL_TRIANGLES);
    
    //设置为光滑明暗模式
    
    glShadeModel(GL_SMOOTH);
    
    //设置第一个顶点为红色
    
    glColor3f(1.0,0.0,0.0);
    
    //设置第一个顶点的坐标为(-1.0,-1.0)
    
    glVertex2f(-1.0,-1.0);
    
    //设置第二个顶点为绿色
    
    glColor3f(0.0,1.0,0.0);
    
    //设置第二个顶点的坐标为(0.0,-1.0)
    
    glVertex2f(0.0,-1.0);
    
    //设置第三个顶点为蓝色
    
    glColor3f(0.0,0.0,1.0);
    
    //设置第三个顶点的坐标为(-0.5,1.0)
    
    glVertex2f(-0.5,1.0);
    
    //三角形结束
    
    glEnd();
    
    //强制OpenGL函数在有限时间内运行
    
    glFlush();
    
    }
    
    voidmyReshape(GLsizei w,GLsizei h)
    
    {
    
    glViewport(0,0,w,h);
    
    //设置视口
    
    glMatrixMode(GL_PROJECTION);
    
    //指明当前矩阵为GL_PROJECTION
    
    glLoadIdentity();
    
    //将当前矩阵置换为单位阵
    
    if(w<= h)
    
    gluOrtho2D(-1.0,1.5,-1.5,1.5*(GLfloat)h/(GLfloat)w);
    
    //定义二维正视投影矩阵
    
    else
    
    gluOrtho2D(-1.0,1.5*(GLfloat)w/(GLfloat)h,-1.5,1.5);
    
    glMatrixMode(GL_MODELVIEW);
    
    //指明当前矩阵为GL_MODELVIEW
    
    }
    
    intmain(int argc,char*argv[])
    
    {
    
    //初始化
    
    glutInit(&argc,argv);
    
    glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
    
    glutInitWindowSize(400,400);
    
    glutInitWindowPosition(200,200);
    
    //创建窗口
    
    glutCreateWindow("Triangle");
    
    //绘制与显示
    
    background();
    
    glutReshapeFunc(myReshape);
    
    glutDisplayFunc(myDisplay);
    
    glutMainLoop();
    
    return(0);
    
    }
    View Code

    运行结果如下:

     

     

    三、与GLTools有关的配置

    然而,在《OpenGL超级宝典》第5版中,程序——第一个三角形,就用到了GLTools的相关东西,这时,要进行下面的配置。

    1、 可从网上下载GLTools压缩包:,解压后得到的目录如下:

     

    也许你会发现,再深入目录,会有一个文件夹与前面建立的文件夹“GL”同名:

     

    注意,这里千万不要把这个文件夹删了,因为GLTools需要GLEW来获取OpenGL3.0或者更新版本的特性,所以不用管它,跟前面建立的“GL”文件夹是可以共存的。

    2、 可以将(也可以不)整个解压后的GLTools复制到VS2012的安装路径下,笔者这里将其复制到如下所示的位置:

     

    下面的这些步骤在每一个OpenGL项目中都需要配置一次。

    3、 在打开的VS2012工程项目中,做如下操作:

    项目——项目属性——配置属性——VC++目录——常规——附加包含目录——将GLTools下的include目录包含进来:

     

    4、 在附加依赖项中将gltools.lib包含进来,如图:

     

    5、 设置忽略冲突:

    工程右键 “属性”->“配置属性”->“C/C++”-> “代码生成” ->  “ 运行库” 选项设置成“多线程 (/MT)”,如图:

     

    如果不这样处理,会出现如下错误或者警告:

     

    这样就可以运行要使用GLTools的程序了,如下(《OpenGL超级宝典》第五版程序——第一个三角形):

    #include<GLTools.h>
    
    #include<GLShaderManager.h>
    
    #ifdef_APPLE_
    
    #include<glut/glut.h>
    
    #else
    
    #defineFREEGLUT_STATIC
    
    #include<GL/glut.h>
    
    #endif
    
    GLBatch triangleBatch;
    
    GLShaderManager shaderManager;
    
    voidChangeSize(intw,inth)
    
    {
    
        glViewport(0, 0,w,h);
    
    }
    
    voidSetupRC()
    
    {
    
        glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
    
        shaderManager.InitializeStockShaders();
    
        GLfloatvVerts[] = { -0.5f, 0.0f, 0.0f,
    
                             0.5f, 0.0f, 0.0f,
    
                             0.0f, 0.5f, 0.0f };
    
        triangleBatch.Begin(GL_TRIANGLES,3);
    
        triangleBatch.CopyVertexData3f(vVerts);
    
        triangleBatch.End();
    
    }
    
    voidRenderScene(void)
    
    {
    
        glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT |GL_STENCIL_BUFFER_BIT);
    
        GLfloatvRed[] = { 1.0f, 0.0f, 0.0f, 1.0f };
    
        shaderManager.UseStockShader(GLT_SHADER_IDENTITY, vRed);
    
        triangleBatch.Draw();
    
        glutSwapBuffers();
    
    }
    
    intmain(intargc,char*argv[])
    
    {
    
        gltSetWorkingDirectory(argv[0]);
    
        glutInit(&argc,argv);
    
        glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA |GLUT_DEPTH|GLUT_STENCIL);
    
        glutInitWindowSize(800,600);
    
        glutCreateWindow("Triangle");
    
        glutReshapeFunc(ChangeSize);
    
        glutDisplayFunc(RenderScene);
    
        GLenumerr = glewInit();
    
        if(GLEW_OK != err)
    
        {
    
            fprintf(stderr,"GLEW Error: %s
    ",glewGetErrorString(err));
    
            return1;
    
        }
    
        SetupRC();
    
        glutMainLoop();
    
        return 0;
    
    }
    View Code

     

    运行结果如下:


     

    至此,已经配置好了基本的环境,这样配置以后,与GL、GLU、GLUT、GLAUX、GLEW以及GLTools相关的所有头文件、lib文件在程序中就可以直接包含了,不会出现诸如“无法打开xxx.h文件”等这样的错误了。

    当然笔者这里的配置方法也许并不能完全适应读者的需求,因为笔者是在学习《OpenGL超级宝典》第5版前几章时做的配置,可能到后期的学习,仍需要不断更改配置,望读者原谅和更正。

    后期在OpenGL的配置上如果有其他的新的注意事项,笔者也将继续更新,希望读者给予更正,笔者将虚心采纳。

     

     

  • 相关阅读:
    ASP.NET Core分布式项目实战(第三方ClientCredential模式调用)--学习笔记
    ASP.NET Core分布式项目实战(客户端集成IdentityServer)--学习笔记
    ASP.NET Core分布式项目实战(业务介绍,架构设计,oAuth2,IdentityServer4)--学习笔记
    ASP.NET Core分布式项目实战(课程介绍,MVP,瀑布与敏捷)--学习笔记
    .NET Core开发实战(第35课:MediatR:让领域事件处理更加优雅)--学习笔记
    .NET Core开发实战(第34课:MediatR:轻松实现命令查询职责分离模式(CQRS))--学习笔记(下)
    .NET Core开发实战(第34课:MediatR:轻松实现命令查询职责分离模式(CQRS))--学习笔记(上)
    .NET Core开发实战(第33课:集成事件:使用RabbitMQ来实现EventBus)--学习笔记(下)
    .NET Core开发实战(第33课:集成事件:使用RabbitMQ来实现EventBus)--学习笔记(上)
    .NET Core开发实战(第32课:集成事件:解决跨微服务的最终一致性)--学习笔记
  • 原文地址:https://www.cnblogs.com/flylong0204/p/4632193.html
Copyright © 2020-2023  润新知