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运行,可以看到运行记录;这样,如果异常退出,可以看到错误提示;
运行时请勿按Win键,以防假死;
(3)控制说明:
esc键退出;
w、s、a、d 键控制前后左右移动,鼠标控制视角;
左右方向键控制太阳(平行光)位置;
6、运行截图(太阳分别从右上、左上、下照耀)
openGL 3.3+ 场景渲染的更多相关文章
- CSharpGL(35)用ViewPort实现类似3DMax那样的把一个场景渲染到4个视口
CSharpGL(35)用ViewPort实现类似3DMax那样的把一个场景渲染到4个视口 开始 像下面这样的四个视口的功能是很常用的,所以我花了几天时间在CSharpGL中集成了这个功能. 在CSh ...
- Linux OpenGL 实践篇-14-多实例渲染
多实例渲染 OpenGL的多实例渲染是一种连续执行多条相同的渲染命令的方法,并且每条命令产生的结果都有轻微的差异,通常用于渲染大量的几何物体. 设想一个场景,比如太空,我们需要渲染数以万记的星球,如果 ...
- [ZZ] 景深效果(Depth of Field) , Pass1 将场景渲染到一个RenderTarget,做为清晰版, Pass2: BluredRT , Pass3: WDepth = Depth / Far_Z_Clip
http://blog.csdn.net/xoyojank/article/details/1883520 什么是景深效果? 景深效果,简称DOF,在人眼跟光学摄像设备上很常见.如下图: 简单地来 ...
- OpenGL/ES关于像素渲染
知道着色器的人都会知道一个东西,那就是着色器分为顶点着色器与片元着色器.在移动端真正渲染到手机屏幕上的无非是一些颜色值,但是一个片元是大于一个像素的,一个片元可能包含多个像素,当然一个片元所包含的像素 ...
- OSG 3D场景渲染编程概述
OSG是Open Scene Graphic的缩写,是基于C++平台的使用OpenGL技术的开源3D场景开发. vs环境安装或者是在Ubuntu中环境的安装网上教程很多,都是大同小异的,认真操作容易成 ...
- 详解 OpenGL ES 2.x 渲染流程
khronos官方对OpenGL ES的描述如下: OpenGL ES is a royalty-free, cross-platform API for rendering advanced 2D ...
- OpenGL绘制简单场景,实现旋转缩放平移和灯光效果
本项目实现了用OpenGL绘制一个简单场景,包括正方体.球体和网格,实现了物体的旋转.缩放.平移和灯光效果.附有项目完整代码.有具体凝视.适合刚開始学习的人熟悉opengl使用. 开发情况 开发环境V ...
- Unity场景渲染相关实现的猜想
如下,很简单的一个场景,一个Panel,二个Cube,一个camera,一个方向光,其中为了避免灯光阴影的影响,关掉阴影,而Panel和二个Cube都是默认的材质,没做修改,我原猜,这三个模型应该都动 ...
- Android OpenGL ES 离屏渲染(offscreen render)
通常在Android上使用OpenGL ES,都是希望把渲染后的结果显示在屏幕上,例如图片处理.模型显示等.这种情况下,只需要使用Android API中提供的GLSurfaceView类和Rende ...
随机推荐
- Exponential Backoff
f^x(f^y+f-m)+f-n =f^(x+y)+f^(f-m)+(f-n) <?php $exponent=0; w(80,3); function w($input,$base){ glo ...
- python系列三:python3运算符
'''python 没有自增运算符python 中,变量是以内容为基准而不是像 c 中以变量名为基准,所以只要你的数字内容是5,不管你起什么名字,这个变量的 ID 是相同的,同时也就说明了 pytho ...
- C语言结构体数组内带字符数组初始化和赋值
1.首先定义结构体数组: typedef struct BleAndTspRmtCmd{ char terminal[3]; char note[3]; char rmtCmd[10]; char c ...
- 【原创】学习CGLIB动态代理中遇到的问题
代码清单1 CGLIB动态代理 package wulj.proxy.cglibProxy; import java.lang.reflect.Method; import net.sf.cglib. ...
- 前端基础 & Bootstrap框架
Bootstrap介绍 Bootstrap是Twitter开源的基于HTML.CSS.JavaScript的前端框架. 它是为实现快速开发Web应用程序而设计的一套前端工具包. 它支持响应式布局,并且 ...
- 进程、数据共享、进程锁、进程池、requests模块和bs4(beautifulsoup)模块
一.进程 1.进程间数据不共享,如下示例: import multiprocessing data_list = [] def task(arg): data_list.append(arg) pri ...
- Linux中权限管理之文件特殊权限
SetUID 1.只有在可执行的二进制程序上设定SUID权限才是有意义的 2.命令执行者要对该程序拥有执行权限 3.命令执行者在执行该程序时获得该程序文件属主的身份 4.SetUID权限只在该程序执行 ...
- iOS NSSet 学习 “无序数组” & 去重 案例
“NSSet,NSMutableSet,和NSCountedSet类声明编程接口对象的无序集合(散列存储:在内存中的存储位置不连续). 而NSArray,NSDictionary类声明编程接口对象的有 ...
- springboot获取URL请求参数的几种方法
原文地址:http://www.cnblogs.com/xiaoxi/p/5695783.html 1.直接把表单的参数写在Controller相应的方法的形参中,适用于get方式提交,不适用于pos ...
- 系统封装接口层 cmsis_os
在这个实时操作系统泛滥的年代,有这么一个系统封装接口层还是蛮有必要的.前些时间偶然间在STM32最新的固件库中就发现了这个系统封装接口,当时就把自己所用的系统进行封装.直到最近KEIL5.0发现其中所 ...