Terrain Splatting

2023-11-06

标签: 网格优化2010
2011-05-16 16:17  1157人阅读  评论(0)  收藏  举报
  分类:
       

Terrain Splatting 
spalatting技术指的是在terrain中给指定的tile贴纹理,并且所纹理之间是非线性过渡的.这种技术基本上不耗费CPU,通过显卡多次渲染同一个三角形,在帧缓存中合成纹理.

基础Splatting

把terrain分成若干个块,对每个块,找出影响它的所有贴图,即块中所有单元(一个或多个tile,取决于你的粒度)所用的贴图和紧邻这个块的单元所使用的贴图.这就是所谓的"splat块"和"splat纹理".为每个块创建顶点缓存,优化.

对当前块中的每个splat纹理,取所有使用该纹理或与该纹理相邻的单元,创建三角形列表,优化.每个三角形列表就称为一个splat.每个splat块就由若干个相互交叠的splat组成.

为每个块生成alpha值,让它沿着边界淡出,可以使用顶点的alpha值,但这样要修改顶点缓存,所以通过生成一张alpha纹理来完成.为每个splat创建一张覆盖整个块的纹理,精度为每个单元2*2像素,对每个像素,找出splat纹理对应的权重.此权重由周围9个单元的纹理影响计算得出,每个texel对权重的影响为从对应单元的中心点按距离递减,到1.75个单元时为0,公式为: Weight(pt1, pt2) = 1 - DistanceSquared(pt1, pt2) / (1.75)^2)(可以设计自己的权重计算公式).计算出所有权重后把它们归一化,使它们相加为1.计算结果为每个splat一张alpha map.

现在从splat纹理中取颜色,alpha map中取alpha值来渲染splat.可以利用multi-texturing: 背景纹理为Stage 0,alpha map为Stage 1.D3D设置如下:

// Stage 0 coloring: texture0 * diffuse
device->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
device->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
device->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);

// Stage 0 alpha: nada
device->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
device->SetTextureStageState(0, D3DTSS_ALPHAARG1, DECTA_CURRENT);

// Stage 1 coloring: nada
device->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
device->SetTextureStageState(1, D3DTSS_COLORARG1, D3DTA_DIFFUSE);

// Stage 1 alpha: texture1
device->SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
device->SetTextureStageState(1, D3DTSS_ALPHAARG1, D3DTA_TEXTURE); 
注意每个splat的uv不同,在创建顶点缓存时使用标准网格的uv,然后为每个splat使用纹理矩阵把网格映射到对应的tile上,具体说来,Stage 0(splat纹理)的uv每几个单元用一个,Stage 1(alpha map)uv拉伸到整个块.

对不支持multi-texturing的硬件:
对每个splat,首先用alpha map做为纹理进行渲染,在帧缓存中写入alpha值(32位帧缓存),然后用splat纹理再渲染一遍,取帧缓存中的alpha值(destination alpha)来做混合.

以上方法有一个细节问题,在两个splat相交处,第一个splat以50%的alpha和帧缓存颜色混合,第二个splat又以50%和当前颜色混合,所以最终结果的25%会来自以前帧缓存中的颜色.最简单的修正办法是先以terrain中最常用的纹理渲染一遍整个terrain,之后的步骤中就不用再构造这个纹理的splat.

这样所完成的splatting,纹理之间的过渡是线性的(其实是二次的,但非常规则),这种方法得到的纹理有很高的细节.注意要设置splat之间的顺序,比如给每种纹理设置一个优先级,不同顺序渲染出来的效果不一样.

增强Splatting: 1.基础Pass和淡出

可以制作一个"基础纹理(base texture)"来修补splat之间的空洞.通过一个pass来生成这个基础纹理,大小为每个单元4*4 texels.把所有splat纹理用权重(跟上面的alpha map计算方法一样)混合起来得到基础纹理,基础纹理的精度很低,所以使用splat纹理的4*4 mip生成就够了.这样就得到了一张精度很低的terrain贴图.这次就不需要用前面的方法了,在splat过渡的地方会显示基础纹理.

有了这个基础纹理,就产生了另一种可能,在远处只使用基础纹理就足够了,不需要splat.所以我们让splat淡出,到一个指定的距离时关闭.跟制作细节纹理(details texture)的方法相同: 使用顶点alpha,或者把淡出加入到alpha map的mips中.即对alpha map过滤,使产生的mips越来越透明,到4*4 mip(或指定距离对应的mip)时完全透明.这种技巧只有在需要绘制很远的地方时才有优势.

基础纹理和alpha map都会有通常的块状问题,即在块的边界处由于过滤产生的问题.可以通过沿边界复制像素和把uv起点向纹理内移动半个像素来解决.

增强Splatting: 2.调整alpha值

有许多方法可以调整alpha map中的alpha值.第一种很简单:把权重的和归一化到比1大的值,然后截断到1.这样就能让基础纹理显示得少点高层纹理显示得多些.

另一种方法是基于所在的splat层偏移alpha值.增大底层的alpha,减少顶层的alpha.方法是对于每个单元,生成alpha map时检查所有相邻的splat,就可以得到当前纹理所在的层.算出下面和上面的层数,然后把alpha值乘以(number_above + 1)/(number_below + number_above + 1).

最后还可以给alpha增加一点随机值来改进效果.

增加Noise

增加noise可以让splatting纹理的过渡看起来不规则.这里的noise是splat纹理的alpha通道.在绘制时纹理和alpha通道一起绘制,在noise pass中使用.生成基础纹理时忽略alpha通道.

noise pass简单地重新渲染一遍splat,把这个alpha混合进去.D3D设置:

// Stage 0 coloring
device->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
device->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
device->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);

// Stage 0 alpha
device->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
device->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);

// Stage 1 coloring
device->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
device->SetTextureStageState(1, D3DTSS_COLORARG1, D3DTA_CURRENT);

// Stage 1 alpha
device->SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
device->SetTextureStageState(1, D3DTSS_ALPHAARG1, D3DTA_CURRENT);
device->SetTextureStageState(1, D3DTSS_ALPHAARG2, D3DTA_TEXTURE); 
noise alpha通道通常最大值在200左右,不会完全不透明.在splat的中间部分,noise pass不起作用,只是重画一遍像素,在过渡区域,会使得纹理产生不规则的影响.因为不用渲染基础纹理,noise pass增加的三角形数量会少于一倍.noise也可以和splat一样淡出,通常会比splat淡出得更快.因为渲染的是同一个顶点缓存所以noise alpha效率很高.

http://www.cbloom.com/3d/techdocs/splatting.txt

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/udking/archive/2010/12/09/6064971.aspx

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Terrain Splatting 的相关文章

  • Ubuntu运行rviz报错:OGRE EXCEPTION(3:RenderingAPIException): Unable to create a suitable GLXContext

    写在前面 笔者的测试环境 xff1a Ubuntu20 04 xff0c ROS noteic 一 问题描述 运行rviz时出现报错 xff1a span class token punctuation span WARN span cla
  • Ogre 界面(Overlay)

    Ogre 界面 Overlay 标签 border脚本buttontemplatesplugins引擎 2011 10 16 23 12 4725人阅读 评论 2 收藏 举报 分类 引擎技术 9 这里的界面是指菜单 HUD及提示信息框在内的
  • 纹理(Textures)

    纹理 Textures 原文 Textures 作者 JoeyDeVries 翻译 Django 校对 Geequlim BLumia 我们已经了解到 我们可以为每个顶点使用颜色来增加图形的细节 从而创建出有趣的图像 但是 如果想让图形看起
  • ogre每帧渲染在SceneManager::_renderScene()

    今天抄0 12版本ogre 在这里是每帧渲染的内容 以后可以再调试下高版本的 在这里设置个断点 void SceneManager renderScene Camera camera Viewport vp bool includeOver
  • 如果XML文件太大(10M),打开方式选择

    用UltraEdit打开 其他的例如Editplus和notepad 根本打不开上百M的文件 一打开就死了
  • ogre引擎0.12.0抄写记录

    惊喜地发现 文档齐全 可以参考类图抄 C Users Legion Desktop ogre v0 12 0 ogrenew Docs api html hierarchy html 先进行 1 OgreMain 然后 2 RenderSy
  • Ogre学习记录

    Ogre学习记录 Posted on 2008 07 09 15 36 RichardHe 阅读 839 评论 2 编辑 收藏 引用 所属分类 OGRE 1 设计初衷 它设计初衷是完全跨平台的 抽象的接口隐藏了平台相关的细节 它设计初衷是大
  • 地形平滑算法

    地形平滑算法 2013 06 20 18 33 2486人阅读 评论 0 收藏 举报 分类 OGRE 41 C C 10 版权声明 本文为博主原创文章 未经博主允许不得转载 拉出来的地下不平滑怎么办 笨办法就是美工一个顶点一个顶点的调整 而
  • Terrain Splatting

    Terrain Splatting 标签 网格优化2010 2011 05 16 16 17 1157人阅读 评论 0 收藏 举报 分类 OGRE 541 图形图像 746 游戏引擎 1651 图形引擎 1594 技术理论 1005 引擎开
  • Axiom3D:Ogre地形代码解析

    Axiom3D Ogre地形代码解析 作者 天天不在 发布日期 2014 09 01 20 52 05 我来说两句 0 Tag标签 地形 代码 大致流程 这里简单介绍下 Axiom中采用的Ogre的地形组件的一些概念与如何生成地形 先说下大
  • Texture Format全解析

    Texture Format全解析 Texture Format全解析 What internal representation is used for the texture This is a tradeoff between size
  • VC 运行时库 /MD、/MDd 和 /MT、/MTd

    VC 运行时库 MD MDd 和 MT MTd 2013 01 24 18 42 11058人阅读 评论 2 收藏 举报 分类 C C 19 有段时间在写cuda程序是出现过 error LNK2005 exit 已经在 MSVCRTD l
  • 转:Ogre TerrainGroup地形赏析

    转 Ogre TerrainGroup地形赏析 1 1 参考 http www ogre3d org tikiwiki tiki index php page Ogre Terrain System http www ogre3d org
  • hlsl register

    https msdn microsoft com en us library dd607359 v VS 85 aspx register Optional keyword for assigning a shader variable t
  • lod地形

    lod地形 2014 05 17 23 29 1471人阅读 评论 0 收藏 举报 分类 图形学 17 OGRE相关 75 目录 http blog sina com cn s blog 5e3213f30100zxet html 最近在看
  • OGRE动画

    动画是由若干静态画面 快速交替显示而成 因人的眼睛会产生视角暂留 对上一个画面的感知还末消失 下一张画面又出现 就会有动的感觉 计算机图形学中的动画也同样遵循着这一本质的原理 只不过不同于传统动画的手绘和拍摄 Ogre图形引擎可以通过自动或
  • 学习笔记:多重纹理

    学习笔记 多重纹理 2009 09 01 14 20 52 转载 分类 学习笔记 多重纹理 多重纹理就是在渲染一个多边形的时候可以用到多张纹理图 把多张纹理图进行一些颜色的操作 可以达到一些效果 但是多重纹理必须是在显卡支持的情况下 但是还
  • 2021年11月6日-11月12日(ogre抄写+ue4视频,本周35小时,共1035小时,剩8965小时。)

    这周还不错 不但完成了本周学习任务 还完成了本月学习任务 方法就是 拼命抄源码 抄到吐时就再看看Ue4视频教程 内外兼修 可以在未来的日子里这么进行 每天5小时学习 还是进入状态的 5 7 35小时 共1035小时 剩8965小时 另外 去
  • 第十三章 公告板与粒子系统 标签: ogre公告板粒子系统ogre粒子系统

    Ogre编程入门与进阶 第十三章 公告板与粒子系统 标签 ogre公告板粒子系统ogre粒子系统 2015 07 05 14 41 1365人阅读 评论 1 收藏 举报 分类 Orge模块 16 版权声明 本文为博主原创文章 未经博主允许不
  • Ogre g++ 编译时错误

    在ubuntu上 我已经编译并安装了所有的ogre库 但是 当我尝试使用此命令编译教程时 g o otest ogre cpp I pkg config libs cflags OGRE OIS lOgreMain lOI 它输出 tmp

随机推荐

  • 谷歌浏览器静态资源http请求被转为https请求

    加载图片这些静态资源的时候被转成https的 可能是浏览器的设置原因 谷歌浏览器左上角叹号 网站设置 不安全内改为允许
  • 综合架构备份服务

    备份服务器完成rsync守护进程模式搭建 rsync服务端配置步骤 第一个历程 下载安装软件 检查rsync软件是否安装 rpm qa grep rsync 这个是3 1 2 4版本的 可以重新下载一下 yum install rsync
  • TypeError: login() got an unexpected keyword argument 'userid'

    最近在做一个Django项目的时 采用了url伪静态的方式进行路由传参 由于学习资料中使用的Django的旧版本 而我使用的是Django2 然后找到Django2中路由参数传递的方式 urlpatterns path user
  • android刷机教程 华为,华为手机刷机教程(华为手机强制刷机步骤图文教程)

    刷机有风险 操作需谨慎 华为手机刷机升级前的准备工作 1 进行刷机升级之前 请备份您的用户数据 升级时确保电量超过50 2 因为是直接使用的官方recovery刷官方固件 所以不需要把手机解锁 3 此升级会清除用户数据请做好备份 以防数据丢
  • QT基础2--常用控件

    代码1 mainwindow h ifndef MAINWINDOW H define MAINWINDOW H include
  • yolov5训练结果解析

    yolov5训练结果的文件解析 1 weights训练好的模型 一般使用best pt去进行推理 2 confusion matrix png 混淆矩阵以矩阵形式将数据集中的记录按照真实的类别与分类模型预测的类别判断两个标准进行汇总 其中矩
  • centos中awk传递变量的几种方式

    第一种方式 echo awk END print var1 var2 var1 1 var2 2 缺点 命令行参数的限制是他们在BEGIN过程中是不可用的 直到首行输入完成以后它们才可用 BEGIN是在首行输入前执行 如下 echo awk
  • debug调到循环最后_调试陷入死循环程序的方法

    概述 应用程序陷入死循环后 界面可能不会有任何输出 所有的业务也不通 不易定位 陷入死循环的程序占用的cpu使用率较高 通常可以通过使用top命令看出来 对于多线程的程序 需要耐心调试 本文给出笔者近期使用的方法 调试步骤 测试程序 编写一
  • 下载图片的方法

    下载图片的私有方法 private static void downloadPicture String urlList String path URL url null try url new URL urlList DataInputS
  • 科技感ui界面 html,技术实现丨如何增强UI页面的科技感

    在界面中要想体现出更强的科技感 或者说让人眼前一亮 那么首先要知道 大众理解的科技感的东西或者说大众觉得很棒的科技感大概是什么 人的审美一直在跟随着主流的媒体而变化 从1985年的电影 回到未来 到现在的 漫威全家桶 科技的发展跨越了几十个
  • 单列集合Collection、list、set

    目录 一 collection 二 list集合 1 ArrayList集合底层原理 2 LinkedList集合 三 set系列集合 1 Set集合的实现类 2 HashSet底层原理 3 LinkedHashSet底层原理 4 Tree
  • 学习springboot入门遇到的问题(二):入门时遇到Whitelabel Error Page错误,百分百是因为

    入门时遇到Whitelabel Error Page错误 地址路径也没写错 后来查了一下原来是自己的项目结构包的位置放错了 根据我的项目结构 将DemoApplication入口类的package com example springboo
  • 闲云拾财:想做副业,你必须知道的几个正规副业,值得收藏

    受疫情影响 很多人现在都很重视副业的发展 都希望通过副业收入来改善自己的生活 但很多人却不知道该做什么 今天给大家分享几类副业 大家可根据个人实际和兴趣爱好进行选择 做完后你一定会发现惊喜 一 卖宠物 如果你对宠物比较有研究 可以倒腾宠物作
  • linux文件解压缩:tar: /usr: Not found in archive

    一 问题描述 在使用tar zxvf zookeeper 3 4 6 tar gz usr local解压缩zookeeper 3 4 6 tar gz文件时遇到Not found in archive错误 二 问题原因及解决方案 原因 因
  • input实现图片或视频上传(样式+代码)

    背景 vue element ui 1 html div div
  • 【华为OD统一考试B卷

    在线OJ 已购买本专栏用户 请私信博主开通账号 在线刷题 运行出现 Runtime Error 0Aborted 请忽略 华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一
  • echart Y轴设置

    yAxis show true 是否显示 y 轴 position top y 轴的位置 top bottom type category 坐标轴类型 nameLocation end 坐标轴名称显示位置 nameGap 15 坐标轴名称与
  • Windows如何部署Redis

    一 简介 Redis Remote Dictionary Server 是一个由意大利人 Salvatore Sanfilippo 开发的 key value 存储系统 具有极高的读写性能 读的速度可达 110000 次 s 写的速度可达
  • 【Qt】d_ptr指针、p_ptr指针详解

    此文章可以参考 Pimpl技术的基本应用 PImpl机制以及Qt的D Pointer实现 Qt的d ptr本质上使用了pimp技术 D指针 保持一个库中的所有公有类的大小恒定的问题可以通过单独的私有指针给予解决 这个指针指向一个包含所有数据
  • Terrain Splatting

    Terrain Splatting 标签 网格优化2010 2011 05 16 16 17 1157人阅读 评论 0 收藏 举报 分类 OGRE 541 图形图像 746 游戏引擎 1651 图形引擎 1594 技术理论 1005 引擎开