KlayGE 4.4中渲染的改进(三):高质量无限地形
本系列的上一篇讲了DR中的一些改进。本篇开始将描述这个版本加入的新功能,高质量地形。
原有的地形
以前的地形实现和水面的方法一样,都是从Crytek在2008年的老方法改进而来。虽然比projected grid的好得多,并且速度很快,但有一些很明显的缺点:
- 视点移动的时候会抖动。水面比较平,而且有波浪看不出抖动。如果用来做静态地形抖动就会非常明显。尤其是far plane变大之后,远处更明显,所以限制在3000以下。
- 不支持shadow。因为只有产生了视野内的三角形,视野外的地形无法正确投出shadow。
- 顶点密度较低,无法表达精细的地形。原先的方法三角型分布接近于screen space,不足以很好表达地形。

这个抖动的消除可以靠snapping操作,每次更新height map的时候都保证原来的像素中心仍然落在新的像素中心上。这样每个顶点在视点移动后仍然会去到同样的值。
Clipmap
Clipmap也不是什么新东西了,最早出现于1998年。当时还是用CPU做几何生成和提交。2004年MSR的一篇Geometry Clipmaps: Terrain Rendering Using Nested Regular Grids把clipmap带到了GPU时代,GPU Gems 2的第二章就是这篇paper的缩写版本。通过在GPU上维护一个以视点为中心逐级递减的一系列几何块,依靠GPU的强大处理能力,过度细分的地形也能实时渲染。用这种方法,远处的三角形密度仍然较大,所以可以很容易的把far plane推到5000-8000。
但是,即便是2004年的方法,也已经过去了将近10年。当时的SM3能VTF,却不能改变几何拓扑。在实际使用中,这个方法的开销还是比较大的。而且由于不同层次之间的三角形密度一定是2倍的关系,难免还是会有看得见的层次跳变。
Tessellation
(这里的实现是从NVIDIA Direct3D SDK 11的一个例子改进而来)
DX11的GPU都支持tessellation,而且效率不低。这里对clipmap很自然的改进就是加入硬件tessellation支持,把细分的任务转到GPU里做。这样CPU端直需要提交比较稀疏的几何,在GPU里通过视点距离等因素计算tessellation level就可以了。而且,DX11要求GPU支持基于浮点的细分。三角形不但可以分整数次,还可以分任意的浮点数次。这么一来,就能让细分层次连续变化,层次跳变问题就彻底解决了。
如果检测到GPU不支持tessellation,就会退回到原先的clipmap方法。这时候需要处理不同层次之间的接缝问题。因为在连接处顶点密度不同,如果不处理的话,就会出现许多小的空洞。这个问题由团队成员孙文全解决了,方法是调整较密层次的顶点,在shader里面手工插值,得到和较稀疏层次同样的height。这么做虽然没有在拓扑上达到无缝连接,但GPU的精度足以保证空洞基本都会小于一个pixel的大小。所以视觉上看不到空洞了。
Procedural
在Texturing and Modeling: A Procedural Approach这一巨作中,有详细介绍如何用分型的方式生成地形。这个方法也可以顺利地移植到GPU,在生成height map的时候使用。如果参数合适,生成的结果很像自然的风景,有崇山峻岭也有平原低地。height map以视点为中心,加上snapping的修正,得到视点周围一定面积的所有高度场。这个height map可以进一步用来计算gradient map,在渲染的时候作为normal使用。以视点为中心,所有方向都有几何也保证了可以轻松地使用原有的shadow map系统,包括CSM在内。
加上细节
有了tessellation之后,height map里的信息只负责大体形状。顶点密度远大于height map的情况下,加上个noise就有意义了。normal上也可以用同样的方法加上像素级别的细节。有了这些之后,tessellation的能力就能全部显现出来了。并且可以根据GPU能力连续地调节细分的程度和细节的多少。

在不支持tessellation的平台上,这个细节就只能加到normal上。视觉效果也不差。
综合一下,加入水体、light shaft、SSR等效果之后,可以发现新的地形系统可以很容易兼容于原有deferred框架的其他组件。

本篇专注于新实现的高质量地形。下一篇仍会将一个新的渲染效果,屏幕空间次表面散射。
KlayGE 4.4中渲染的改进(三):高质量无限地形的更多相关文章
- KlayGE 4.4中渲染的改进(二):DR的其他改进
转载请注明出处为KlayGE游戏引擎,本文的永久链接为http://www.klayge.org/?p=2749 上一篇讲了TBDR的实现,本篇继续讲解deferred rendering层的一些 ...
- KlayGE 4.4中渲染的改进(一):只需要SM3的TBDR
转载请注明出处为KlayGE游戏引擎,本文的永久链接为http://www.klayge.org/?p=2736 KlayGE从4.0开始引入deferred rendering层(DR),并且这几个 ...
- KlayGE 4.4中渲染的改进(四):SSSSS
转载请注明出处为KlayGE游戏引擎,本文的永久链接为http://www.klayge.org/?p=2774 本系列的上一篇提到了KlayGE 4.4将会出现的高质量地形渲染.本篇仍讲一个新功能, ...
- KlayGE 4.4中渲染的改进(五):OpenGL 4.4和OpenGLES 3
转载请注明出处为KlayGE游戏引擎,本文的永久链接为http://www.klayge.org/?p=2796 上一篇我们提到了SSSSS,作为本系列的最后一篇,本文将介绍KlayGE 4.4的Op ...
- 通过优化在UE4中实现良好性能和高质量视觉效果
转自:http://gad.qq.com/program/translateview/7160166 译者:赵菁菁(轩语轩缘) 审校:李笑达(DDBC4747) 对于任何追求UE4性能最佳.同时又想 ...
- 用体渲染的方法在Unity中渲染云(18/4/4更新)
github: https://github.com/yangrc1234/VolumeCloud 更新的内容在底部 最近在知乎上看到一篇文章讲云层的渲染(https://zhuanlan.zhihu ...
- Unity 渲染教程(三):使用多张纹理贴图
对多个纹理进行采样 应用一张细节贴图 在线性空间中处理颜色 使用一张splat纹理 这是关于渲染的教程系列的第三部分. 前面的部分介绍了着色器和纹理. 我们已经看到如何使用单个纹理来使平坦表面看起来更 ...
- 【翻译】.NET 5中的性能改进
[翻译].NET 5中的性能改进 在.NET Core之前的版本中,其实已经在博客中介绍了在该版本中发现的重大性能改进. 从.NET Core 2.0到.NET Core 2.1到.NET Core ...
- 在Unity中渲染一个黑洞
在Unity中渲染一个黑洞 前言 N年前观看<星际穿越>时,被其中的"卡冈图雅"黑洞所震撼.制作团队表示这是一个最贴近实际的黑洞效果,因为它是通过各种科学理论实现的.当 ...
随机推荐
- XML转JSON
Step 1 : 下载 java-json.jar http://www.java2s.com/Code/JarDownload/java/java-json.jar.zip Step 2: 增加 j ...
- lockfree
为什么要lockfree 按我的理解, lockfree就是不去 调用操作系统给定的锁机制. 1. 会有system call, and system call is expensive; 比如pt ...
- 通过uCGUIBulider4.0建立的ucGUI文件,控件汉字不能显示问题解决办法
由于uCGUIBulider4.0不能在64位操作系统中运行,于是在电脑上通过VMware Workstation Pro搭建虚拟的32位的win7环境,然后把win7中用uCGUIBulider4. ...
- css中关于position属性的探究(原创)
关于position属性的设置,头脑中一直觉得不是很清楚,所以借助这次机会单独自己测试了一下,记作学习笔记. 首先,css的position属性包含下面四种设置情况: static:默认属性.指定 ...
- windows IIS6 PHP搭建
windows下搭建PHP环境有很多种方法.传说,FastCGI下运行PHP 是 兼顾安全和效率的一种.传说.传说.下面讲解在windows server2003 IIS6中安装 PHP 以下文字, ...
- PCA降维
http://blog.csdn.net/a784763307/article/details/17289317 这篇比较棒 openCV版 void PrintMatrix(CvMat *Matri ...
- 基于EasyUi ComBotree树修改 父节点选择问题
本人在使用 Easy UI 期间发现了一个不太适合项目的bug,可能也不算bug把 . 毕竟不同项目背景 取舍不同. 我在做网元树选择的时候 发现当选取父节点后,子节点都会被选择 返回 .但是如 ...
- jq判断 复选框是否被选中 亲测可用
var shortName = $('#shortName').is(':checked')?1:0;
- Ubuntu全新安装firefox最新版本
Ubuntu默认安装firefox,但是自带的软件仓库是不会随firefox更新的,我在使用中老是提示flash插件需要激活,提示中可选的解决方式有三种 1.更新flash插件,但是跳转到adobe的 ...
- SWT:获取字符串实际宽度
由于SWT取用的是系统文字size,有个简单方式可以获取一整段包含中文\英文\数字\特殊字符的字符串宽度. 即是利用Label的computeSize方法,我们知道Label的大小可以随着内容文字伸缩 ...