|
一 简介
“非影”3D渲染引擎是一套基于OpenGL标准、利用GPU进行实时渲染的商用光栅化绘制系统。
本渲染引擎是纯粹的绘制系统,其功能为在屏幕上显示出给定的3D场景,并不涉及任何游戏
逻辑比如碰撞检测、AI等。
二 优势与特色
1) 在实现优质的光影效果同时拥有极高的绘制效率。
即使在七、八年前的显卡上,也可达到同屏100万面片的实时绘制。而在近期的显卡上,更可
轻松达到500万面片的实时绘制。目前尚未发现有其他渲染引擎在相似画质下能达到此效率。
以下是我们的测试程序在若干显卡上的测试结果:
NVidia FX540, 01年左右出品专业显卡, 每帧同屏绘制百万面片大约 30帧/秒
ATI Radeon 9600/9700 Mobility, 04年左右出品笔记本显卡, 每帧同屏绘制百万面片大约 30帧/秒
ATI 3650, 08年左右出品台式机显卡,每帧同屏绘制五百万面片大约40帧/秒
以上测试分辨率都为1024*768左右、利用拓展Phong光照模型计算实时光照,单光源,有纹理,有反走样。
高效的绘制可以允许显示更加精细的模型,以获得更精美的显示效果。
2) 支持精确的立体感绘制和临场感绘制。
可以进行双视点的立体绘制。也允许视点位于投影屏幕附近任意位置的绘制——通常情况下
视点位于屏幕投影矩形中点沿Z轴正向位移一段距离的位置,这样视点与投影屏幕可连接为
一个正四棱锥;而“非影”渲染引擎允许视点在标准位置附近移动,与投影屏幕连接形成
斜四棱锥。
前者可以模拟人体双眼形成的立体视觉。后者可以模拟人体在移动中通过一扇窗户观测外
部世界而获得的真实感视觉。
目前尚未发现有其他渲染引擎有此功能。
关于立体感绘制的详细论述,可以参考后附的文章“立体感绘制技术讨论”。
3) 原创性和灵活性
“非影”引擎用C++编写,除用到OpenGL标准库、OpenGL扩展库GLut和GLew、NVidia CG库、
Windows系统库以及C标准库以外,其余代码为100%原创,因此可以方便地扩展、定制。
由于使用OpenGL而非DirectX,因此易于扩展到其他平台例如Linux等。
4) 接口简洁易用
“非影”引擎提供的函数接口共有三类。
第一类为总体控制,比如初始化系统、解散系统、修改分辨率、重绘一帧图像等。
第二类为对象控制,无非是创建对象、释放对象、修改对象。所谓对象可能是几何模型、
材质、纹理、物体、文本、字体等等。
第三类为注册注销,就是指定某个对象是否要在今后各帧被绘制。
以下为一个简单范例程序的结构示意:
-------------------------
初始化绘制系统
创建一个字体F1
创建一个文本T1,指定T1用字体F1,在屏幕某位置显示
创建一个几何模型M1
创建一个材质Mat1
创建一个纹理Tex1
创建一个物体O1,绑定几何模型M1,材质Mat1,纹理Tex1,给定O1的转换矩阵
创建一个相机C1
创建一个3D场景S1,将O1加入S1,将C1加入S1。
注册T1到绘制系统。
注册S1到绘制系统。
循环
{
修改物体O1的位置、方向等。
修改文本T1的内容、位置等。
重绘一帧图像。
}
解散绘制系统
-------------------------
三 目前不足
目前“非影”渲染引擎,功能相对简单,不支持过多特效。主要限制包括:
1) 不支持阴影纹理。
2) 不支持二次光线。
3) 仅支持刚体运动一种运动方式。
下一代“非影II”引擎中会增加多种特效。
四 应用建议
当前版本的“非影”引擎比较适于但不限于绘制大规模场景或者拥有精细几何数据的模型。
尤其适于绘制静态场景或者表面比较坚硬,不需要过多弹性变形效果的动态物体,
比如机器人、木偶、兵器、盔甲武士等等。
例如后面将会叙述的“非影”测试程序或者以下这个视频所描述的场景
http://www.ce.chalmers.se/research/group/graphics/BART/robots/robots400x300_800.mpg (大小16M左右)
【本视频并非由“非影”引擎绘制,而是一个很著名的光线跟踪测试场景,这里只是引用一下。
该光线跟踪场景的相关网址是 http://www.ce.chalmers.se/research/group/graphics/BART/#robots
】
五 “非影”引擎的测试程序以及截图
以下是“非影”绘制引擎的第一版测试程序。测试内容是一段实时演算的3D动画。
动画分为三部分:第一部分是动画所涉及模型介绍;第二部分是正式动画,内容是若干个模型变形组合为一个
机器人,然后机器人向另一个巨大天使雕像前进,前进途中召唤出多个分身,于此同时巨大天使雕像也召唤
出大量幼崽与机器人群对抗;第三部分是测试者自行控制视角在3D场景中移动。如果嫌动画太墨迹,
可以按数字键"1"~"9"将动画播放速度提高为最高9倍。
程序中涉及的模型数据大多来自斯坦福大学网站上提供的扫描模型,纹理图像从网上搜集或者自行绘制。
测试过程中可以随时看到当前的绘制速度,当前绘制场景的规模等数据。测试的主要目的是检验本绘制引擎
的绘制效率以及绘制效果,动画本身很粗糙,请大家不必见笑。
下载链接:
http://cid-535e53c205e5dbc3.skydrive.live.com/self.aspx/.Public/GpuRenderBenchmark.zip(大小36M左右)
以下为测试程序的详细介绍。
最低配置要求:
PentiumIII以上处理器,支持Opengl 1.2、64M显存的显卡。
本测试程序初始情况下自带五个Bat文件,分别是
低精度场景测试.bat
高精度场景测试.bat
立体感低精度场景测试.bat
立体感高精度场景测试.bat
设置立体感参数.bat
前两个Bat用于普通测试,内容一样,只是测试场景的面片数不同。
低精度场景大约150万面片,高精度场景大约600万面片。
两个立体感测试的Bat用于带上红蓝眼镜之后的缺省参数下的立体观测。眼镜必须是左红右蓝。
设置立体感参数.bat 用来设置立体感相关的参数,比如镜片颜色,两只眼睛的距离等,
帮助观测者获得更好的视觉效果。该程序如果设置成功,会生成另外两个Bat文件,
"定制立体感低精度场景.bat" 和 "定制立体感高精度场景.bat"。
运行这两个Bat就可按照之前的设置观看测试场景。
缺省情况下,测试程序会在1024*768的分辨率下运行。如果想要修改分辨率,可以通过修改Bat
文件中的运行参数来实现。至于修改哪个参数,看看Bat文件就能很容易地找到。
程序运行中可以用键盘输入以下指令:
'1'键~'9'键:将动画播放速度设置为1倍~9倍。
'0'键: 将动画播放速度设置为10倍。
'+'、'-'键: 将当前播放速度提高/降低 10%左右
空格键: 暂停/恢复播放
上下键: 视点前进/后退
左右键: 视点左移/右移
Shift+上下键:视点上移/下移
A,D键: 视点沿Y轴左右旋转
W,S键: 视点沿X轴上下旋转
Q,E键: 视点沿Z轴左右旋转
"Tab" 键: 切换"立体绘制"和"正常绘制"两种状态。
F1 键: 强制切换到1024*768分辨率。
F2 键: 强制切换到800*600分辨率。
F3 键: 强制切换到640*480分辨率。
以下几张截图是从一台04年的HP笔记本(显卡为ATI 9600/9700 mobility)截取的
1)**纹理的牛牛
http://cid-535e53c205e5dbc3.skydrive.live.com/embedphoto.aspx/.Public/shot1.jpg
![](http://i3.6.cn/cvbnm/10/47/e6/58b89f951874d42dd8eb83d74b676360.jpg)
2)精美的百万面片级天使Lucy
http://cid-535e53c205e5dbc3.skydrive.live.com/embedphoto.aspx/.Public/shot2.jpg
![](http://i3.6.cn/cvbnm/f4/0c/a2/65cb7e338791116004d3a15471e1852b.jpg)
3)立体绘制的天使Lucy。观看时请将双眼焦距调到远方,因为该天使设定为身高40米,距离屏幕200米。
http://cid-535e53c205e5dbc3.skydrive.live.com/embedphoto.aspx/.Public/shot3.jpg
![](http://i3.6.cn/cvbnm/f6/b5/01/0303a97c12a6822266c145368f27307d.jpg)
4)当机器群遭遇天使集群。
http://cid-535e53c205e5dbc3.skydrive.live.com/embedphoto.aspx/.Public/shot4.jpg
![](http://i3.6.cn/cvbnm/71/5a/19/d8efc8b1891b5897b539b790c4d44767.jpg)
六 寻求合作
我们面向个人、团体、公司提供如下的产品和服务:
A)“非影”3D渲染引擎的使用授权。包括相关的头文件、库文件、DLL文件、文档说明
的使用权,一年的免费技术支持,以及“非影II”3D渲染引擎的折扣。
【“非影II”尚在研发中,其说明见附录】
B)“非影”3D渲染引擎的完全授权。包括相关的头文件、库文件、DLL文件、文档说明
的使用权和转让权,一年的免费技术支持,以及“非影II”3D渲染引擎的折扣。
C)“非影”3D渲染引擎及其源码的完全授权。包括相关的头文件、库文件、DLL文件、
文档说明、源码的使用权和转让权,一年的免费技术支持,以及“非影II”3D渲染引擎的折扣。
D)基于“非影”3D渲染引擎的定制引擎。可根据客户需求定制引擎,追加、删除、修改
不同功能、接口等。类似A、B、C,也分为“使用授权”、“完全授权”和“包含源码的完全授权”。
E)对客户现有引擎的改良。可根据客户要求改良其现有引擎的绘制部分。对于改良部分,也分为
“使用授权”、“完全授权”和“包含源码的完全授权”。
联系方式:站内或者电邮superredlark@126.com
————————————————————————————————————————————
附录一, “非影II”3D渲染引擎技术改进预览
追加精美的实时阴影绘制;
追加多动态光源光影效果;
追加一定程度的反射、折射效果;
追加对焦模糊效果;
追加高光模糊效果;
追加纹理法向;
追加顶点运动方式;
追加骨骼运动方式;
追加动态纹理;
追加动态材质;
追加单模型多材质效果;
附录二,立体感绘制技术讨论
目前利用平面屏幕的显示获得真实立体效果主要有两种手段。一种是令观察者双眼分别看到不同
的内容以获得立体的感觉,比如一件物体放在两眼中间的位置,那么左眼看见的是物体的左侧,
而右眼看见的是物体的右侧。第二种是随着观察者位置的改变,其所见的场景也随之改变。比如
观察者头往左偏后就能看见原本位于显示屏幕右侧而并未显示出来的物体。
我们将第一种技术称为“立体感”绘制技术;而将第二种技术称为“临场感”绘制技术。第二种
技术主要涉及的是人眼识别和定位,在本文不做讨论。以下主要叙述第一种技术的一些细节。
立体感绘制技术的实现需要两个要素:其一是令人体双眼分别获取视觉内容,也就是说,两只眼睛
都在盯着屏幕,但是能够看见不同的内容。这一点需要用硬件来完成。现在主要的技术包括分色眼
镜、偏振光眼镜或者直接在眼镜上做两个小屏幕。另外一个要素就是对应两只眼睛生成两幅正确的
图像。这就是需要绘制软件来完成了。
要完成分别对应两只眼睛的绘制,一个非常简单的办法就是:先以两眼之间的位置为视点绘制一幅
图像,然后分别左移一点,右移一点,获得两幅图像。这样做虽然简单,但是效果比较差,整个场
景看起来就像是一张立体的纸片。以下称呼本方法为方法1。
在这个基础上,复杂一点的处理方法是,对于每个物体,分别绘制,分别左移、右移,根据物体与
视平面的距离,也就是深度值,决定左移,右移的幅度。这个办法比方法1好些,但看起来还是纸片,
不过从一个纸片变成好多纸片。以下称呼本方法为方法2。
在方法2的基础上,还可以进一步扩展,改成对于每个像素,分别根据深度计算左移和右移的幅度。
这样做的结果是效果又进步了一点,但是还是有浓厚的纸片感。因为真实的视觉中,由于左眼右眼
的视觉角度不同,所以各个物体的可见面以及表面光照是不会完全相同的,因此仅靠简单的平移是
无法得到真实的立体效果的。现在有一些在驱动层面做的立体效果,应该都是用的上述三种方法之一。
另外一类比较复杂的方法就是真正根据两只眼睛的视点来进行两遍绘制。不过不论是opengl还是directx,
其视域的设定都是从视点出发的一个方形视锥,通俗的说,就是视点与屏幕中点的连线必须垂直于屏幕。
而真实的情况是,左眼与屏幕以及右眼与屏幕构成的两个视锥都是略微有些歪的,左眼的视锥微微往右歪,
右眼视锥略往左歪。要达到真实的效果,必须自行定义变换矩阵才行。另外,由于不同的人双眼之间的
距离不同,因此,为达到更加真实的效果,绘制软件应该通过某种方式获得这一“眼距” 参数。
另外再顺便说说红蓝眼镜。这一技术是最简单,最容易实现的。其主要原理是基于如下事实:
1) 大多数显示器都是用红、绿、蓝三色光的组合来达到彩色视觉效果。
2) 红色光和蓝、绿光波长相差比较远,因此红色滤光材料可以过滤掉蓝、绿色光,而蓝色或者
绿色滤光材料可以过滤掉红光。
在理想情况下,一只眼睛通过红色滤光材料观察屏幕,仅能观测到各个像素的红色部分,另一只眼睛
通过蓝绿色滤光材料观察屏幕,仅能观测到像素的蓝绿色部分。这样,将左眼的视图仅绘制红色部分,
右眼的视图仅绘制蓝绿色部分,就可令左右眼分别看到正确的场景,达到立体效果。
然而,遗憾的是现有的滤光材料无法达到理想的滤光效果。比如红色滤纸的理想效果是通过100%红色,
0%的绿色,0%的蓝色,但实际上可能通过80%的红色、40%的绿色和10%的蓝色。
这样,两只眼睛除了能看到各自该看到的图像外,还能看到比较暗淡的对方的图像,影响视觉效果。
要处理这一问题,有两种可能的改良方法。一是将滤光纸叠加,制成双层或更多层的眼镜。二是绘制
软件可以限制各个颜色的最大值,比如限定每个像素中绿色的最大值为128(正常值范围为0~255),
这样通过红色滤光纸的绿色强度最多为0.4*128=51.2(按前面范例,绿色透光率为40%计算)。
但这两种方法都会降低观察到的图像的亮度,使得原本就因分色而降低亮度的图像更加黯淡,影响视觉效果。
具体如何取舍,绘制软件应该提供交互功能令用户自行调试,选择。
|
|