公开/公告号CN106204735A
专利类型发明专利
公开/公告日2016-12-07
原文格式PDF
申请/专利权人 中国人民解放军理工大学;
申请/专利号CN201610567765.2
申请日2016-07-18
分类号G06T17/05(20110101);
代理机构北京科亿知识产权代理事务所(普通合伙);
代理人汤东凤
地址 211101 江苏省南京市江宁区双龙街60号
入库时间 2023-06-19 01:03:10
法律状态公告日
法律状态信息
法律状态
2018-11-09
授权
授权
2017-01-04
实质审查的生效 IPC(主分类):G06T17/05 申请日:20160718
实质审查的生效
2016-12-07
公开
公开
[发明领域]
本发明涉及计算机软件技术领域,具体是一种Direct3D 11的数据处理及显示方法。
[技术背景]
现有技术中,在开发三维游戏或者设计三维仿真软件的时候经常需要加载地形模型到场景中渲染。以基于Direct3D技术底层开发的引擎为例,在这些引擎中加载地形的常规做法便是,先使用3DMax这样的3D模型制作软件进行地形的建模,生成地形的顶点数据,并贴上纹理位图;再导出Direct3D能识别使用的数据(Direct3D 9或者之前的版本使用的是X格式的文件,从Direct3D 10开始使用sdkmesh格式的文件)。
在使用3DMax软件来构建地形时,除了要调整地形模型里的各个顶点的位置,还需要使用PS等图形处理软件对地形的纹理进行色调、融合等多种图形处理,工作量很大。并且这种处理方式存在一个弊端,就是地形场景比较大的时候,为了提高地形纹理的细节,往往纹理的尺寸也要相应地增加。目前主流显卡支持的纹理尺寸是4096×4096(像素)的大小,但使用这样的大纹理,往往在一些大范围的场景中,一张纹理仍然是不够用的,需要多张纹理拼接起来显示,这样便占用了极大的显卡显存资源。
Unity3D是一款商业软件开发引擎,可用于游戏开发,其内置的地形编辑器可以方便地构建自然界的地形模型。使用该地形编辑器中提供的工具,便可方便地调整地形的高低起伏,设置地形模型某处的纹理混合效果,种植植物等。Untiy3D使用了一种动态的纹理混合技术:显示地形某处的纹理数据是在渲染的时刻由预先加载的纹理资源集合中不同纹理的权重进行混合计算得到的,而不是预先导入多张预处理好的高清大纹理,这样便避免了大量高清纹理占据系统资源。如此高效方便的地形编辑器制作出来的地形模型只能在Unity3D环境中使用,虽然可以使用现有的插件导出地形模型的顶点位置信息,但是只有顶点位置信息是远远不够的,这些数据在Direct3D的环境中只能看到地形的高低起伏,所有的纹理信息都丢失了。
如果在非Unity3D的引擎中,也能正常显示出使用Unity3D地形编辑器生成的地形模型,这样便可以大量节省计算机系统资源。
[发明内容]
本发明客服了上述技术的不足,对目前已有的只能导出Untiy3D地形顶点数据的插件进行了功能上的强化,增加了导出的数据类型;设计了一个数据预处理模块,作用是将导出的地形数据转化为在Direct3D 11的渲染环境中所需要的数据资源;设计了一个像素点着色器,使得处理后的数据资源最终能在Direct3D 11的环境中得以正常显示。
为实现上述目的,本发明采用了下列技术方案:
增强的Unity3D地形导出插件:包括地形概要信息导出模块101;顶点位置信息导出模块102;各层纹理混合权重导出模块103;植被信息导出模块104。
导出数据预处理模块:包括地形顶点的位置和UV信息生成模块201,读取顶点位置信息导出模块102导出的地形顶点数据,构建相应的几何三角面。
地形外貌纹理阵列生成模块202,根据地形概要信息导出模块101中纹理集合的信息,读取所需的地形外貌纹理文件,生成Direct3D 11的地形外貌纹理阵列。混合权重纹理生成模块203,根据各层纹理混合权重导出模块103导出的数据,生成纹理集合中含有各个纹理混合权重信息的Direct3D 11纹理。植被的位置和缩放处理模块204,根据植被信息导出模块104导出的植被信息设置场景中植物的三维空间坐标,并进行植物面片尺寸的缩放调整。
基于Direct3D 11的像素点着色器:作用是在上述预处理模块生成的顶点、纹理等三维渲染要素资源的基础上,计算屏幕上各个像素点的光照、根据权重纹理的信息在地形外貌纹理阵列中进行纹理取样的混合,并最终在Direct3D 11的渲染环境中正确显示出Unity3D导出的地形。
具体来说:
一种Unity3D地形数据在Direct3D 11环境中的使用方法:设计增强的Unity3D地形导出插件、导出数据预处理模块和像素点着色器;
步骤1)由增强的Unity3D地形导出插件导出地形数据;
步骤2)由导出数据预处理模块将所述步骤1)得到的数据转换为在Direct3D11的渲染环境中所需的数据资源;
步骤3)由像素点着色器进一步处理,使步骤2)得到数据资源最终能在Direct3D 11的渲染环境中正常显示;
所述步骤1)中,增强的Unity3D地形导出插件包括以下子模块:
地形概要信息导出模块101:导出地形概要信息数据;
顶点位置信息导出模块102:导出地形顶点数据;
各层纹理混合权重导出模块103:导出纹理集合中各层纹理权重值;
植被信息导出模块104:导出植被信息设置场景中植物的三维空间坐标;
所述步骤2)中,导出数据预处理模块包括以下子模块:
地形顶点的位置和UV信息生成模块201:读取所述地形顶点数据,并构建相应的几何三角面;
地形外貌纹理阵列生成模块202:根据地形概要信息数据,读取所需的Unity3D中的地形外貌纹理文件,生成Direct3D 11的地形外貌纹理阵列212;
混合权重纹理生阵列成模块203:根据所述纹理集合中各层纹理权重值,生成Direct3D 11纹理,这些纹理的纹理集合中含有各层纹理的混合权重信息;
术语说明:各层纹理的混合权重是指数值,是一个二维的数组。权重纹理是纹理,本质是Direct3D11中的一种资源对象。在本发明中,生成权重纹理后,由混合权重的内容对其赋值。
植被的位置和缩放处理模块204:根据植被信息设置场景中植物的三维空间坐标,缩放调整植物面片尺寸;
所述步骤3)中,像素点着色器根据步骤2)得到的三维渲染要素数据资源,先计算屏幕上各个像素点的光照值;
然后,根据混合权重纹理的信息在地形外貌纹理阵列212中进行纹理取样的混合;
最后,在Direct3D 11的渲染环境中正确显示出由Unity3D导出的地形。
所述步骤1)中:
地形概要信息导出模块101导出的地形概要信息数据包括:地形在XYZ坐标系中X轴和Z轴的尺寸、地形网格最左前格点的坐标、权重纹理的尺寸、地形外貌纹理集合的子纹理个数和各个子纹理在X和Z方向上UV重复的控制步长;
举例说明一下:把地形看做是一个房间的地面,我们要在地面上贴多层的带花纹的玻璃砖。每层的玻璃砖的尺寸不一样,这样每层玻璃砖在X和Z方向上排列的个数也不一样,如果某层玻璃砖在X方向上的边长越大,那在X方向上排列的个数就越小;UV重复的控制步长,可以理解为玻璃砖在X和Z方向上的边长。
顶点位置信息导出模块102按地形网格行为主的访问次序,依次导出地形网格中各个顶点的三维坐标;
各层纹理混合权重导出模块103导出的数据是纹理集合中各层纹理权重值的二维数组;设置该二维数组的尺寸和由地形概要信息导出模块101导出的权重纹理尺寸相同;导出时,多层纹理作为一组,按照位图的格式进行导出,不足的图层通道都用0来填充;
植被信息导出模块104导出Unity3D场景中构成的树木或者花草的交叉面片;对于每个交叉面片,分别导出其三维空间的坐标以及在X、Y、Z三个轴方向上的缩放系数。
所述步骤2)中:
地形外貌纹理阵列生成模块202读取Unity3D中的地形外貌纹理集合中的每个纹理文件,构建在Direct3D 11渲染环境中所需要的地形外貌纹理阵列212,供像素点着色器的纹理取样器取样;
这里的构建是指创建一个ID3D11Texture2D的对象,该对象包含多个子纹理层,子纹理层的个数等于地形外貌纹理集合中不同纹理个数。然后读取相应层对应的纹理文件(BMP、JPG等常见的图片文件)的内容给该对象的每个子纹理层赋值。同理可解释下面的混合权重纹理整列的构建。
混合权重纹理阵列生成模块203读取导出的位图,构建在Direct3D 11渲染环境中所需要的混合权重纹理阵列213,供像素点着色器的纹理取样器取样;
地形顶点的位置和UV信息生成模块201生成在Direct3D 11渲染环境中所需要的三角面的顶点数据流211;三角面的顶点数据流包括三角面的顶点的位置、法线和UV信息。
所述步骤3)中,由三角面的顶点数据流,进行如下处理:
301)光照计算:由场景中光照反方向的方向矢量点乘在像素点着色器中需渲染像素点所在的三角面法线的方向矢量,便得出该像素点的光照强度;
302)混合权重纹理阵列取样:对混合权重纹理阵列213进行取样;取样的UV参数可通过顶点的位置计算得到,由取样的结果得到相应像素点在地形外貌纹理阵列212中不同的纹理层的权重值;
还是用前面的铺玻璃砖的例子说明,权重值便是玻璃砖在地面某个点的透明度,地面上任意一点对应的各层玻璃砖的权重值累加之和恒等于1(这是Unity3D地形编辑器定义的规范)。权重值为1,表示完全不透明,地面上某个点的颜色,便是该层某个玻璃砖对应着地面该点的花纹。权重值为0,表示完全透明,玻璃砖在地面该点上完全透明。
取样外貌纹理(玻璃砖)某层的UV参数,和取样混合权重纹理的UV参数,是不一样的。前者U的值是由地形某点的X值减去地形左边界的X值得到的差,然后除以该层外貌纹理U控制步长,计算出的商取小数部分得到的,(用铺玻璃砖来形容,商的整数部分,便是地面某点的左边有多少块完整的玻璃砖,小数部分,便是地面某点所在的那块玻璃砖的X方向上的位置,如:0.5便是该玻璃砖中间的位置,0.25,便是该玻璃砖从左边开始1/4的位置。)同理也可以计算V的值。
混合权重纹理UV的计算方式,参看下文说明。
303)地形外貌纹理阵列取样:计算像素点距离观察点的位置,由距离的远近设置相应的多细节层次LOD级别;
然后对步骤302)得到的权重值进行判断:权重值为0的不处理;
如果权重值大于0,便结合LOD参数信息对地形外貌纹理阵列中相应的纹理层进行纹理取样;累加各层的取样结果,得到地形外貌各层纹理总的ARGB值;
各纹理层的UV取样参数的计算方法为:先计算像素点在地形X轴和Z轴方向上、与地形最左前方网格的距离;然后该距离值除以各纹理层的UV重复步长,对得到的商取小数部分,该小数部分便是地形外貌纹理阵列212中各层纹理的UV取样参数值;
304)综合累加:结合步骤302)得到的ARGB值和步骤301)得到的光照值,最后计算出该像素点最终的ARGB值。
(由301)得到的光照值乘以步骤302)得到的ARGB值计算出像素点最终的ARGB值)
所述步骤1)中,所述各层纹理混合权重导出模块103导出各层纹理权重值的二维数组时,每4层纹理作为一组,按照32位位图的格式进行导出,不足的图层通道都用0来填充。
所述步骤2)的地形外貌纹理阵列生成模块202中,每个纹理的大小设置为相同的尺寸;纹理阵列描述了地形的外貌信息。
所述步骤2)的地形顶点的位置和UV信息生成模块201中,三角面的顶点的位置信息是由顶点位置信息导出模块102依次导出的地形网格中各个顶点的三维坐标提供;法线是根据组成的三角面的三个顶点的空间位置计算得出;
UV表示的是网格点在混合权重纹理中取样的位置,UV的计算方法为:地形网格最左端格点的U值为0,最右端格点的U值为1,中间格点的U值按照距最左端格点X轴方向上的距离线性变化;最前方格点的V值为0,最后方格点的V值为1,中间格点的V值按照距最前方格点Z轴方向上的距离线性变化。
本发明的有益效果如下:
1、使用Unity3D强大的地形编辑器来方便高效地设计制作地形模型,模型完成后导出的地形数据文件在Direct3D 11的环境中可以正常显示,解决了以往使用3DMax等3D模型制作软件设计制作地形模型比较繁琐的弊端。
2、解决了以往在渲染大地形模型的过程中高清纹理资源占用大的缺陷,并使用LOD方案,保证地形近景纹理的清晰度不失真,并根据距离的变化逐级降低地形远景的纹理显示细节。在显存资源的空间节约和实时渲染的效率优化上均取得了很好的效果。
3、像素点着色器的设计结构合理,充分发挥了Direct3D 11强大的渲染功能,软件效率高。
[附图说明]
图1为本发明增强导出插件的功能模块图。
图2为本发明地形数据预处理的功能模块图。
图3为本发明像素点着色器的工作流程图。
[具体实施方式]
下面结合附图与本发明的实施方式作进一步详细的描述:
首先说明“地形网格行为主的访问次序”这个概念。Unity3D中使用的是右手坐标系,以我们站在地形的中心为例,X轴的方向是向右,Y轴的方向是向上,Z轴的方向是向后。按“地形网格行为主的访问次序”访问地形网格,便是从前方最远的一行地形网格开始,由左至右依次访问,然后再访问次远的一行,这样一行一行,从前到后,直到访问完身后最远的一行。
下面详细介绍导出插件各个模块所做的工作:
概要信息导出模块101:导出的数据包括地形在X轴和Z轴的尺寸、地形网格最左前格点的坐标、权重纹理的尺寸、地形外貌纹理集合的子纹理个数和各个子纹理在X和Z方向上UV重复的控制步长。
顶点位置信息导出模块102:按地形网格行为主的访问次序依次导出地形网格中各个顶点的三维坐标。
各层纹理混合权重导出模块103:导出的数据是纹理集合中各层纹理权重值的二维数组,该二维数组的尺寸由概要信息导出模块101导出的权重纹理尺寸来确定。该权重值二维数组的每个元素的数据类型为单字节,范围从0到255。导出时,每4层纹理作为一组,按照32位位图的格式进行导出,不足的图层通道都用0来填充(比如纹理集合有10层纹理,那我们构建第3张32位位图时,G和B的通道都用0来填充)。这样做的好处是我们把每一层的权重二维数组看做是32位位图的某一个通道信息,那4层纹理数据便构成了一个32位的位图,这样导出的数据我们既可以直观地看出其权重信息,也方便后期Direct3D 11权重纹理的创建。
植被信息导出模块104:导出Unity3D场景中由交叉面片构成的树木或者花草,每个交叉面片分别导出其三维空间的坐标以及在XYZ三个轴方向上的缩放系数。
通过上述导出模块的操作,我们便得到在Direct3D 11渲染环境中正常显示Unity3D地形的必要数据,下面结合图3的像素点着色器的工作流程图和图2的数据预处理模块结构图阐述导出的地形数据最终如何在Direct3D 11的渲染环境中正常显示的方案。
使用数据预处理模块将导出模块导出的数据转化成在Direct3D 11渲染环境中所需要的顶点数据流和Direct3D 11纹理阵列。
地形外貌纹理阵列生成模块202:读取Unity3D中的地形纹理集合中的每个纹理文件,构建在Direct3D 11渲染环境中所需要的纹理阵列,供像素点着色器的纹理取样器取样。在本发明中,每个纹理的大小应该设置为相同的尺寸。该纹理阵列描述了地形的草地、岩石、土壤等外貌信息。
混合权重纹理阵列生成模块203:读取导出的32位位图,构建在Direct3D 11渲染环境中所需要的混合权重纹理阵列,供像素点着色器的纹理取样器取样。
地形顶点的位置和UV信息生成模块201:生成在Direct3D 11渲染环境中所需要的三角面的顶点数据流211,该顶点数据流由顶点的位置、法线、UV信息组成。顶点的位置信息由顶点位置信息导出模块102依次导出的地形网格中各个顶点的三维坐标提供,法线可根据组成的三角面的三个顶点的空间位置计算得出。UV表示的是网格点在混合权重纹理中取样的位置:地形网格最左端格点的U值为0,最右端格点的U值为1,中间格点的U值按照距最左端格点X轴方向上的距离线性变化。最前方格点的V值为0,最后方格点的V值为1,中间格点的V值按照距最前方格点Z轴方向上的距离线性变化。
在地形模型渲染的每一帧中,顶点数据流首先经过顶点着色器处理,完成三维空间的顶点到二维屏幕坐标空间的转换,下面结合图3,说明本发明构建的像素点着色器的工作流程:
光照计算单元301:由场景中光照的方向和在像素点着色器中需渲染像素点所在的三角面法线的方向,计算出该像素点的光照强度。
混合权重纹理阵列取样单元302:对由导出数据预处理模块生成的混合权重纹理阵列进行取样,取样的位置由顶点的UV值确定,取样的结果得到该像素点在地形外貌纹理阵列中,不同的纹理层的权重值。
地形外貌纹理取样单元303:计算像素点距离观察点的位置,由距离的远近设置相应的LOD级别。然后对上个步骤得到的权重值进行判断,权重值为0的不处理,如果大于0,便结合LOD参数信息对地形外貌纹理阵列中相应的纹理层进行纹理取样,累加各层的取样结果,得到地形外貌各层纹理总的的ARGB值。各纹理层的UV取样参数由如下的方法计算:先计算像素点在地形X轴和Z轴方向上与地形最左前方网格的距离,然后除以各纹理层的UV重复步长,得到的商取小数部分便是地形外貌纹理阵列中各层纹理的UV取样参数值。
综合累加单元304:结合上一步骤得到的ARGB值和由光照计算单元301得到的光照值,最后计算出该像素点最终的ARGB值。
在植被交叉面片的渲染中,根据植被的位置和缩放参数进行面片顶点位置的调整处理,我们便完成了Unity3D地形数据在Direct3D 11渲染环境中的正常显示。
现有技术中:
ARGB(rgba)是代表Red红、Green绿、Blue蓝和Alpha透明程度。
三维模型中的两个重要的坐标系统,一是顶点的位置(X,Y,Z)坐标,另一个是UV坐标。一般来说,UV是u,v纹理贴图坐标的简称,它提供了顶点在纹理中取样的位置信息。
机译: 用于在 u0441 u043a u0432 u0430 u0436 u0438 u043d u043d u043d u043e u043c u0442 u0440 u0443 u0431 u043d u043e u043c产品中钻孔的设备,或随后积聚水环境或在空间或饼状塑料中的混合物 u0442 u0435 u043a u0443 u0447 u0438 u0445环境。 u0441 u043a u0432 u0430 u0436 u0438 u043d u043d u043d u043e u0435 u0442 u0440 u0443 u0431 u043d u043e u0435产品钻取和设备使用方法
机译: 在主要水环境中形成包含弹性阳离子型聚氨酯的组合物,使用方法及其使用方法
机译: 在通信质量较差的环境中停车后将其集成到车辆中的无线通信模块的警报系统及其使用方法