基于Direct3D11的三维图形渲染引擎的制作方法

文档序号:10688093阅读:425来源:国知局
基于Direct3D 11的三维图形渲染引擎的制作方法
【专利摘要】一种基于Direct3D 11的三维图形渲染引擎,包括一个总体控制模块以及多个功能性子模块;功能性子模块包括矩阵模块、视角模块、抬头显示模块、多字符集文字模块、三维图元基类模块、广告板模块、网格模型模块、烟雾、雨雪粒子系统模块、光晕特效计算模块、软阴影计算模块。在每一帧的默认渲染过程为:先调用软阴影模块,以光照的方向为视角计算出渲染场景中各个图元的深度信息;随后以观察者眼睛的视线为角度把场景中各个图元渲染到渲染表面,得到原始场景视图,并同时得到高光的信息,根据深度信息和光照计算结果得出每个像素点的实际照明效果。最后结合第一次和深度信息和高光信息,对原始场景视图进行光照的高光光晕特效后处理,得到最终的单帧渲染图。
【专利说明】
基于Direct3D 11的三维图形渲染引擎
[技术领域]
[0001]本发明属于计算机技术领域,具体涉及一种基于Direct3D11的三维图形渲染引擎系统。
[【背景技术】]
[0002]如今电脑上的三维游戏在人们日常的娱乐中越来越占据了重要位置,很多的人都玩过类似英雄联盟、魔兽世界这类的游戏,这些游戏场景逼真,弓I人入胜。同样,三维仿真演示训练软件在房地产、服装、家具、日用百货、展会、培训等行业也越来越普及,这些三维仿真的软件能营造非常逼真的环境,满足多种演示或训练的需求,使得体验的客户能身临其境,从而使得使用三维仿真的一方能节省很多开销,降低安全风险,达到更高效率。上述的三维游戏或者仿真演示训练软件都需要使用到三维图形的渲染技术,目前在个人操作系统市场上保有量最大Windows平台上进行相关软件程序的开发过程中,Direct3D无疑是首选的三维图形渲染的技术。
[0003]Direct3D是由微软制定的在Windows系统上的一套3D绘图的编程接口,是微软公司的DirectX SDK集成开发包中的重要部分,适合多媒体、娱乐,即时三维动画等广泛和实用的三维图形计算。自1996年发布以来,Direct3D以其良好的硬件兼容性很快得到了广泛的认可,目前广为各家显卡所支持。如今在Windows上绝大部分游戏都需要Direct3D的支持才能运行。可以说在Windows平台上要考虑开发三维游戏或者设计仿真软件,无视Direct3D是不可能的。
[0004]Direct3D发展至今,最新的版本为12。尽管如此,Direct3D 11的功能强大,比之前的版本渲染效率更高,支持HLSL5.0的规范,而且平台适应性广,它在Windows7,Windows8,WindowlO的平台上都可以运行,另外Direct3D 11的硬件兼容性强,目前主流的显卡都支持Direct3D 11。从技术层面来看,Direct3D 11的渲染管道新增了外壳着色器、细分固定模块、域着色器,从而实现曲面细分技术,可以快速地在显卡里动态增加细分控制点三角形内部的小三角形,提高渲染的精细度。同时也新增了计算着色器,以GPU的平行处理能力与浮点计算能力来实现CPU的运算,并且还支持光线跟踪和光栅化技术,可以说Direct3D 11的功能是非常强大的。
[0005]但是和以前的Direct3D版本相比,Direct3D 11对软件编写程序员的要求提高了,其实从10的版本开始,已经完全抛弃了以前版本的固定管道渲染的工作方式,所有的渲染工作,程序员面对的都是一个个的着色器,虽然使用着色器渲染能极大提高渲染效果,但是这对于新接触Direct3D的人来说无疑是一件非常头疼的事情,往往需要花太多的时间去理解Direct3D 11的工作机理和渲染流程,把太多的时间花在了底层渲染接口的使用方法上,使用每种着色器时除了繁琐的构建过程,同时还都要考虑到上下衔接的不同着色器输入输出的数据流要匹配等等,这对开发三维图形的项目而言,是一个不小的精力和资源的开销,尤其是在开发时间紧、任务重的三维仿真演示项目中更是雪上加霜。[
【发明内容】
]
[0006]本发明克服了上述技术的不足,提出了一个基于Direct3D11的三维图形渲染引擎,本引擎包括一个总体控制模块200以及多个不同的功能性子模块,并内部集成了满足通用渲染需求的着色器序列集和HLSL着色器脚本集,同时也提供了常用的工具集。总体控制模块负责引擎初始化,渲染工作和销毁;开启每帧的渲染;与调用本引擎的客户端程序进行数据的交互,创建和销毁引擎里不同的功能性子模块。功能性子模块从不同的渲染需求出发,结合面向对象的思路进行了构建。
[0007]为实现上述目的,本发明采用的技术方案为:所述总体控制模块包括引擎默认的着色器序列集、HLSL着色器脚本集、维护和管理引擎所生成的数据以及资源,并提供了常用的工具集
[0008]所述功能性子模块包括矩阵模块201、视角模块202、抬头显示模块203、多字符集文字模块204、三维图元基类模块205、广告板模块206、网格模型模块207、烟雾、雨雪粒子系统模块208、光晕特效计算模块209、软阴影计算模块210。
[0009]矩阵模块201属于图元基类模块205的一个对象属性。
[0010]广告板模块206、网格模型模块207、烟雾、雨雪粒子系统模块208这三种模块由图元基类模块205派生。用户也可以从图元基类模块205派生出满足自己需求的自定义的渲染图元。
[0011]本引擎是以图元基类模块205为基本的渲染单元进行渲染的,如需渲染从其派生出的图元,只要考虑该图元的初始化和所需要渲染的代码行位置即可,与其相关的各类着色器的调用和数据流的处理,引擎已经封装好内部的实现细节,无需引擎使用者过多考虑。如果要使用自定义的图元,那便需要自定义一套图元的类结构以及相关的着色器的具体实现方法。本引擎为此也预留了相关的接口。
[0012]本引擎在每一帧的默认渲染过程中分如下步骤:首先调用软阴影模块210,以光照的方向为视角计算出渲染场景中各个图元的深度信息;随后以观察者眼睛的视线为角度把场景中各个图元渲染到渲染表面,得到原始场景视图,并同时得到高光的信息,根据深度信息和光照计算结果得出每个像素点的实际照明效果。最后结合第一次和深度信息和高光信息,对原始场景视图进行光照的高光光晕特效后处理,得到最终的单帧渲染图。
[0013]本发明的技术方案具体为:
[0014]一种基于Direct3D 11的三维图形渲染引擎,包括总体控制模块200和多个功能性子模块;
[0015]所述总体控制模块控制:引擎初始化、渲染工作和销毁;开启每帧的渲染;与调用本引擎的用户程序进行数据的交互;创建和销毁本引擎里不同的功能性子模块;
[0016]所述总体控制模块包括:着色器序列集、HLSL着色器脚本集、维护和管理引擎所生成的数据以及资源,并提供了常用的工具集(例如,这些工具集包括:比如不同着色器的创建工具;着色器脚本编译工具;由尺寸大小或者由位图文件地址创建Direct3D 11纹理的工具;Direct3D 11纹理填充工具,可以由指定的颜色、DLL资源中的位图数据、位图的句柄(HBITMAP)等不同方式填充纹理的内容等);
[0017]所述功能性子模块是从渲染需求出发,结合面向对象的思路进行构建;功能性子模块包括:矩阵模块201、视角模块202、抬头显示模块203、多字符集文字模块204、三维图元基类模块205、光晕特效计算模块209和软阴影计算模块210;
[0018]所述矩阵模块201属于图元基类模块205的一个对象属性;所述矩阵模块201包括世界矩阵、摄像机矩阵和投影矩阵;
[0019](“世界矩阵是表示点的空间位置的矩阵;摄像机矩阵是表示摄像机的空间位置的矩阵;投影矩阵是表示三维空间中的点被投影到屏幕上的变换矩阵”。顶点经过世界矩阵的变换,得到其在经过平移或者旋转运动后新的位置,再经过摄像机矩阵变换,得到该顶点在摄像机坐标空间里新的坐标,再经过投影变换,得到其在二维屏幕空间上的投影位置。)
[0020 ]本引擎对每一帧的默认渲染过程,包括如下步骤:
[0021]首先调用软阴影模块210,以光照的方向为视角计算出渲染场景中各个图元的深度信息;
[0022]随后以观察者眼睛的视线为角度,把场景中各个图元渲染到渲染表面,得到原始场景视图,同时得到高光的信息;再根据深度信息和光照计算结果,得出每个像素点的实际照明效果;
[0023]最后结合第一次和深度信息和高光信息,对原始场景视图进行光照的高光光晕特效后处理,得到最终的单帧渲染图。
[0024]进一步的,本引擎的工作流程,步骤如下:
[0025]100)引擎初始化:
[0026]总体控制模块200初始化三维渲染引擎的上下文环境,生成引擎的Direct3D11的设备指针和渲染缓冲区交换链,定义引擎默认的图元拓扑数据流结构,构建了通用的顶点着色器、像素点着色器、阴影计算着色器、高光计算着色器和光照后处理着色器;加载了HLSL5.0的着色器脚本集供各个着色器对象使用;
[0027]由用户程序设置的定时器来每秒钟调用多次的渲染过程,每次渲染的结果作为三维动画的显示帧;
[0028]101)阴影深度图计算:
[0029]根据场景中的光源,由软阴影计算模块210计算相应的三维图元的深度值,并保存到对应的Direct3D 11纹理表面;不同的光源对应不同的纹理表面;
[0030]102)场景视角设置:
[0031]由视角计算模块202设置场景中摄像机的位置;
[0032]103)三维渲染状态设置:
[0033]a、设置渲染所需的渲染状态:剔除逆时针三角面的渲染、启用透明度混合计算,打开深度测试等;
[0034]b、设置三维图元拓扑数据流的数据结构(在本引擎中,默认三维图元拓扑流的结构包括顶点坐标、漫反射属性值和纹理UV值);
[0035]为三维图元的原始数据进入显卡的可编程管道流水线做前期的准备;
[0036](三维图元的原始数据进入显卡的可编程管道流水线”的要求是不同的着色器的输入数据流必须满足其最基本的数据格式要求。在顶点着色器的工作中,输入的数据流至少要包含顶点的位置信息,在像素点着色器中,输入的数据流至少要包含经过三个变换矩阵变换到二维屏幕的坐标信息。)
[0037]104)三维渲染着色器序列集设置:
[0038]绑定本引擎构建的满足常规渲染需求的顶点着色器和像素点着色器;
[0039]着色器的入口接收上层着色器传来的数据流,内部进行处理,出口的数据流的格式可根据不同情况,不一定会和入口的数据流的格式一样,可以增加新的元素,也可以减少。
[0040]这里的两个着色器,是指引擎创建的DireCt3DllShader对象,所谓“设置”是将该两个着色器作为Direct3D 11渲染所需的顶点着色器和像素点着色器来使用。
[0041 ] 105)三维图元接收:
[0042]提供一个指向回调函数地址的函数指针,将该指针与调用本引擎的用户程序的全局函数绑定后,在引擎内部调用该函数指针,就实现了调用绑定的全局函数;
[0043]106)场景原始图和高光信息渲染:由顶点着色器和像素点着色器完成;要渲染的三维图元是由图元基类模块205得到的类实例对象图元;
[0044]第一步,顶点着色器完成如下步骤:
[0045]首先,对输入过来的三维模型的顶点数据依次进行世界矩阵、摄像机矩阵、投影矩阵这三个矩阵的变换,得到三维空间中的顶点在计算机屏幕上的位置;
[0046]如果启用了法线贴图,则计算每个顶点所对应的切向量空间矩阵;如果启用了环境映射贴图,则计算每个顶点对应的球面空间纹理的三维坐标;
[0047]最后,将上述计算的结果数据和顶点中包含的纹理漫反射信息、UV信息传递给像素点着色器;
[0048]UV信息是纹理取样参数,范围[0,I],表示在纹理取样中的取样点的位置信息。UV是指Uv纹理贴图坐标的简称,它定义了图片上每个点的位置的信息,这些点与3D模型是相互联系的,以决定表面纹理贴图的位置。
[0049]第二步,像素点着色器接收顶点着色器处理过的数据流,然后完成如下步骤:
[0050]首先,根据像素点与观察者之间的距离,计算出雾效果的权重:距离大于雾的远阈值,该权重值为I,像素点的颜色值直接用雾的颜色值;如果距离小于雾的近阈值,该权重值为O,像素点不受雾的影响;如果距离在雾的远阈值和近阈值之间,像素点的颜色A = D X (1-Q) +Q X F。Q表示雾的权重系数,在雾的雾的远阈值和近阈值之间线性变化,最远处为I,最近处为O,F表示雾的颜色,D表示像素原先的颜色值。
[0051]然后,由光照方向和三角面的法线方向,计算出初始光照值;如果启用了法线贴图,则由在该像素点切向量空间的光照角度和法线来计算初始光照值;
[0052]由步骤101)计算出的场景三维图元的深度值,判定该像素点是否处于阴影的遮罩;该遮罩值在[0,1]之间,如果是I,表示该像素点不在阴影中,如果是0,表示在阴影中,如果是O到I之间表示处于半阴影区。在阴影区中的像素的光照只由环境光照值提供,不考虑漫反射的光照值。非阴影区中像素点的光照值由环境光照和漫反射的光照值相加得到。半阴影区的光照由漫反射光照乘以遮罩值加上环境光照得到。
[0053]由像素点对应的纹理UV值进行纹理采样,得到对应的纹理色彩ARGB数值(rgba是代表Red红、Green绿、Blue蓝和Alpha透明程度);
[0054]如果启用了透明测试,则判断该像素点的透明度是否满足设定阈值条件,如果小于预设定的阈值,则该像素点终止渲染,如果不小于预设定的阈值,则该像素点继续渲染;
[0055]如果没有启用透明测试则直接进入下一步;
[0056]最后,由前面计算出的光照值乘以采样ARGB值计算出最后的像素点的ARGB值,并送入到像素点混合器(是Direct3D 11中的一个渲染过程,各个像素点着色器渲染出的像素点进入此混合器进行混合处理,可以看做是Direct3D 11底层的一个渲染机制),同时将该像素点的高光光照值保存到Direct3D 11纹理中;
[0057]107)场景光照后处理:
[0058]对得到的光照值中的高光光照值使用光晕特效计算模块209进行处理,方法为:舍弃掉低于设定阈值的高光像素点,然后将记录高光像素点信息的Direct3Dll纹理向下取样,并做U、V方向上的高斯模糊,便得到高光光晕的特效图层;
[0059]高光光照值:由光源的高光的分量X被渲染物体材质的高光分量X光源的方向矢量X物体三角面的法线向量得到。
[0060]高光像素点:每个像素点记录了该点的高光光照值,格式是ARGB,在此处A始终设为I,然后取RGB三个量中的最大值和高光阈值比较,如果低于设定的阈值,那该点的RGB都设置为0.
[0061]步骤102)?步骤107)为一次摄像过程,这个过程最后渲染出以某个观察点为视角的三维场景渲染图;如果每帧的渲染需要做多个不同观察点的渲染图,则对应每个不同的观察点重复该摄像过程;
[0062]108)自定义三维图元及着色器的接收:
[0063]提供一个指向回调函数地址的函数指针,该函数指针与用户程序的全局函数绑定;
[0064]在被绑定的全局函数里加入用户自定义的三维图元和自定义的着色器,并配置好相应的三维图元的拓扑数据结构和渲染状态,以实现了用户自定的渲染需求;
[0065]109) 二维渲染状态设置:
[0066]设置二维渲染所需的渲染状态(渲染状态为剔除逆时针三角面的渲染、启用透明混合、禁用深度测试)和二维图元拓扑数据流的数据结构(数据结构包含屏幕二维空间的坐标、顶点的漫反射值、顶点纹理的UV),为二维图元的原始数据进入显卡的可编程管道流水线做前期的准备;
[0067]HO) 二维渲染着色器序列集设置:
[0068]绑定满足抬头显示模块203和多字符集文字模块204需求的顶点着色器和像素点着色器;
[0069]这里的两个着色器,是指引擎创建的DireCt3DllShader对象。“设置”是指将该两个着色器作为Direct3D 11渲染所需的顶点着色器和像素点着色器来使用。
[0070]111)二维的抬头显示和文字接收:
[0071]提供一个指向回调函数地址的函数指针,该函数指针与用户程序的全局函数绑定;
[0072]在被绑定的全局函数里加入抬头显示模块203和多字符集文字模块204的Draw方法,以实现二维图元在引擎里的渲染;
[0073]112)二维图元渲染:由顶点着色器和像素点着色器完成;二维图元是由抬头显示模块203、多字符集文字模块204定义出的类实例对象图元;
[0074]顶点着色器直接指定二位图元在屏幕上的尺寸和位置;
[0075]像素点着色器接收顶点着色器处理过的数据流,先由二维图元顶点的U、V信息来对像素点的纹理进行采样,得到每个像素点的ARGB值;再乘以顶点的ARGB值,最后得到显示在屏幕上二维图元的ARGB值;
[0076]上述步骤110)?步骤112)便是由用户程序的定时器调用的一次帧渲染过程,通过改变三维图元的空间位置、观察点位置的数据,在一秒内进行多次这样的渲染过程,便构成了三维的动画显示。
[0077]进一步的,所述图元基类模块205派生出渲染图元,这些渲染单元是由用户从图元基类模块派生出的、满足自己需求的自定义的渲染图元。
[0078]进一步的,所述图元基类模块205生成广告板模块206、网格模型模块207和/或烟雾、雨雪粒子系统模块208。
[0079]进一步的,所述步骤105)中,在调用本引擎的上层客户端的全局函数里写出通过引擎默认图元基类模块205生成,或用户从图元基类模块205派生出的三维图元的Draw方法,以实现该三维图元在本引擎里的渲染。
[0080]Direct3D发展至今,最新的版本为12。本发明使用11的版本进行封装主要考虑点是Direct3D 11的功能强大,比之前的版本渲染效率更高,支持HLSL5.0的规范,而且平台适应性广,它在Windows7,Windows8,WindowlO的平台上都可以运行,另外Direct3D 11的硬件兼容性强,目前主流的显卡都支持Direct3D 11。
[0081]本发明的有益效果是:
[0082]1、只用少数代码变能快速地搭建Direct3D 11渲染的程序上下文环境和创建并初始化不同的功能性子模块,极大地降低使用Direct3D 11开发三维图形软件程序员的门槛,对于熟悉Direct3D 11的开发者也能方便快速地使用引擎所提供的各种功能,加快项目的开发进度,降低项目的开发成本。
[0083]2、引擎内部构建了一套默认的着色器序列集和HLSL着色器脚本集,满足最常用的渲染需求,用户无需考虑底层着色器的编写细节。同时也支持用户自定义着色器在引擎内部的调用,既满足了通用的渲染需求,也支持自定义的特殊渲染需求。
[0084]3、使用面向对象的方法,对所需渲染的图元进行了抽象,设计了本引擎默认的图元基类模块205,客户派生该图元基类模块205便可以构建自定义的图元,在引擎创建和渲染该图元的过程中,我们无需考虑更多的细节,并可以通过引擎所提供的接口对这些图元的属性和相关资源进行读取或者改写,灵活方便。
[0085]4、本引擎结构合理,占用计算机资源少,充分发挥了 Direct3D 11强大的渲染功能,引擎的运彳丁效率尚。
[【附图说明】]
[0086]图1为本发明的三维渲染引擎工作流程图
[0087]图2为本发明的三维渲染引擎功能模块结构示意图
[【具体实施方式】]
[0088]下面结合附图与本发明的实施方式作进一步详细的描述:
[0089]如图2,本发明的基于Direct3D11的三维图形渲染引擎,包括总体控制模块200和多个功能性子模块;
[0090]所述总体控制模块控制:引擎初始化、渲染工作和销毁;开启每帧的渲染;与调用本引擎的用户程序进行数据的交互;创建和销毁本引擎里不同的功能性子模块;
[0091]所述总体控制模块包括:着色器序列集、HLSL着色器脚本集、维护和管理引擎所生成的数据以及资源,并提供了常用的工具集(例如,这些工具集包括:比如不同着色器的创建工具;着色器脚本编译工具;由尺寸大小或者由位图文件地址创建Direct3D 11纹理的工具;Direct3D 11纹理填充工具,可以由指定的颜色、DLL资源中的位图数据、位图的句柄(HBITMAP)等不同方式填充纹理的内容等);
[0092]所述功能性子模块是从渲染需求出发,结合面向对象的思路进行构建;功能性子模块包括:矩阵模块201、视角模块202、抬头显示模块203、多字符集文字模块204、三维图元基类模块205、光晕特效计算模块209和软阴影计算模块210;
[0093]所述矩阵模块201属于图元基类模块205的一个对象属性;所述矩阵模块201包括世界矩阵、摄像机矩阵和投影矩阵。
[0094]如图1,本引擎的工作流程,步骤如下:
[0095]100)引擎初始化:总体控制模块200负责初始化三维渲染引擎的上下文环境,生成引擎的Direct3D 11的设备指针和渲染缓冲区交换链,定义了引擎默认的图元拓扑数据流结构,构建了引擎通用的顶点着色器、像素点着色器、阴影计算着色器、高光计算着色器、光照后处理着色器等,并且引擎内部预先加载了 HLSL5.0的着色器脚本集供上述的着色器对象使用。
[0096]由上层应用程序设置的定时器来每秒钟调用多次的渲染过程,每次渲染的结果作为三维动画的显示帧。
[0097]101)阴影深度图计算:根据场景中的光源由软阴影计算模块210计算相应的三维图元的深度值,并保存到对应的Direct3D 11纹理表面,不同的光源对应不同的纹理表面。本引擎最多同时支持8个不同的光源。
[0098]102)场景视角设置:由视角计算模块202设置场景中摄像机的位置。
[0099]103)三维渲染状态设置:设置渲染所需的渲染状态和三维图元拓扑数据流的数据结构,为三维图元的原始数据进入显卡的可编程管道流水线做前期的准备。
[0100]104)三维渲染着色器序列集设置:设置了本引擎构建的满足常规渲染需求的顶点着色器和像素点着色器。
[0101]105)三维图元接收:提供一个指向回调函数地址的函数指针,将该指针与调用本引擎的上层客户端的全局函数绑定后,在引擎内部调用该函数指针,便实现了对绑定的上层客户端全局函数的调用。我们在该全局函数里写出通过引擎默认图元模块生成或从引擎图元基类模块205派生出的三维图元的Draw方法,变可以方便的实现该三维图元在引擎里的渲染。
[0102]106)场景原始图和高光信息渲染:由引擎构建的满足三维图元渲染需求的顶点着色器和像素点着色器组成。在此过程中要渲染的三维图元可以是由广告板模块206、网格模型模块207、烟雾、雨雪例子系统模块208定义出的类实例对象图元,或者是用户派生图元基类模块205得到的类实例对象图元。该顶点着色器的主要功能是将从输入装配阶段传递过来的三维模型的顶点数据依次进行世界矩阵、摄像机矩阵、投影矩阵这三个矩阵的变换,可得到三维空间中的顶点在计算机屏幕上的位置;计算三维图元弯曲矩阵对每个顶点的影响权重值;如果启用了法线贴图,计算每个顶点所对应的切向量空间矩阵;如果启用了环境映射贴图,计算每个顶点对应的球面空间纹理的三维坐标;最后将上述计算的数据结果和顶点中包含的纹理漫反射信息、UV信息传递给随后的像素点着色器。该像素点着色器主要功能是接收顶点着色器处理过的数据流,并做如下工作:根据像素点距观察者的距离计算出雾效果的权重;由光照方向和三角面的法线方向,计算出初始光照值,如启用了法线贴图,则由在该像素点切向量空间的光照角度和法线计算初始光照值;由之前计算出的场景三维图元的深度信息,判定该点是否处于阴影的遮罩;由像素点对应的纹理UV值进行纹理采样,得到对应的纹理色彩RGBA数值;如果启用了透明测试,则判断该点的透明度是否满足设定阈值条件,如果小于预设定的阈值,则该像素点终止渲染;最后结合上述的光照和采样RGBA值和环境光照,计算出最后的像素点的RGBA值,送入到像素点混合器,同时将该像素点的高光光照值保存到Direct3D 11纹理中。
[0103]107)场景光照后处理:对上个步骤得到的高光光照值使用光晕特效计算模块209进行处理,舍弃掉低于设定阈值的高光像素点,然后将记录高光像素点信息的Direct3D 11纹理向下取样、并分别做UV方向上的高斯模糊,便得到高光光晕的特效图层。
[0104]步骤102)?步骤107),作为一次摄像过程,这个过程最后渲染出以某个观察点为视角的三维场景渲染图,如果每帧的渲染需要做多个不同观察点的渲染图,可以对应每个不同的观察点重复该摄像过程。
[0105]108)自定义三维图元和着色器接收:提供一个指向回调函数地址的函数指针,与上层客户端调用程序的全局函数绑定机理如步骤106)所述。在该被绑定的全局函数里可加入用户自定义的三维图元和自定义的着色器,并配置好相应的三维图元的拓扑数据结构和渲染状态,从而可以完成客户自定的渲染需求。
[0106]109) 二维渲染状态设置:设置二维渲染所需的渲染状态和二维图元拓扑数据流的数据结构,为二维图元的原始数据进入显卡的可编程管道流水线做前期的准备。
[0107]110) 二维渲染着色器序列集设置:设置了满足抬头显示模块和文字模块渲染需求的顶点着色器和像素点着色器。
[0108]111) 二维的抬头显示和文字接收:提供一个指向回调函数地址的函数指针,与上层客户端调用程序的全局函数绑定机理如步骤106)所述。在该被绑定的全局函数里可加入抬头显示模块和文字模块的Draw方法,变可以方便的实现该二维图元在引擎里的渲染。
[0109]112) 二维图元渲染:包含引擎构建的满足二维图元渲染需求的顶点着色器和像素点着色器。此处可以渲染的二维图元可以是由抬头显示模块203、多字符集文字模块204定义出的类实例对象图元。该顶点着色器的主要功能是直接指定二位图元在屏幕上的尺寸和位置。该像素点着色器的主要功能是由二维图元顶点的UV信息对其绑定的纹理进行采样,得到每个像素点的RGBA值,再结合顶点的透明值进行加权计算得到最后显示在屏幕上二维图元的RGBA值。
[0110]上述步骤110)?步骤112)便是由应用程序定时器单元调用的一次帧渲染过程,通过改变三维图元的空间位置、观察点位置的数据,在一秒内进行多次这样的渲染过程,便构成了三维的动画显示。
【主权项】
1.一种基于Direct3D 11的三维图形渲染引擎,其特征是包括总体控制模块和多个功能性子模块; 所述总体控制模块控制:引擎初始化、渲染工作和销毁;开启每帧的渲染;与调用本引擎的用户程序进行数据的交互;创建和销毁本引擎里不同的功能性子模块; 所述总体控制模块包括:着色器序列集、HLSL着色器脚本集、维护和管理引擎所生成的数据以及资源,并提供了常用的工具集; 所述功能性子模块是从渲染需求出发,结合面向对象的思路进行构建;功能性子模块包括:矩阵模块、视角模块、抬头显示模块、多字符集文字模块、三维图元基类模块、光晕特效计算模块和软阴影计算模块; 所述矩阵模块属于图元基类模块的一个对象属性;所述矩阵模块包括世界矩阵、摄像机矩阵和投影矩阵; 本引擎对每一帧的默认渲染过程,包括如下步骤: 首先调用软阴影计算模块,以光照的方向为视角计算出渲染场景中各个图元的深度信息; 随后以观察者眼睛的视线为角度,把场景中各个图元渲染到渲染表面,得到原始场景视图,同时得到高光的信息;再根据深度信息和光照计算结果,得出每个像素点的实际照明效果; 最后结合第一次和深度信息和高光信息,对原始场景视图进行光照的高光光晕特效后处理,得到最终的单帧渲染图。2.根据权利要求1所述的三维图形渲染引擎,其特征是本引擎的工作流程,步骤如下: 100)引擎初始化: 总体控制模块初始化三维渲染引擎的上下文环境,生成引擎的Direct3D 11的设备指针和渲染缓冲区交换链,定义引擎默认的图元拓扑数据流结构,构建了通用的顶点着色器、像素点着色器、阴影计算着色器、高光计算着色器和光照后处理着色器;加载了 HLSL5.0的着色器脚本集供各个着色器对象使用; 由用户程序设置的定时器来每秒钟调用多次的渲染过程,每次渲染的结果作为三维动画的显示帧; 101)阴影深度图计算: 根据场景中的光源,由软阴影计算模块计算相应的三维图元的深度值,并保存到对应的Direct3D 11纹理表面;不同的光源对应不同的纹理表面; 102)场景视角设置: 由视角计算模块设置场景中摄像机的位置; 103)三维渲染状态设置: 设置渲染所需的渲染状态和三维图元拓扑数据流的数据结构,为三维图元的原始数据进入显卡的可编程管道流水线做前期的准备; 104)三维渲染着色器序列集设置: 绑定本引擎构建的满足常规渲染需求的顶点着色器和像素点着色器; 105)三维图元接收: 提供一个指向回调函数地址的函数指针,将该指针与调用本引擎的用户程序的全局函数绑定后,在引擎内部调用该函数指针,就实现了调用绑定的全局函数; 106)场景原始图和高光信息渲染:由顶点着色器和像素点着色器完成;要渲染的三维图元是由图元基类模块得到的类实例对象图元; 第一步,顶点着色器完成如下步骤: 首先,对输入过来的三维模型的顶点数据依次进行世界矩阵、摄像机矩阵、投影矩阵这三个矩阵的变换,得到三维空间中的顶点在计算机屏幕上的位置; 如果启用了法线贴图,则计算每个顶点所对应的切向量空间矩阵;如果启用了环境映射贴图,则计算每个顶点对应的球面空间纹理的三维坐标; 最后,将上述计算的结果数据和顶点中包含的纹理漫反射信息、UV信息传递给像素点着色器; 第二步,像素点着色器接收顶点着色器处理过的数据流,然后完成如下步骤: 首先,根据像素点与观察者之间的距离,计算出雾效果的权重: 如果距离大于雾的远阈值,该权重值为I,像素点的颜色值直接用雾的颜色值; 如果距离小于雾的近阈值,该权重值为0,像素点的颜色值不受雾的影响; 如果距离在雾的远阈值和近阈值之间,像素点的颜色A = DX (1_Q)+QXF;其中,Q表示雾的权重系数,在雾的远阈值和近阈值之间线性变化,最远处为I,最近处为O,F表示雾的颜色,D表示像素原先的颜色值; 然后,由光照方向和三角面的法线方向,计算出初始光照值;如果启用了法线贴图,则由在该像素点切向量空间的光照角度和法线来计算初始光照值; 由步骤101)计算出的场景三维图元的深度值,判定该像素点是否处于阴影的遮罩;该遮罩的值在[0,I]之间,如果是I,表示该像素点不在阴影中,如果是0,表示在阴影中,如果是O到I之间表示处于半阴影区; 在阴影区中的像素的光照值只由环境光照值提供,不考虑漫反射的光照值; 非阴影区中像素点的光照值由环境光照值和漫反射的光照值相加得到; 半阴影区的光照由漫反射光照乘以遮罩值加上环境光照值得到; 由像素点对应的纹理UV值进行纹理采样,得到对应的纹理色彩ARGB数值; 如果启用了透明测试,则判断该像素点的透明度是否满足设定阈值条件,如果小于预设定的阈值,则该像素点终止渲染,如果不小于预设定的阈值,则该像素点继续渲染; 如果没有启用透明测试则直接进入下一步; 最后,由前面计算出的光照值乘以采样ARGB值计算出最后的像素点的ARGB值,并送入到像素点混合器,同时将该像素点的高光光照值保存到Direct3D 11纹理中; 107)场景光照后处理: 对得到的光照值中的高光光照值使用光晕特效计算模块进行处理,方法为:舍弃掉低于设定阈值的高光像素点,然后将记录高光像素点信息的Direct3D 11纹理向下取样,并做U、V方向上的高斯模糊,便得到高光光晕的特效图层; 步骤102)?步骤107)为一次摄像过程,这个过程最后渲染出以某个观察点为视角的三维场景渲染图;如果每帧的渲染需要做多个不同观察点的渲染图,则对应每个不同的观察点重复该摄像过程; 108)自定义三维图元及着色器的接收: 提供一个指向回调函数地址的函数指针,该函数指针与用户程序的全局函数绑定; 在被绑定的全局函数里加入用户自定义的三维图元和自定义的着色器,并配置好相应的三维图元的拓扑数据结构和渲染状态,以实现了用户自定的渲染需求; 109)二维渲染状态设置: 设置二维渲染所需的渲染状态和二维图元拓扑数据流的数据结构,为二维图元的原始数据进入显卡的可编程管道流水线做前期的准备; 110)二维渲染着色器序列集设置: 绑定满足抬头显示模块和多字符集文字模块需求的顶点着色器和像素点着色器; 111)二维的抬头显示和文字接收: 提供一个指向回调函数地址的函数指针,该函数指针与用户程序的全局函数绑定; 在被绑定的全局函数里加入抬头显示模块和多字符集文字模块的Draw方法,以实现二维图元在引擎里的渲染; 112)二维图元渲染:由顶点着色器和像素点着色器完成;二维图元是由抬头显示模块、多字符集文字模块定义出的类实例对象图元; 顶点着色器直接指定二位图元在屏幕上的尺寸和位置; 像素点着色器接收顶点着色器处理过的数据流,先由二维图元顶点的U、V信息来对像素点的纹理进行采样,得到每个像素点的ARGB值;再乘以顶点的ARGB值,最后得到显示在屏幕上二维图元的ARGB值; 上述步骤110)?步骤112)便是由用户程序的定时器调用的一次帧渲染过程,通过改变三维图元的空间位置、观察点位置的数据,在一秒内进行多次这样的渲染过程,便构成了三维的动画显示。3.根据权利要求1或2所述的三维图形渲染引擎,其特征是所述图元基类模块派生出渲染图元,这些渲染单元是由用户从图元基类模块派生出的、满足自己需求的自定义的渲染图元。4.根据权利要求1或2所述的三维图形渲染引擎,其特征是所述图元基类模块生成广告板模块、网格模型模块和/或烟雾、雨雪粒子系统模块。5.根据权利要求1或2所述的三维图形渲染引擎,其特征是所述步骤105)中,在调用本引擎的上层客户端的全局函数里写出通过引擎默认图元基类模块生成,或用户从图元基类模块派生出的三维图元的Draw方法,以实现该三维图元在本引擎里的渲染。
【文档编号】G06T15/06GK106056661SQ201610375582
【公开日】2016年10月26日
【申请日】2016年5月31日
【发明人】钱进, 费建芳, 黄小刚, 程小平
【申请人】钱进, 费建芳, 黄小刚, 程小平
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1