• 代码功能【OpenGL】初识OpenGL4.0代码功能


    在本文中,我们主要绍介代码功能的内容,自我感觉有个不错的建议和大家分享下

        这篇文章主要是根据《OpenGL Shading Language Cookbook》一书翻译整顿而得,绍介了境环的装安和一些基础知识。面上涉及到的库也可以到这里载下:http://download.csdn.net/detail/candycat1992/5275478

        -----------------------------------------------------------------分割线-------------------------------------------------------------------

        


        

    什么是GLSL

        

    GLSL是OpenGL Shading Language的写缩,望文生义就是OpenGL渲染语言,它许允我们通过一些接口直接利用代现的图形处理元单(GPUs)行进图形绘制等作工。GLSL语言必须协同OpenGL语言才可以作工。它们嵌入在更大庞的OpenGL语言里,这些迷你的代码平日被称为shader,它们运行在GPU而不是CPU上。从名字上可以看出来,GLSL大多跟3D图像的灯光、渲染等作工有关,但它们的力能绝不仅仅如此。它们还可以用于动画、曲面算计等更深的用应。

        

    Shader语言被计划成可以直接运行在GPU上,并且平日是并行的。例如,对于个每像素,一个fragment shader,片段着色器,可能执行一次,并且是同时在不同的GPU元单上同时执行。显卡上处理器的量数定决了同时可以许允多少个同时执行。这样的性特使得shader拥有很好的性能,并许允程序员行进并行运算。

        

    代现显卡的算计力能是让人印象深入的,面上的表格显示了NVIDIA GeForce 400系列显卡上处理器的量数:

        


        

    计划者希望Shader程序可以替换传统OpenGL体系结构中的fixed-function pipeline,定固功能管道,部份。在之前,默许的灯光/阴影算计是这个管道的一个核心部份。但是,但我们想要它们实现更多更级高的功能时,我们就要需做非常的作工来实现,而实际上很多是它们法无做到的。GLSL的涌现改变了这样的地境,它许允我们用应GLSL语言代替之前的“硬编码”,从而供给了更灵巧、更级高的功能。

        

    OpenGL 3.0进入了一个弃用的型模,也就是渐逐被OpenGL规格移除的功能。一些功能和性特可以说是被标记为被弃用了,这意味着它们在未来的OpenGL本版里将会被移除。例如,用应glBegin/glEnd的倏地模式渲染在OpenGL 3.0中被标为弃用,在3.1本版里被移除。(我们在现上课还讲来着。。。)

        

    而为了持保向后兼容性,OpenGL 3.2绍介了compatibility profiles,兼容配置文件的念概。如果程序员想要用应特定本版的OpenGL代码(不要需兼容),以可就用应所谓的core profile。而一些人可能希望可以向后兼容,那么以可就用应compatibility profiles。

        

    选择一个a core profile或者a compatibility profile的步调是跟窗口统系有关的。例如,在最新的Qt本版(在现最新的是5.0)中,我们可以用应面上的代码来选择一个 4.0 core profile :
    QGLFormat format;
    format.setVersion(4,0);
    format.setProfile(QGLFormat::CoreProfile);
    QGLWidget *myWidget = new QGLWidget(format);

    GLEW

    在Windows平台上OpenGL的本版被定固在1.1,这使得Windows平台的开发者不能直接访问最新的OpenGL本版的接口。我们要需行进一系列冗繁的作工来在运行时辰失掉一个数函调用的指针,而且还会影响代码的整齐。而且,Windows自带的头文件是循遵OpenGL1.1本版,据称,Windows也不准备新更自带的gl.h和opengl32.lib。荣幸的是,有为人我们做了这些事件还供给了响应的库和接口。GLEW就是其中一个。

        

    装安GLEW

        

    为了装安GLEW,以WIndows平台为例,我们可以到http://glew.sourceforge.net载下最新的glew本版,将其中的glew.h和wglew.h文件复制到编译器的对应文件夹下(例如VS的include文件夹),把glew32.lib文件复制到对应的库文件夹下(如VS的lib文件夹),以及glew32.dll复制到统系的根目录下(如system32/下)。

        

    用应GLEW

        

    为了用应glew,请确保在包括OpenGL头文件之前包括glew.h:
    #include <GL/glew.h>
    #include <GL/gl.h>
    #include <GL/glu.h>

    在初始化GL后、调用任何OpenGL代码前,入加以下代码:
        每日一道理
    站在历史的海岸漫溯那一道道历史沟渠:楚大夫沉吟泽畔,九死不悔;魏武帝扬鞭东指,壮心不已;陶渊明悠然南山,饮酒采菊……他们选择了永恒,纵然谄媚诬蔑视听,也不随其流扬其波,这是执著的选择;纵然马革裹尸,魂归狼烟,也要仰天长笑,这是豪壮的选择;纵然一身清苦,终日难饱,也愿怡然自乐,躬耕陇亩,这是高雅的选择。在一番选择中,帝王将相成其盖世伟业,贤士迁客成其千古文章。
    GLenum err = glewInit();
    if( GLEW_OK != err )
    {
    fprintf(stderr, "Error initializing GLEW: %s\n",
    glewGetErrorString(err) );
    }

    其他库

    另一个理管OpenGL扩展的库时GLEE,详细信息可见http://www.elf-stone.com/glee.php。它和GLEW相似,但是不要需在运行时辰初始化。

        

    用应GLM库行进数学运算

        

    在算计机图形学中,算计是一个核心的功能。之前的OpenGL本版供给了行进坐标变换和影投的标准阵矩栈(GL_MODELVIEW and GL_PROJECTION)。在最新的OpenGL 4.0里,这些功能都被移除了。因此,要需我们自己供给坐标和影投变换阵矩,然后将它们传递给shader。当然你还是可以自己写一个库来理管这些,但是不推荐这样。

        

    一个相似的库时Christophe Riccio编写的GLM。它的计划是基于GLSL则规的,因此它的语法和GLSL语言很相似。同时,它供给了一些OpenGL扩展来补弥缺失的那些OpenGL功能,例如glOrtho,,glRotate, gluLookAt。

        

    装安GLM

        

    你可以在http://glm.g-truc.net网站载下装安包,解压后将glm文件夹复制到编译器对应的文件夹下(例如VS的include文件)。

        

    用应GLM

        

    和一般的核心头文件相似,你可以用应面上的代码来包括阵矩变换和transform2扩展:
    #include <glm/glm.hpp>
    #include <glm/gtc/matrix_transform.hpp>
    #include <glm/gtx/transform2.hpp>

    然后你以可就用应glm命名空间行进编码了。面上是一个例子:
    glm::vec4 position = glm::vec4( 1.0f, 0.0f, 0.0f, 1.0f );
    glm::mat4 view = glm::lookAt( glm::vec3(0.0,0.0,5.0),
    glm::vec3(0.0,0.0,0.0),
    glm::vec3(0.0,1.0,0.0) );
    glm::mat4 model = glm::mat4(1.0f);
    model = glm::rotate( model, 90.0f, glm::vec3(0.0f,1.0f,0.0) );
    glm::mat4 mv = view * model;
    glm::vec4 transformed = mv * position;

    不要用应面上的代码来引入glm的命名空间:
    using namespace glm;

    这平日会引起命名空间的突冲。相反,你该应用应面上的代码来包括某一个号符:
    #include <glm/glm.hpp>
    using glm::vec3;
    using glm::mat4;

    用应GLM作为OpenGL的入输

    GLM持支用应OpenGL的量向数函(以"v"为后缀)直接向OpenGL传递一个GLM类型(平日是为了向shader传递数参)。例如:
    #include <glm/glm.hpp>
    #include <glm/gtc/matrix_transform.hpp>
    ...
    glm::mat4 proj = glm::perspective( viewAngle, aspect,
    nearDist, farDist );
    glUniformMatrix4fv(location, 1, GL_FALSE, &proj[0][0]);

    更多文档可以详见http://glm.g-truc.net(要需FQ)。

    用应GLFW行进窗口理管

    这里再绍介一个库GLFW。在之前的OpenGL本版里我们平日会用应glut来行进窗口的建创、按键监听等作工,但据说这个库已很久没新更了,那么glfw就是一个可以作为代替的库。它是址网是http://www.glfw.org/。装安方法和面上两个库相似。用应方法可以详见自带的文档。


    文章结束给大家分享下程序员的一些笑话语录: 自从有了Photoshop,我再也不相信照片了!(没有Photoshop的年代,胶片照片年代做假的也不少,那时候都相信假的!)

  • 相关阅读:
    mysql权限管理
    centos 6.5安装node.js
    sublime 配置jade高亮显示
    解决国内npm依赖包安装慢的问题
    sublime text3配置node.js开发环境
    datepicker 时间戳转换问题
    关于c++正则表达式的用法
    Android系统binder机制的研究分析
    TCP/IP的分层复用问题
    关于设计模式中外观模式的研究以及关于设计模式中四大原则的理解
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3033388.html
Copyright © 2020-2023  润新知