`
projectanarchy
  • 浏览: 15252 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

Vision引擎中环境地形技术信息

 
阅读更多

地形的表示

地形由分割程度不同的子分区表示,我们将在本章中作详细解释。 首先,一个地形被分割成正方形网格区块。 这些区块作为 VManagedResource(V 被管理资源)执行,所以可以从磁盘上的物理文件重载。 该数据当然包含此页面的高度值,也包含着色器数据、纹理引用和植被模型位置。 区块可能带有一些单独纹理,例如逐区块权重贴图或细节纹理。 另外,区块定义了视区的粒度。 最优化的区块大小和地形大小的比例关系视应用情况而定,可能需要进行调试。
 
一个区块进一步分割为 Sector tiles(区块铺块)。 进行这一细粒度分割的理由和植被可视性、碰撞几何网格及地形孔洞定义有关。
 
下图展示了一个分割成区块和铺块的地形:

纹理
每个区块都可以带有自己的纹理组用于渲染。 请见下文中的纹理样本布局章节。 非烘培模式下,编辑器中指定的每一个纹理层都作为单一渲染通路渲染。 所有纹理层都能用此方式显示,但很自然的是,这会导致渲染三角形计数的成倍增加,对于实时渲染并不实用。 对于零售版,系统会切换到烘培模式,将最明显的纹理层烘培到权重贴图纹理中,使地形在一个通路中完成渲染。 在应用程序中,有时有必要在世界的特定位置访问材质信息。 例如,为准确播放脚步声或应用墙壁痕迹效果,就需要访问材质信息。 因为权重贴图的存在,这一信息访问起来不太容易,因为权重贴图纹理驻存在 GPU 内存中。 为此,地形有一可选功能,可生成材质 ID 贴图。 该贴图本质上是一个 2D 数组,包含每个区块的值,范围为 0..255,其中每个输入值代表最显著的材质的 ID。 材质贴图分辨率可在地形配置中指定。
 
绘制请求
在最高细节层次,地形系统渲染 128×128 子分区(=32k 三角形)的几何网格。 如果某区块的高度样本分辨率高于该值(例如 256×256 的高度样本),则地形自动分成 2×2 页,即 4 个绘制请求。 这些字区块在该区块中的引用名为 Mesh Pages(几何网格页面),但只是一种内部构造。
 
可视性
地形为每个区块(如上图所示)仅创建一个视区。 地形与临近区域(左右前后)通过 API 函数VisVisibilityZone_cl::AddVisibilityZone 连接,所以地形会被可视性系统自动处理。 一旦可视性系统将某个视区标为可见,则对其中包含的地形区块进行标注,对几何网格执行细粒度边界框检查。 运行库期间创建的对象被自动分入这一网格,并精巧地处理区域穿越。 地形可视性系统完全支持引擎可视性系统的多线程运算方式。
 
LOD
地形细节层次以逐几何网格页面的方式执行,也就是说,每个 128×128 的地形页面使用一个可视性系统分配的 LOD 值。 最高细节层次的地形使用完整高度样本分辨率,第一个细节层次在每两个顶点之间进行间差,以此类推。 相邻页面之间的层次差异被限制到一个,因为索引缓存包括边缘修正,为预计算生成,如果为每种可能的组合提供索引缓存,会使索引数据量激增。 可视性系统负责实现该约束。 地形使用一个 LOD 值,以距离和一个差错度量为基础,该差错度量把最大屏幕空间错误与最高细节层次渲染进行对比。 也就是说,LOD 不仅基于距离,也取决于高度图噪声。 例如,一个完全平整的区块会始终尝试使用最低的 LOD。 但最低 LOD 未必能够使用,因为区块 LOD 必须满足一个约束条件,即与邻近区块只能有 1 个层次的差距。 可为全地形指定一个相对 LOD 缩放比例。 该值可在地形图形上设定。 默认值为 1.0,更小的值会使 LOD 切换得更加激进。 该值也可通过程序代码 VTerrain::SetLODScaling 设定,使地形细节成为游戏选项。 技术上讲,LOD 缩放因数是预计算 LOD 切换距离的倍增值。
 
仅基于距离的 LOD
上述 LOD 方案可能导致一些不希望出现的行为,因为远方地形的镶嵌程度可能比镜头近处的(平整)地形更高。 由于区块间层次差异不能超过 1 的限制,甚至会发生 LOD 在镜头旋转时变动的情况,因为区块的某个子集会随镜头旋转而改变可视性状态。 因此,还有一种仅基于距离的 LOD 模式。 在该模式下,LOD 仅取决于距离,而非实际地形噪声。 程序员可通过 API 调用切换到该模式。
 
VTerrain *pTerrain = (VTerrain *)VTerrainManager::GlobalManager().GetResourceByIndex(0);
pTerrain->SetLODMetric(VTerrain::VLODMODE_DISTANCE_ONLY);
LOD 度量也可在编辑器中的地形图形上更改。
 
孔洞
地形可以带有孔洞,例如洞穴的入口。 将地形铺块切换为孔洞即可定义孔洞。 该系统中无法使用细粒度定义。 所以需要围绕洞穴入口构建一些额外的几何体,以封闭方形的孔洞。 如果某区块中有定义为孔洞的铺块,该区块会使用自定义索引缓存。 由于该缓存具有独一性,不能和其他区块共享,带有孔洞的区块会显著占用内存(每页大约 1MB)。
 
植被
植被对象是非常轻量的模型表达,可以在一条优化的渲染路径中渲染。 植被对象不是实体, 而是由其模型和变形定义的。 植被不执行碰撞测试。 在编辑器中,每一种植被类型都定义为”密度贴图”,也就是一个光度纹理覆盖,定义了植被在特定位置的概率。 导出场景时,这些贴图被转换为每个对象位置值的实际数组。
 
磁盘文件夹结构
每个地形数据都位于项目文件夹下的专用文件夹内。 地形文件夹名称可在编辑器中指定,默认使用场景名称。 该文件夹内有如下子文件夹:

Config.vtc:包含地形配置的二进制表达,例如区块大小等。 这是零售版中的必要文件。
AuxiliaryTextures:该文件夹包含编辑器为各区块生成的所有最终纹理,即已烘培权重贴图纹理。 这些文件也是发布版本所必需的,但可事先进行压缩。
Editing:该文件夹包含编辑地形的相关文件,例如每个细节纹理的源细节纹理加权。 该文件夹不应随应用程序发布。
Meshes:该文件夹包含使用地形几何网格导出功能时创建的 .vMesh 文件。 使用自动地形几何网格导出功能的情况下,发布版本中必须完整包含该文件夹。
Sectors:该文件夹包含高度值文件和最终装饰信息。 发布版本中必须完整包含该文件夹。
vForge 会创建一个与该文件夹并列、名为 <terrainname>_cache 的文件夹。 其文件夹结构与地形文件夹一致,所包含的数据也相似。 vForge 使用该文件夹临时存放未进入暂存的区块数据,以此免去将数据存放到目标文件夹的麻烦。 该暂存文件夹不用加入版本控制,也不应发布。
 
碰撞几何网格
子分区和物理几何网格的碰撞取决于所使用的物理引擎。 物理结合将完整区块转换为专用的物理高度场图形。 对于引擎轨迹线,地形使用细粒度子分区,即和区块铺块同样大小的小碰撞几何网格(见上图)。
 
物理引擎
每当新区块被载入(卸载)时,物理引擎会通过物理模块获取一个回调:
virtual void IVisPhysicsModule_cl::OnTerrainSectorCreated(VTerrainSector *pTerrainSector);
virtual void IVisPhysicsModule_cl::OnTerrainSectorRemoved(VTerrainSector *pTerrainSector);
请参考 Havok™ 插件模块中的样本集成。
 
为地形编写自定义着色器
可在编辑器中为地形分配着色效果。 这需要一个带动态光照变量的材质着色器,但因为顶点流布局不同,还必须提供专用的顶点着色器。 具体而言,地形位置中的 x-y 位置来自与高度(z)不同的另一个流。 为了简化操作,有一个提供辅助函数的 TerrainShaders.inc 文件
 
例如:
// maps incoming sector xy [0..1] to world space xy position; xy: scaling, zw:ofs
float4 SectorScaleOfs : register(c38);
 
struct VS_IN
{
  float2 ObjPosXY : POSITION; // shared stream
  float ObjPosZ : TEXCOORD0;  // sector's own stream
};
 
// calculates the world spaec vertex position
float4 GetVertexPosition(VS_IN In)
{
  float4 pos = float4(In.ObjPosXY.x,In.ObjPosXY.y,In.ObjPosZ,1.0);
  pos.xy = pos.xy*SectorScaleOfs.xy + SectorScaleOfs.zw;
  return pos;
}
纹理采样器布局
该着色器应专门用于与像素着色器采样器名称有关的名称转换。 这点很重要,因为地形系统要分析从编辑器进入几何网格缓存、用于渲染的着色器和贴图纹理。 具体而言,地形编辑器会算出每个区块使用多少非重复权重贴图纹理。 例如,如果指定了 1 个权重贴图纹理采样器,则每个区块可以混合 5 个细节纹理(基底 + RGBA 混合)。 2 个权重贴图允许混合 9 个纹理,但该像素着色器当然会更为复杂。 下表列出了预定义采样器的名称:
采样器名称 用法
Normalmap 逐区块法线贴图,提供地形的世界空间法线。
Lightmap 散射光照贴图纹理
Lightmap1 凹凸光照贴图第 1 页
Lightmap2 凹凸光照贴图第 2 页
Lightmap3 凹凸光照贴图第 3 页
DetailBase 细节基底纹理的散射部分
NormalmapBase 细节基底纹理的法线贴图
SpecularmapBase 细节基底纹理的高光贴图
Weightmap0 用于混合相关通道 #1..#4(#1 为基底纹理)的逐区块权重贴图纹理
Weightmap1 用于混合相关通道 #5..#8 的逐区块权重贴图纹理
DetailTexture0 由 Weightmap0.r 混入的细节纹理的散射部分
DetailTexture1 由 Weightmap0.g 混入的细节纹理的散射部分
DetailTexture4 由 Weightmap1.r 混入的细节纹理的散射部分
DetailNormalmap0 由 Weightmap0.r 混入的细节纹理的法线贴图部分
DetailSpecularmap0 由 Weightmap0.r 混入的细节纹理的高光贴图部分
 
植被着色器
典型的植被着色器应包含风动画和距离渐变。 TerrainVegetation.inc 是一个模板包含文件,可用来自定义植被效果。 
还要注意的是,理想状态下,植被着色器应通过 instancing 提供一个效果变量。 地形系统会尝试从带有 Instancing 包含标记的效果中抓取替代的子技术。 参考请见默认着色器库。 逐实例信息是一个 4×3 的变形矩阵,作为 float4 传递到 TEXCOORD4、TEXCOORD5 和 TEXCOORD6:
// vertex stream declaration for vegetation with optional instancing
struct VS_IN
{
  float3 ObjPos   : POSITION;
  float3 Normal : NORMAL;
  float2 UV0 : TEXCOORD0;
#ifdef USE_INSTANCING
  float4   Row0     : TEXCOORD4;
  float4   Row1     : TEXCOORD5;
  float4   Row2     : TEXCOORD6;
#endif
};
如果装饰着色器执行一个 instancing 技术变量,则该植被类型可以随 instancing 渲染。 这能极大减少绘制请求的数量,从而显著改善性能。
 
烘培模式对比非烘培模式
美工可以在编辑器中绘制不限数量的细节纹理。 这些纹理在编辑器中看起来总是准确的,因为可编辑地形类把每一个细节纹理都放到独立的渲染通路中进行 alpha 混合渲染。 这会导致每个区块的地形都被渲染 n 次,n 是所使用的权重不为零的细节纹理的数量。 当美工切换到”烘培模式”,代码会根据 alpha 不透明度来评估哪些通道最为重要,并创建用于这些纹理贴图的权重贴图纹理。 (备注: 算法会判断一个通道被下一个 alpha 通道遮蔽的程度,如果完全被遮蔽,则不视其为一个通道)。
 
仅在烘培模式下,地形才使用美工指定的着色器。 当然,运行程序时,地形会使用烘培模式。
 非烘培模式下,地形使用一种称为”TerrainDetailPass“的技术渲染每一个通道, 该技术定义在 <VisionSDK>/Data/Vision/Editor/vForge/TerrainPlugin/TerrainCursor.ShaderLib 着色器库中。 该技术必须提供一个写死在代码中的通路组,即: 
pass 0: 混合单个细节纹理的通路
pass 1: 使用平行光照的光照通路
pass 2: 使用光照贴图的光照通路
pass 3:深度雾通路(为场景启用深度雾时使用)
编辑器中的地形系统渲染 n 个 0 型通路,然后根据编辑器中选择的光照类型渲染 pass 1 或 pass 2。 光照通路使用乘法混合为 n 通路的细节结果染色。 当场景中启用深度雾,雾通路会在以上渲染结果的顶层渲染。 请注意,为每个渲染通路应用深度雾是不能起效的。
 
而且,这仅在编辑器内有意义 - 负责应用光照计算公式和雾的是实际地形渲染器。
 
不支持的特性
地形系统目前不支持以下特性:
使用高度图细节更高的区域
支持 vForge 查看着色模式
地形着色器不能用可视化着色器编辑器设计, 必须在标准着色器编辑器中以 HLSL 代码编写。
分享到:
评论

相关推荐

    NI Vision Assistant中文入门教程2011

    该软件支持与NI LabVIEW开发环境集成,使得用户可以方便地将视觉处理和分析的结果运用到更广泛的自动控制系统中。 教程首先介绍了NIVision Assistant的用户界面,包括欢迎界面、图像采集界面和图像处理界面。在这些...

    vision-zjh

    总的来说,"vision-zjh"这个文档集合对于想要深入理解和应用计算机视觉技术,特别是使用Vision引擎的开发者来说,是一份非常宝贵的资源。它将涵盖从基础知识到高级应用的广泛内容,有助于提升开发者的技能并推动相关...

    vision.rar_C# VISION引用_C#引用NI_Vision_c# vision_ni vision

    在本文中,我们将深入探讨如何在C#编程环境中引用并使用National Instruments (NI) 的Vision库,以便进行图像处理和机器视觉应用。标题"vision.rar_C# VISION引用_C#引用NI_Vision_c# vision_ni vision"以及描述"C#...

    NI Vision Assistant中文入门教程(带书签)

    NI Vision Assistant中文入门教程(带书签)

    海康VisionMaster中使用OpenCvSharp程序

    在海康VisionMaster中使用OpenCvSharp,首先需要确保你的开发环境已经配置了.NET Framework,并且安装了OpenCvSharp的NuGet包。`LICENSE`文件通常包含了开源许可协议,确保你在使用时遵循正确的法律条款。`README.md...

    WPF技术框架进行VisionMaster二次开发控件应用实例

    在VisionMaster的二次开发中,ViewModel可以封装VisionMaster的API调用,将图像处理的结果暴露为属性,然后在View中通过数据绑定显示这些结果。这样,UI的更新和逻辑处理被有效地解耦,使得代码更加易于理解和管理。...

    NI Vision Assistant中文入门教程1.zip

    在提供的"NI Vision Assistant中文入门教程 (1).pdf"中,你将找到详细的步骤和示例,包括如何使用基本工具、执行特定的图像处理任务以及如何设置和优化检测流程。教程中的案例涵盖了从简单的边缘检测到复杂的形状...

    NI Vision函数详解_NIVision函数详解_NIVision截取

    在视觉技术领域,National Instruments(NI)开发的NI Vision是一个强大的图像处理库,它提供了丰富的功能,用于图像分析、检测和机器视觉应用。本篇文章将深入探讨NIVision函数及其在图像处理中的应用。 首先,NI...

    GigE Vision Spec2.0中文完整版

    7. **附录**:提供了额外的技术信息和示例代码。 #### 四、总结 GigE Vision Spec2.0中文完整版作为一项重要的技术规范,不仅为工业图像处理领域带来了显著的技术进步,也促进了该领域的标准化进程。通过对标准的...

    µVision3中文帮助

    4.µVision3 工具 给出了有关内置工具如文件中实现快速查找,及外部第三方工具如SVCS或Flash编程工具的信息。 5.测试程序 描述了如何用µVision3 调试器进行仿真及测试整个应用程序。 6.调试命令 给出了在可用...

    gige gigeVision 实现

    在本文中,我们将深入探讨GigE Vision的概念、优势以及如何实现这一技术。 首先,GigE Vision 的核心是使用标准的以太网电缆进行图像传输,这使得传输距离远超传统的Camera Link或USB等接口,同时减少了布线成本和...

    Vision Pro开发的Unity模板

    2. **环境感知**:在虚拟现实中,Vision Pro可以帮助游戏理解真实世界环境,调整虚拟内容以适应玩家的物理空间。 3. **游戏AI**:结合机器学习算法,Vision Pro可以为游戏的敌人或NPC提供更智能的行为,使它们能够...

    Vision_robot_Vision_

    首先,图像获取阶段,机器人配备的摄像头或其他传感器会捕捉到周围环境的图像信息,这些信息是后续处理的基础。接着,图像处理阶段,通过一系列的图像预处理技术,如去噪、增强对比度、直方图均衡化等,提升图像质量...

    NI Vision Assistant中文入门教程(高清PDF版)

    NI Vision Assistant中文入门教程,原帖地址(http://www.gsdzone.net/index.php/Home/Index/Index/index/cat_id/2841771288/t/3/id/805),现转为高清PDF版。

    Distant supervision 相关文献

    在实际应用中,Distant Supervision已经被广泛应用于信息抽取、关系抽取、事件抽取等领域。例如,在知识图谱构建中,它可以自动标注大量可能的关系,极大地提高了效率。同时,它也被用于语义解析、问答系统和推荐...

    usb3 vision spec

    1. 引言(Introduction):这部分说明了USB3 Vision规范的目的、责任声明、技术委员会、定义、缩写和参考文档等基本信息。 2. USB相关要求(USB Related Requirements):这部分描述了与USB3.0高速接口和USB2.0高速...

    GIGE Vision 1.2 协议手册

    除了上述介绍,GigE Vision 1.2协议手册还会详细介绍数据包的封装、图像压缩、时间戳的处理、错误恢复机制、多播技术以及如何优化网络性能等内容,确保图像数据能在复杂的网络环境中高效、低延迟地传输。...

    海康VisionMaster的应用(方案含图片)

    VisionMaster支持多种渲染技术,包括2D和3D渲染,使得用户可以在实时预览和结果展示中获得更加直观的视觉体验。比如,3D渲染可以帮助用户从不同角度观察物体,从而更好地理解其形状和结构;而2D渲染则可以提供清晰的...

Global site tag (gtag.js) - Google Analytics