日志文章列表

2007年05月30日 22:35:06

简易树木生成

(1)基本参数
   通过对现实世界树木的观察,我们可以使用一些简易的递归方法来模拟生成这些植物。首先我们必须找出树木递归生长规律的参数,根据我的观察,总结了以下几种:
(a)螺旋角:指的是新枝条在老枝条上抽枝时以老枝条为旋转轴所间隔的角度差;
(b)层等分:指的是老枝条上抽出多少份新枝条,间隔是老枝条长度的N等分;
(c)层偏角:指的是新枝条与老枝条之间的偏角;
(d)层衰减:新枝条的成长时间总是少于老枝条,用衰减系数来模拟它们之间长度的差别;
(e)起始百分比:表示从枝条长度的多少开始抽出新枝;
(f)叶片长度:决定最后层也就是叶片的长度。

(2)参数骚动
   给定一定的起始条件和递归深度,我们利用以上参数就可以生成树木了,不过这种树都是一些千篇一律,没有真实感的形体而已。上帝在制造万物时一定使用了极度公式化的模式,但是制造出的物体却有着相互影响的特性,各个参数在相互影响时产生了变化,甚至..

阅读全文>>

Tags: 树木生成  

类别: 图形图象 |  评论(1) |  浏览(2941) |  收藏
2006年07月21日 22:47:49

杂草灌木渲染

   杂草类点缀指的是室外场景中一些以很少多边形组成的小型物体,如小草或一些灌木等。这些物体一般是由一些交叉的平面带上有Alpha通道的贴图(也可以是带Keycolor的贴图)组成。一般有下面几种渲染方式:
(1)AlphaTest
   这是最通常的方法,大多数游戏使用这个方法。由于开了纹理过滤和生成Mipmap的缘故,渲染一些小物体时会出现黑边,而且锯齿现象较为严重。把贴图的颜色通道填满色,在Alpha通道里画形状,可以去除黑边效果。
(2)AlphaBlend + disable zwrite
   这是一种比较简化的方式。由于打开了AlphaBlend后需要用从后往前的顺序渲染透明物体,如果点缀的密度比较高时,使用这种方法会出现一定的视觉错误。所以此方法只用于点缀密度不是很高的情况,如果要求不高,高密度时也可以用。
(3)两个Pass的渲染方法
   第一个Pass用方法(2)渲染点缀,主要渲染出柔化的边缘;第二个Pass打开Zwrite用方法(1)渲染点缀,主要确定视觉..

阅读全文>>

Tags: 渲染   杂草灌木  

类别: 图形图象 |  评论(0) |  浏览(2062) |  收藏
2006年07月20日 21:20:30

地形渲染相关

地形网格:
   地形的网格可以使用高度图来生成,也可用不规则的Mesh来组成
(1)整块地形
   整个地形放在一个VB里,在CPU端做完VFC、LOD等等剔除三角形的工作后一次性提交到GPU,只需一次DIP调用,需要提前分配好足够的空间。
(2)分片地形
   将地形分成小块,块与块之间重复连接的边,每一个块一个VB,LOD时有一组IB,相同等级的VB共享相同的IB,先做VFC等剔除分片的工作后渲染显示的分片,需要多次DIP。

地形纹理:
(1)整张铺满
   整个地形用一张较大的纹理铺满,地表之间的过度可以预先渲染,也可以实时的用Alpha图混合几层纹理。同理,光照图和Alpha图也是一张铺满。这种方式的缺点是地表细节不高,大地形需要大纹理(一般至少要1024x1024以上)。
(2)分片纹理
   在分片地形中,每一个地形块分配几张纹理(地表纹理、光照图和Alpha图),分片之间可以共享一些相同的纹理。这种方式效果好,但是渲染时需要切换纹理(为..

阅读全文>>

Tags: 渲染   地形  

类别: 图形图象 |  评论(2) |  浏览(2268) |  收藏
2006年07月17日 21:23:43

简化单界面反射折射渲染

   单界面反射折射指的是光从一种介质射向另一种介质时发生的反射和折射。渲染时需要得到反射光线向量、折射光线向量和这两种光能量的混合系数。
(1)反射向量
   反射向量的获取相对简单。设EYE为眼球位置向量,POS为顶点位置向量,N为顶点单位化过的法向量,可以得到观察向量V = EYE - POS,对向量V做单位化,则可以得到反射向量F = 2 * (V dot N) * N - V。
(2)折射向量
   根据Shell定理,n = sinθ1 / sinθ2(θ1为入射角,θ2为折射角,n为折射率)。考虑渲染一般发生在n >= 1的情况下,为了简化计算,使用-N和-V向量的线性插值来近似折射向量,公式为R = (-V) * t + (-N) * (1 - t) = -[(V - N) * t + N]。t的取值为0.0到1.0。可以取为n的倒数因为n >= 1,当折射率越大时折射向量越倾向于-N,折射率越接近真空时折射向量越接近-V。
(3)能量混合系数
   假设所有的光都是非偏振的,假设所有的光波长都是一样的,使用菲涅..

阅读全文>>

Tags: 渲染   折射  

类别: 图形图象 |  评论(0) |  浏览(1881) |  收藏
2006年07月15日 23:30:51

Normal mapping渲染

   Normal mapping也叫Dot3 bump mapping,就是采用一张法线图来对多边形的法线进行骚动,用来提高低模光照的真实性。法线图里的法线是定义在纹理空间的,其中Z轴垂直纹理向上。-1.0到1.0的法线分量被编码到纹理的RGB三个通道里(0.0到1.0)。所以没有法线骚动的地方颜色为[127, 127, 255](是一种淡紫色)。
   在渲染之前,要把与法线有关的参数(比如光向量L、半角向量H和视线向量V)转换到纹理空间,这是通过使用一个3x3旋转矩阵来实现的。这个矩阵为:
| T.x T.y T.z |
| B.x B.y B.z |
| N.x N.y N.z | (其中T是多边形在纹理梯度上的切向量,N是多边形法向量,计算时左乘向量) B被称为副法线,可以通过(N cross T) * T.w得到,其中T.w是用来区分左右手坐标系的,其值为1.0或-1.0,在计算切线的时候计算。为了减少多边形的数据量,一般B在GPU上计算。T、B、N三者必须是正交的。
   渲染时,只需根据纹理坐标读法线图,乘以2.0减去1.0得到..

阅读全文>>

Tags: 渲染   法线贴图  

类别: 图形图象 |  评论(0) |  浏览(1896) |  收藏
2006年07月15日 23:29:50

MAXScript中的骨骼变换

   使用MAXScript导出骨骼动画时,需要输出每帧骨头的局部旋转变换,也就是说要输出每帧骨头相对于它的父骨头以及它自己的初始变换的旋转变换Mr。还要输出骨头初始时的位移T0和帧位移Tn。这样,在实际使用中就可以用T0把骨头移回原点,用Mr做旋转,再用Tn把骨头移到目标处。注意,这里的Mr要去除父骨头的Mr,也就是MPr。
   根据实际的使用发现,MAXScript中的骨头变换矩阵M = Mr * Minit * MP,也就是先做帧变换再做初始变换,最后叠加上父骨头的变换,所以这个Mr不是我们要的Mr(它是骨头在初始状态时的帧变换,我们要的是骨头已经到位时的相对变换,所以下面把它记为Mr'),需要处理一下才能得到我们要的Mr。因为所有相连骨头的变换都与根骨头的初始变换相关,所以首先要用inverse(MRinit)把骨头旋转为初始状态,再用Mr'做帧旋转,最后用MRinit转回去(根骨头的MRinit可设为单位矩阵),这三者的乘积才是我们要的Mr。
   具体做法是,先..

阅读全文>>

Tags: MAXScript   导出   骨骼动画  

类别: 图形图象 |  评论(2) |  浏览(2156) |  收藏
2006年07月15日 23:20:22

MAXScript导出模型数据

   3DSMax里面是右手Z-UP坐标系,正视时X轴向右,Y向后,Z向上;D3D使用的是左手Y-UP坐标系,从3DSMax里导出时需要交换Y和Z坐标;OpenGL使用右手Y-UP坐标系,从3DSMax里导出时需要先交换Y和Z坐标,然后要在Z坐标上取负。经过坐标轴的交换后,三角形的顶点顺序可能会发生变化,一般API默认使用CCW CULL这种方式,使用时需要交换顶点索引的顺序,纹理坐标也要调整。
   如何把3DSMax里的网格数据转换成API里的网格数据是一个比较麻烦的过程。3DSMax里的网格数据采用多流的形式存放,也就是说顶点坐标和法线数据一组,纹理坐标一组,顶点颜色一组,三者都带有各自不同的顶点索引值。有时候三角形之间共享顶点坐标,又时候共享纹理坐标,所以比较复杂。根据参考手册里讲,三者的三角形索引是对应的,所以可以这么做:
(1)对于没有纹理坐标的网格
   直接用顶点坐标的三角形顶点索引来生成API网格里的索引值,顶点颜色则根据顶点颜色的三角形顶点索引..

阅读全文>>

Tags: MAXScript   导出   模型数据  

类别: 图形图象 |  评论(0) |  浏览(2170) |  收藏