• [室外场景]地形装饰物


          这片文章应该属于室外场景系列的第一辑吧,希望对各位游戏开发者有所帮助。

        在做大面积场景中,大多数人都对庞大数量小物件的渲染感到头疼不已,比如大量的小草、石头、落叶等。以草的渲染作为说明实例,如果草以大量分开的PRIMITIVE来渲染,在图形API调用的消耗将是巨大的,所以大部分同行的做法是当一个PRIMITIVE提交任务,但这样又带来两个问题,第一,无法对草木进行剔除;第二,无法进行ALPHA排序。对于这两个问题,通常有如下的解决方案,对于剔除问题,一般是将众多的草分成若干簇,能够以簇为单位进行剔除,这样就可以在API调用消耗与渲染负荷得到一个折中;对于ALPHA排序问题,最常用的解决方案就是用ALPHA TEST替代ALPHA BLEND。这些解决方案带来了几个负面影响:以簇为单位进行渲染,会让玩家在游戏中看到草会一丛一丛蹦出来,有损游戏真实性。由于草丛是事先做好的,如果要求草种类多样化,需要做N多不同的草丛,而且大量的草需要LD手工放置,工作量大,并且无法控制草丛的密度和颜色的均匀变化。用ALPHA TEST替代ALPHA BLEND带来的直接效果就是带锯齿的纹理边缘。这片文章将介绍一个通用的渲染任何地形装饰物的方法,让大家得以灵活运用到各种游戏中。(题外话:其实在SIGGRAPH 2006里就有一片非常出色的草丛渲染的文章,Rendering Grass Terrains in Real-Time with Dynamic Lighting,大量的小草不但具有真实草的几何造型,而且带很酷的动态光照阴影,效率还非常高,作为游戏界的一个技术工作者,我为还在这里讲解普通的纸张类纹理草渲染感到惭愧。有兴趣的请看这个链接:http://www.irisa.fr/siames/GENS/kboulang/grass.html)

        在此我将实现公告板草的动态种植,可以通过贴图控制地形上草的密度、颜色和大小变化,也提供控制其他因素的解决方法。因为是简单的公告板草,所以我将使用一个PRIMITIVE来渲染整个地形中的草,做到最少图形API调用消耗,因为是一个PRIMITIVE,所以不用进行ALPHA排序,当然如果不进行草的整体透明处理,直接使用ALPHA BLEND相信效果也是可以接受的,毕竟草的可视面积很小,而且只有草的边缘可能有些瑕疵,但我还是倾向于使用ALPHA TEST做纱门融合,因为利用这个方法还能实现草随视点距离改变透明度的效果,效率也比较ALPHA BLEND更高。因为采用动态种植,所以草永远只是存在于视点周围,解决了PRIMITIVE剔除以及草的内存存储消耗问题。

    相关参考:GPU GEMS 2 《实现照片级真实感的虚拟植物》、http://www.xfrog.com/、Unreal Engine 2 地形装饰物。



       请看上图,地形被分为合理的GRID,用黑色线描出,蓝色点位相机位置,箭头为视线方向,黑色圆表示种草区域半径,草的种植以黑色GRID大小区域为单位,密度也是以这样大的一个面积来进行计算的,由上图可以看出,相机视线后方是不用种植的,因为种了你也看不到,但为了避免相机垂直视角看脚下后面的GRID,可以在视点周围一圈GRID也冗余的种上一些草,如图绿色方框区域。半圆所圈的GRID加上冗余的GRID加起来就是需要种草的GRID了,如图中打红叉的GRID。现在我们已经知道了在哪些GRID中种植小草,但每个GRID到底种多少株,具体种在什么位置呢?每个GRID的种植密度可以用一张贴图的一个通道来控制,贴图的每个像素对应一个GRID种植密度,而种植的具体位置,我们可以用一个噪声函数来生成,比如PERLIN噪声能达到比较理想的效果。剩下的问题就是草的淡出淡入,使用GPU GEM2中用PERLIN噪声调制ALPHA通道的方法,能达到非常好的效果。

        需要注意的问题:

    1、只要在视点移出当前GRID的时候才需要重新种植,种植点以相关顶点传入GPU,在VERTEX SHADER里做公告板旋转能达到非常理想的效果,而草的随风摆动动画也在GPU里做,建议在VERTEX SHADER里做纹理动画或者顶点动画,效率非常高。

    2、可以用贴图来控制公告板顶点色来控制草的色差以及XYZ方向上的随机缩放。

    3、需要在PIXEL SHADER修改公告板像素ALPHA值来达到淡出淡入效果。

  • 相关阅读:
    css3动画之1--animation小例子
    炎炎夏日,走入美妙的前端设计案例
    模拟腾讯、携程、百度音乐 移动端图片切换第一版
    仿QQ空间长图效果简易版--母亲节感恩
    001-搭建框架
    javascript事件绑定1-模拟jquery可爱的东西
    图片尺寸
    mvc3结合spring.net-依赖注入
    *创建索引初步
    Lucene的分词_中文分词器介绍
  • 原文地址:https://www.cnblogs.com/effulgent/p/1100687.html
Copyright © 2020-2023  润新知