zoukankan      html  css  js  c++  java
  • openGL 3.3+ 场景渲染

    这个渲染程序是研一下学期的计算机图形学课程大作业,花了两三周学习使用了下 openGL 3.3+ 库,整合出了这个渲染程序,完成于 2013/07/05。

    相对于老版本的库,新版本更开放,给了程序员更多的控制自由度,程序员可以利用自己掌握的图形学知识,渲染出更炫更高效的场景,但是使用起来更难了。

    新版本有一个很重要的新特性 —— 着色语言(Shading Language),着色语言由显卡执行,功能更强大,效率更高。

    新版本的库不再提供 glu、glut、glaux 等辅助库,不过有丰富的开源库可供选择(参考),本程序选择如下:

    Glfw——窗口、鼠标、按键等交互管理库,类似于freeGLUT(GLUT早已停止更新),如果使用 GLFW3,需要注意其相对于 GLFW2 接口变了很多,参考:Moving from GLFW 2 to 3

    Glew——openGL扩展(OpenGL Extensions)处理库,方便我们调用扩展(注意,此库要调用显卡 openGL 库,切记要包含 opengl32.lib);

    Glm——数学库,用于矩阵处理,如各种变换(新版openGL将矩阵处理函数移出核心);

    FreeImage——图片处理库,用于读取图片,提取纹理;

    源码托管在 Github 上:点击进入链接,已包含所有外部库,有比较详细的注释。

    编译前请更新显卡驱动到最新版,这次在 Win8.1x86+VS2010+AMD Radeon HD 7450 上测试 OK,详情见下面的报告。

    编译后的可执行程序:点击进入链接,包含附件动态链接库和运行说明,ps:从 cmd 运行可看到一些 printf 出来的运行状态。

    一、相关概念介绍

    1、openGL简介

    OpenGL是个专业的3D程序接口,是一个功能强大,调用方便的底层3D图形库。OpenGL的前身是SGI公司为其图形工作站开发的IRIS GL。IRIS GL是一个工业标准的3D图形软件接口,功能虽然强大但是移植性不好,于是SGI公司便在IRIS GL的基础上开发了OpenGL。OpenGL的英文全称是“Open Graphics Library”,顾名思义,OpenGL便是“开放的图形程序接口”。虽然DirectX在家用市场全面领先,但在专业高端绘图领域,OpenGL是不能被取代的主角。

    2、OpenGL扩展(OpenGL Extensions

        OpenGL和Direct3D比较起来,最大的一个长处就是其扩展机制。硬件厂商开发出一个新功能,可以针对新功能开发OpenGL扩展,软件开发人员 通过这个扩展就可以使用新的硬件功能。所以虽然显卡的发展速度比OpenGL版本更新速度快得多,但程序员仍然可以通过OpenGL使用最新的硬件功能。 而Direct3D则没有扩展机制,硬件的新功能要等到微软发布新版DirectX后才可能支持。

    每个扩展都有一个扩展名,扩展名类似形式:GL_ARB_multitexture

    第一段GL,用来表示针对OpenGL哪部分开发的扩展,有以下几个值:

    GL  – 针对OpenGL核心的扩展

    WGL – 针对Windows平台的扩展

    GLX – 针对Unix / Linux平台的扩展

    GLU – 针对OpenGL Utility Library的扩展

    第二段ARB,用来表示是谁开发的这个扩展,ARB是经OpenGL Architecture Review Board(OpenGL管理机构)正式核准的扩展,往往由厂商开发的扩展发展而来,如果同时存在厂商开发的扩展和ARB扩展,应该优先使用ARB扩展,常见的还有以下几个值:

    EXT – 被多个硬件厂商支持的扩展

    NV  – NVIDIA 公司开发的扩展

    ATI – ATI公司开发的扩展

    ATIX– ATI公司开发的实验性扩展

    SGI – Silicon Graphics(SGI)公司开发的扩展

    SGIX– Silicon Graphics(SGI)公司开发的实验性扩展

    第三段multitexture就是真正的扩展名了,如multitexture就是多重纹理扩展。

    3、缓冲器对象(buffer object

    在许多OpenGL操作中,我们都向OpenGL发送一大块数据,例如向它传递需要处理的顶点数组数据。传输这种数据可能非常简单,例如把数据从系统的内存中复制到图形卡。但是,由于OpenGL是按照客户机-服务器模式设计的,在OpenGL需要数据的任何时候,都必须把数据从客户机内存传输到服务器。如果数据并没有修改,或者客户机和服务器位于不同的计算机(分布式渲染),数据的传输可能会比较缓慢,或者是冗余的。

    OpenGL 1.5版本增加了缓冲区对象(buffer object),允许应用程序显式地指定把哪些数据存储在图形服务器中。

    当前版本的OpenGL中使用了很多不同类型的缓冲区对象:

    从OpenGL 1.5开始,数组中的顶点数据可以存储在服务器端缓冲区对象中。

    在OpenGL 2.1中,加入了在缓冲区对象中存储像素数据(例如,纹理贴图或像素块)的支持。

    OpenGL 3.1增加了统一缓冲对象(uniform buffer object)以存储成块的、用于着色器的统一变量数据。

    OpenGL中有很多其他的功能用到了术语“对象”,但是这些功能并不都适用于存储块数据。例如,(OpenGL 1.1引入的)纹理对象只是封装了和纹理贴图相关联的各种状态设置。同样,OpenGL 3.0中增加的顶点数组对象,封装了和使用顶点数组相关的状态参数。这些类型的对象允许我们使用较少的函数调用就能够修改大量的状态设置。为了使性能最大化,只要习惯它们的操作,就应该尽可能地尝试使用它们。

    注意:通过对象的名字来引用它,其名字是一个无符号的整型标识符。从OpenGL 3.1开始,所有的名字必须由OpenGL使用glGen*()函数之一来生成,不再接受用户定义的名字。

    4、着色语言(Shading Language

    OpenGL 1.5还新增了“OpenGL Shading Language”,该语言是“OpenGL 2.0”的底核,用于着色对象、顶点着色以及片断着色技术的扩展功能。

    使用Shading Language编写的程序称之为Shading Program(着色程序)。着色程序分为两类:Vertex Shading program(顶点着色程序)和Fragment Shading Program(片断着色程序),它们分别被Programmable Vertex Processor(可编程顶点处理器)和 Programmable Fragment Processor(可编程片断处理器)所执行。

    顶点着色程序从GPU前端模块(寄存器)中提取图元信息(顶点位置、法向量、纹理坐标等),并完成顶点坐标空间转换、法向量空间转换、光照计算等操作,最后将计算好的数据传送到指定寄存器中;然后片断着色程序从中获取需要的数据,通常为“纹理坐标、光照信息等”,并根据这些信息以及从应用程序传递的纹理信息(如果有的话)进行每个片断的颜色计算,最后将处理后的数据送光栅操作模块。

    二、实验介绍

    1、实验目的:

    用openGL渲染一个场景:

    多个物体,不同组织方式;

    物体有的静止,有的旋转;

    物体有不同纹理;

    物体有彩色透明的,可透视其他物体;

    平行光照模型,含有环境光和漫反射光;

    有一个虚拟太阳,可调整平行光的方向;

    天空盒,美化单调的背景。

    2、实验环境:openGL 3.3、VS2010、XP SP3、ATI Mobility Radeon HD 5145

    3、相关库文件

    Glfw——窗口、鼠标、按键等交互管理库,类似于freeGLUT(GLUT早已停止更新);

    Glew——openGL扩展(OpenGL Extensions)处理库,方便我们调用扩展;

    Glm——数学库,用于矩阵处理,如各种变换(新版openGL将矩阵处理函数移出核心);

    FreeImage——图片处理库,用于读取图片,提取纹理;

    4、源文件结构

    common_header.h——通用头文件;

    shader.h、shader.cpp——着色器程序类,创建、载入、编译着色器源码,创建、链接、运行着色器程序;

    glCamara.h、glCamara.cpp——照相机类,处理前后左右移动和鼠标的旋转;

    skybox.h、skybox.cpp——天空盒类,载入天空纹理,渲染天空盒;

    static_geometry.h、static_geometry.cpp——几个物体的位置、纹理坐标、法向量;

    vertexBufferObject.h、vertexBufferObject.cpp——VBO,顶点缓冲区对象,组织上述各种坐标信息并载入显存;

    renderScene.h、renderScene.cpp——主场景渲染程序,初始化各种场景参数,场景渲染代码;

    glmain.cpp——main文件,窗口参数设置及创建,调用上述场景渲染函数生成渲染主循环;

    4.1着色器文件:

    shaderSky.vert——天空盒顶点着色器源码

    shaderSky.frag——天空盒片段着色器源码

    shaderTex.vert——纹理物体顶点着色器源码

    shaderTex.frag——纹理物体片段着色器源码

    shaderCol.vert——透明箱子顶点着色器源码

    shaderCol.frag——透明箱子片段着色器源码

    5、可执行程序使用说明

    (1)运行条件:openGL 3.3或更高,如果版本低,请先更新显卡驱动

    (2)注意事项:

    如果从CMD运行,可以看到运行记录;这样,如果异常退出,可以看到错误提示;

    clip_image002

    运行时请勿按Win键,以防假死;

    (3)控制说明:

    esc键退出;

    w、s、a、d 键控制前后左右移动,鼠标控制视角;

    左右方向键控制太阳(平行光)位置;

    6、运行截图(太阳分别从右上、左上、下照耀)

    clip_image004

    clip_image006

    clip_image008

  • 相关阅读:
    623. Add One Row to Tree 将一行添加到树中
    771. Jewels and Stones 珠宝和石头
    216. Combination Sum III 组合总数三
    384. Shuffle an Array 随机播放一个数组
    382. Linked List Random Node 链接列表随机节点
    向github项目push代码后,Jenkins实现其自动构建
    centos下安装Jenkins
    python提取批量文件内的指定内容
    批处理实现:批量为文件添加注释
    python抓取每期双色球中奖号码,用于分析
  • 原文地址:https://www.cnblogs.com/keke2014/p/3860088.html
Copyright © 2011-2022 走看看