zoukankan      html  css  js  c++  java
  • [室外场景]地形装饰物

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

        在做大面积场景中,大多数人都对庞大数量小物件的渲染感到头疼不已,比如大量的小草、石头、落叶等。以草的渲染作为说明实例,如果草以大量分开的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值来达到淡出淡入效果。

  • 相关阅读:
    vue-nuxtjs
    mongodb4.0支持事务
    promisify,promisifyAll,promise.all实现原理
    nodejs, 阿里oss上传下载图片
    数据库备份与还原
    SQL 数据类型、约束、索引及视图
    数据库的查询
    数据库(增、删、改、查)
    数据库基础知识
    C#语言小结
  • 原文地址:https://www.cnblogs.com/effulgent/p/1100687.html
Copyright © 2011-2022 走看看