Category: ComputerGraphics

GLSL编程必备程序库

因为做毕设的原因,最近一段时间都在写一个全局光照的shader。期间用了不少开源库,把自己用了以后的经验大致罗列如下。

图像载入

图像载入的库非常多,而且很多都已经很成熟了。选择很多,基本上是萝卜青菜各有所爱,用什么都没关系

DevIL

网上不少shader的示例程序都用了这个DevIL库来读取图像。这个库的程序接口和OpenGL风格类似,调用起来很方便,支持的格式也非常多,只是可以保存的图片格式稍微少一些。不过平常自己的程序也需要保存图片为奇奇怪怪的格式。
http://openil.sourceforge.net/

Simple OpenGL Image Library

这个简称soil的图像库使用起来非常简单,只需要一个函数就可以把图像读取到OpenGL中去。我的Shader Demo用的就是这个库,目前还没有发现什么问题。
http://www.lonesock.net/soil.html

模型载入

网上的模型格式可谓各式各样,每个游戏基本上都会有一个自己专用的模型格式。个人感觉有一个能够读取各种格式模型的库还是挺有必要的。

gl3ds

这个项目是glee的一部分。从名字就可以看得出来,这是专门用来读取3ds文件格式的轻量级库。不过它也仅仅能用来读取3ds模型。
http://sourceforge.net/projects/glee/

Open Asset Import Library

如果手头模型格式五花八门,那么可以用这个大家伙来解决你的问题。它能导入十几种模型格式,同时提供C/C++接口。缺点是对于一个简单的Demo程序而言可能有点过于巨大–我的程序在链接了它的静态库以后体积达到了6M…
另外一点就是,这个库独立于OpenGL/DirectX,并不提供针对OpenGL的接口。也就是说你还是得自己写一个循环来绘制模型,不过好在这并不麻烦。
http://assimp.sourceforge.net/

基础框架

大多数人都是比较懒的,懒人都是不会为了一个demo而去从win32 api开始写代码的。

GLUT

没什么可说的,读过红宝书的人肯定对于这个库都非常熟悉。优点是简单,缺点是不方便于面对对象编程,库也非常老了。
http://www.opengl.org/resources/libraries/glut/

FreeGLUT

GLUT的开源实现版本。如果你对于没有glut的源代码而耿耿于怀的话可以用它。不过也不要抱太大希望,这个库和glut几乎一模一样,同时有glut的优点和缺点
http://freeglut.sourceforge.net/

Humus’s Framework

Humus的个人网站上有一卡车一卡车的Shader Demo程序,而他的程序都是用自己的Framework 3写的。这个库很强大的样子,跨平台支持Windows, Linux, 能够用于OpenGL和DirectX,可谓大小通吃。不过缺点是虽然你能下载到它的所有源代码,但是却完全没有文档,连注释都没有。作者最近正在写支持OpenGL 3.0的Framework 4,让咱们祈祷他能写点注释生成个Doxygen文档吧…
http://www.humus.name/

Ogre

这算是这几个里面最重量级的框架了吧。完整的渲染引擎,可以用同样的代码调用DirectX和OpenGL渲染。Ogre的脚本系统很是强大,只需要用脚本就可以搞定Shader渲染中的大部分工作–包括创建Render Target, 载入纹理,实现各个Pass间的交接等等。但是最大的问题是,学习和使用Ogre本身就是一个很大的工作量。如果你已经有使用Ogre的经验的话不妨考虑一下。
http://www.ogre3d.org/

数学库

如果你用了很多第三方库的话,数学库可能会编程很麻烦的一个东西。你会发现你的摄像机、GLSL抽象类、模型载入库分别用了一套不同的库(这正是我现在正在郁闷的一个问题)。没办法,既然不想自己写所有的代码那就只能忍忍了。

GLM

GLM也就是GL Mathematics的缩写。这个库提供的类接口和GLSL中内置的数学接口非常相似,但是缺少一些常用的函数,不是特别方便
http://glm.sourceforge.net/

相片画质的皮肤算法 [HLSL实现]

Photoshop里面处理美女相片经常用的一招就是把相片的图层复制一个甚至更多个图层副本,然后对这些副本用高斯模糊。最后再把副本用一定的透明度叠加到原图上就成了网上随处可见的“好皮肤”MM图片。《GPU Gems 3》里面描述了一个高拟真的皮肤算法(话说Gpu Gems 3在我之前的帖子里面有下载地址,而且那本书的封面上的人脸就是由这个算法及时渲染出来的),本质上和通常ps用的技巧是一回事。不过这个算法的模糊、叠加所用的各个参数都是基于物理试验的出来的数据,所以能够很大程度上的逼近真实皮肤的效果。
由于手头找不到合适的模型,所以将就用了一个汽车的模型来展示这个算法:

car_normal.jpg
用普通的phong算法渲染的汽车

car_skin
用皮肤算法渲染的汽车

用普通Phong算法渲染出来的结果乏善可陈,毕竟这个算法是基于经验性的公式。而皮肤算法则是和Phong有很大差别。可以看到皮肤算法渲染出来有比较 明显的柔和的半透材质的效果。另外在纹理接缝的地方出现了不应该出现的黑色细线,这是因为该算法基于纹理空间上的高斯模糊。由于这个汽车模型的纹理坐标不 符合该算法的特殊要求,所以在所有接缝的地方都会出现难看的黑线  如果适当的对模型的纹理坐标进行处理的话可以避免这个问题(详情可以看我之前关于纹理坐标下Post Process的文章)。这个算法如果有高精度的人脸模型和纹理贴图的话能即使渲染出相片级别的效果。

这里有该算法用RenderMonkey实现的project文件下载(下砸连接混杂在一堆广告里面,别点错了):
http://pickup.mofile.com/9910116487493642

最后让我们来看看这个算法所能渲染出来的逼真效果,图片来自GPU Gems 3。要知道,这可是即时运算出来的!

face_skin.jpg