CN105701854B - 一种3d渲染方法、装置及引擎 - Google Patents
一种3d渲染方法、装置及引擎 Download PDFInfo
- Publication number
- CN105701854B CN105701854B CN201610004878.1A CN201610004878A CN105701854B CN 105701854 B CN105701854 B CN 105701854B CN 201610004878 A CN201610004878 A CN 201610004878A CN 105701854 B CN105701854 B CN 105701854B
- Authority
- CN
- China
- Prior art keywords
- parameter
- effect
- shader
- directx
- unique identifier
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06T—IMAGE DATA PROCESSING OR GENERATION, IN GENERAL
- G06T15/00—3D [Three Dimensional] image rendering
- G06T15/005—General purpose rendering architectures
Landscapes
- Engineering & Computer Science (AREA)
- Computer Graphics (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Theoretical Computer Science (AREA)
- Image Generation (AREA)
Abstract
本发明公开了一种基于DirectX Effect系统的3D渲染方法,包括步骤:S1、在调用DrawCall对当前画面的物体进行渲染时,根据预置的映射表获取3D引擎内存中的所述物体的参数值所对应的shader参数索引值;其中,所述映射表中记录有DirectX Effect系统的Effect参数名与shader参数索引值的映射关系,且所述3D引擎内存中的每一物体的参数值设有对应的Effect参数名;S2、将所述3D引擎内存中的所述物体的参数值拷贝到所述shader参数索引值所对应的驱动内存中。本发明还公开了一种基于DirectX Effect系统的3D渲染装置及3D游戏引擎。
Description
技术领域
本发明涉及图像处理技术领域,尤其涉及一种基于DirectX Effect系统的3D渲染方法、装置以及3D游戏引擎。
背景技术
3D引擎需要有各种渲染效果(Effect),比如方向光、点光、阴影等等这些基础效果,又比如中毒、冰冻、隐身这些游戏中特殊渲染效果。
实现渲染效果的最底层技术就是Shader,这是一种直接运行在显卡GPU上的程序,一般效果都会由顶点Shader与像素Shader组成,负责整个渲染流程的不同功能。
Shader的输入包括顶点、贴图与参数,当Shader程序确定功能之后,用户改变这些输入就可以显示出不同的画面表现。顶点决定渲染物体的形状,贴图决定渲染物体的基本颜色与纹理,参数则最终决定各种特殊效果的具体表现,比如方向光效果的方向参数决定物体的明暗面朝向、隐身效果的Alpha参数决定了物体透明的程度。
游戏画面每一次渲染即为一次GPU DrawCall。每一次DrawCall对应着一个Effect、一套Shader,还对应着渲染物体的顶点、贴图、参数。DrawCall是GPU进行渲染的最基础调用。一帧3D画面的DrawCall数量与画面中的物体数量成正比,简单的物体只有一次DrawCall,复杂的物体可能有多次DrawCall。
3D引擎可能有非常多的渲染效果,这么多的效果不可能都写在引擎代码里,因此Effect的描述需要在引擎之外去定义。引擎提供一个基础的框架系统,支持用户去扩展各种渲染效果。
Effect系统是底层Shader与各种输入数据之间的桥梁,Effect系统定义了Effect文件。Effect文件是一种用户可阅读和修改的描述文本,它要描述Shader代码本身,它要定义顶点的格式,它要定义这个效果需要多少贴图,最后还要描述各种Shader参数的定义,一般的Effect都会带有几个到几十个参数。而Effect系统具体的主要功能有两个:1)在引擎加载模块中解释Effect文件中各种输入数据的定义,2)在引擎渲染模块中高效的把各种渲染输入数据传递到底层的Shader。
现有3D引擎的Effect系统,一般有两种实现选择:
1)直接使用DirectX(Direct eXtension,简称DX)的Effect系统,这是微软在DirectX中已经实现的一套Effect系统。优点是此系统直接可用且Effect文件格式比较通用,缺点就是无源码,不够灵活,性能方向只能说勉强够用,真的要做极限的优化还有一段距离。这种方案在很多游戏公司自研端游引擎中比较常见。
2)自己实现一套Effect系统。由于微软DirectX不是跨平台的,因此当3D引擎有跨平台的需求时,引擎开发者会自己实现一套Effect系统。这个方案的优点当然就是灵活、有需要可以自行修改,缺点是开发成本比较大,因为Effect文件是一种比较复杂的描述文本,基本就是一套简化的编程语言,解释难度比较大。
发明内容
经工程测试研究发现,DirectX Effect系统的功能性方面做得还是不错的,引擎没有跨平台需求时是比较好的选择,唯一的问题就是它的运行性能离理想情况还有不少距离。当前大型3D游戏需要渲染大量的物体,而每个物体Shader越来越复杂,参数越来越多,它的性能问题会更突出一些,因为Effect系统的运行消耗,基本上就是与DrawCall和Shader参数数量这两个数值成正比。
再具体来说,DirectX Effect的Shader参数设置方案是最大的性能问题所在。由于它会把所有物体参数记录在它内部的内存中,因此这样会使整个渲染流程多一次内存的拷贝。即存在DirectX Effect系统时,会先将物体参数从引擎内存拷贝到DirectX Effect系统的内存,然后再从DirectX Effect系统的内存拷贝到Shader的驱动内存。
性能方面的另一个问题,是参数设置数量的问题,3D引擎的渲染中,有些物体参数是全局的,比如整个场景的灯光方向,对于每一个DrawCall都是固定的。如果DirectXEffect系统能有效利用这些信息,就能减少参数的设置数量,最终做到只设置每个DrawCall都不一样的参数。但很可惜现有的DirectX Effect系统并没有提供这种参数设置优化,它只会把整个Effect的所有参数在调用DrawCall的时候全部重设一次。这两个问题叠加起来,就会使得现有的DirectX Effect系统的DrawCall消耗比较大,而且基本都是消耗在参数的内存拷贝上。
因此在为了成本考虑不自行实现一套Effect的前提下,有必要找一种DirectXEffect的运行优化方案,减少这些Effect参数的拷贝,提升3D引擎的渲染效率。
为实现上述目的,本发明提供一种基于DirectX Effect系统的3D渲染方法、装置及引擎,能够有效解决DirectX Effect系统的运行性能问题,提高渲染效率。
本发明实施例提供了一种基于DirectX Effect系统的3D渲染方法,包括步骤:
S1、在调用DrawCall对当前画面的物体进行渲染时,根据预置的映射表获取3D引擎内存中的所述物体的参数值所对应的shader参数索引值;其中,所述映射表中记录有DirectX Effect系统的Effect参数名与shader参数索引值的映射关系,且所述3D引擎内存中的每一物体的参数值设有对应的Effect参数名;
S2、将所述3D引擎内存中的所述物体的参数值拷贝到所述shader参数索引值所对应的驱动内存中。
作为上述方案的改进,所述映射表具体通过以下方式预先得到:
为DirectX Effect系统中的每一Effect参数名设置对应的唯一识别码,并记录Effect参数名与唯一识别码的映射关系;其中,每一所述唯一识别码作为对应的Effect参数名的参数值;
将所述唯一识别码拷贝到shader的驱动内存中以进行Effect参数设置,使所述DirectX Effect系统产生shader级别的API回调;
在所述API回调中获取shader参数索引值及对应的shader参数值;其中,所述shader参数值与所述唯一识别码一一对应;
基于所述shader参数值与所述唯一识别码的对应关系以及所述Effect参数名与唯一识别码的映射关系,得到所述Effect参数名与shader参数索引值的映射关系。
作为上述方案的改进,所述方法还包括步骤:
S3、若当前画面的所有物体渲染完成,则将渲染完成后的当前画面输出,否则返回步骤S1。
作为上述方案的改进,所述画面为游戏画面。
本发明实施例还提供了一种基于DirectX Effect系统的3D渲染方法,包括步骤:
S1、在调用DrawCall对当前画面的物体进行渲染时,根据预置的映射表获取3D引擎内存中的所述物体的参数值所对应的shader参数索引值;其中,所述映射表中记录有DirectX Effect系统的Effect参数名与shader参数索引值的映射关系,且所述3D引擎内存中的每一物体的参数值设有对应的Effect参数名;
S2、根据所述物体的参数名判断对应的参数值是否为全局Effect参数值,若在判断为是全局Effect参数值并且非首次对当前画面调用DrawCall时,返回执行步骤S1,否则执行步骤S3;其中,所述全局参数值是指同一场景中所有物体都相同的参数值;
S3、将所述3D引擎内存中的所述物体的参数值拷贝到所述shader参数索引值所对应的驱动内存中。
作为上述方案的改进,所述映射表具体通过以下方式预先得到:
为DirectX Effect系统中的每一Effect参数名设置对应的唯一识别码,并记录Effect参数名与唯一识别码的映射关系;其中,每一所述唯一识别码作为对应的Effect参数名的参数值;
将所述唯一识别码拷贝到shader的驱动内存中以进行Effect参数设置,使所述DirectX Effect系统产生shader级别的API回调;
在所述API回调中获取shader参数索引值及对应的shader参数值;其中,所述shader参数值与所述唯一识别码一一对应;
基于所述shader参数值与所述唯一识别码的对应关系以及所述Effect参数名与唯一识别码的映射关系,得到所述Effect参数名与shader参数索引值的映射关系。
作为上述方案的改进,所述方法还包括步骤:
S4、若当前画面的所有物体渲染完成,则将渲染完成后的当前画面输出,否则返回步骤S1。
作为上述方案的改进,所述画面为游戏画面。
本发明实施例对应提供了一种基于DirectX Effect系统的3D渲染装置,包括:
shader参数索引值获取模块,用于在调用DrawCall对当前画面的物体进行渲染时,根据预置的映射表获取3D引擎内存中的所述物体的参数值所对应的shader参数索引值;其中,所述映射表中记录有DirectX Effect系统的Effect参数名与shader参数索引值的映射关系,且所述3D引擎内存中的每一物体的参数值设有对应的Effect参数名;
参数设置模块,用于将所述3D引擎内存中的所述物体的参数值拷贝到所述shader参数索引值所对应的驱动内存中。
作为上述方案的改进,所述映射表具体通过以下方式预先得到:
为DirectX Effect系统中的每一Effect参数名设置对应的唯一识别码,并记录Effect参数名与唯一识别码的映射关系;其中,每一所述唯一识别码作为对应的Effect参数名的参数值;
将所述唯一识别码拷贝到shader的驱动内存中以进行Effect参数设置,使所述DirectX Effect系统产生shader级别的API回调;
在所述API回调中获取shader参数索引值及对应的shader参数值;其中,所述shader参数值与所述唯一识别码一一对应;
基于所述shader参数值与所述唯一识别码的对应关系以及所述Effect参数名与唯一识别码的映射关系,得到所述Effect参数名与shader参数索引值的映射关系。
作为上述方案的改进,所述装置还包括:
输出模块,用于在当前画面的所有物体渲染完成后,将当前画面输出。
作为上述方案的改进,所述画面为游戏画面。
本发明实施例对应提供了一种基于DirectX Effect系统的3D渲染装置,包括:
shader参数索引值获取模块,用于在调用DrawCall对当前画面的物体进行渲染时,根据预置的映射表获取3D引擎内存中的所述物体的参数值所对应的shader参数索引值;其中,所述映射表中记录有DirectX Effect系统的Effect参数名与shader参数索引值的映射关系,且所述3D引擎内存中的每一物体的参数值设有对应的Effect参数名;
判断模块,根据所述物体的参数名判断对应的参数值是否为全局Effect参数值;其中,所述全局参数值是指同一场景中所有物体都相同的参数值;
参数设置模块,用于在所述shader参数索引值获取模块首次对当前画面调用DrawCall时或判断模块判断为否时,将所述3D引擎内存中的所述物体的参数值拷贝到所述shader参数索引值所对应的驱动内存中。
作为上述方案的改进,所述映射表具体通过以下方式预先得到:
为DirectX Effect系统中的每一Effect参数名设置对应的唯一识别码,并记录Effect参数名与唯一识别码的映射关系;其中,每一所述唯一识别码作为对应的Effect参数名的参数值;
将所述唯一识别码拷贝到shader的驱动内存中以进行Effect参数设置,使所述DirectX Effect系统产生shader级别的API回调;
在所述API回调中获取shader参数索引值及对应的shader参数值;其中,所述shader参数值与所述唯一识别码一一对应;
基于所述shader参数值与所述唯一识别码的对应关系以及所述Effect参数名与唯一识别码的映射关系,得到所述Effect参数名与shader参数索引值的映射关系。
作为上述方案的改进,所述装置还包括:
输出模块,用于在当前画面的所有物体渲染完成后,将当前画面输出。
作为上述方案的改进,所述画面为游戏画面。
本发明实施例还提供了一种3D游戏引擎,包括如上所述的基于DirectX Effect系统的3D渲染装置。
与现有技术相比,本发明公开的基于DirectX Effect系统的3D渲染方法、装置以及3D游戏引擎在调用DrawCall对当前画面的物体进行渲染时,根据预置的记录DirectXEffect系统中的Effect参数名与shader参数索引值的映射关系的的映射表,获取3D引擎内存中的所述物体的参数值所对应的shader参数索引值,并将所述3D引擎内存中的所述物体的参数值拷贝到所述shader参数索引值所对应的驱动内存中。因此,与现有技术中的DirectX Effect系统的两次内存拷贝相比,本发明通过一次内存拷贝即可实现将物体的参数值拷贝到Shader参数索引值对应的驱动层内存,从而比现有技术的DirectX Effect系统减少了一次内存拷贝,从而提升了3D引擎的渲染效率。
附图说明
图1是本发明实施例1中一种基于DirectX Effect系统的3D渲染方法的流程示意图。
图2是本发明实施例1中一种基于DirectX Effect系统的3D渲染方法的映射表预置的流程示意图。
图3是本发明实施例1中一种基于DirectX Effect系统的3D渲染方法的回调机制示意图。
图4是本发明实施例2中一种基于DirectX Effect系统的3D渲染方法的流程示意图。
图5是本发明实施例3中一种基于DirectX Effect系统的3D渲染装置的结构框图。
图6是本发明实施例4中一种基于DirectX Effect系统的3D渲染装置的结构框图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
参见图1,是本发明实施例提供的一种基于DirectX Effect系统的3D渲染方法的流程示意图。该方法包括步骤S1~S4:
S11、在调用DrawCall对当前画面的物体进行渲染时,根据预置的映射表获取3D引擎内存中的所述物体的参数值所对应的shader参数索引值;其中,所述映射表中记录有DirectX Effect系统的Effect参数名与shader参数索引值的映射关系,且所述3D引擎内存中的每一物体的参数值设有对应的Effect参数名;
S12、将所述3D引擎内存中的所述物体的参数值拷贝到所述shader参数索引值所对应的驱动内存中;
S13、若当前画面的所有物体渲染完成,则将渲染完成后的当前画面输出,否则返回步骤S11。
其中,参考图2,所述映射表具体通过以下方式预先得到:
S101、为DirectX Effect系统中的每一Effect参数名设置对应的唯一识别码,并记录Effect参数名与唯一识别码的映射关系;其中,每一所述唯一识别码作为对应的Effect参数名的参数值;
S102、将所述唯一识别码拷贝到shader的驱动内存中以进行Effect参数设置,使所述DirectX Effect系统产生shader级别的API回调;
S103、在所述API回调中获取shader参数索引值及对应的shader参数值;其中,所述shader参数值与所述唯一识别码一一对应;
S104、基于所述shader参数值与所述唯一识别码的对应关系以及所述Effect参数名与唯一识别码的映射关系,得到所述Effect参数名与shader参数索引值的映射关系。
优选的,本实施例优选对游戏画面进行渲染。可以理解的,每一个游戏场景包括不同时刻的帧画面。
具体的,本实施例在现有的DirectX Effect系统基础上进行改进,根据Shader编译后参数位置的确定性,利用DirectX Effect的回调机制,在Effect/Shader的编译完成之后进行Effect的模拟调用,并记录Effect参数名与Shader编译后参数位置(即shader参数索引值)的对应关系。然后在3D渲染运行期,利用记录下来的参数对应关系进行参数设置,最终完全接管Effect的参数设置过程,从而达到减少内存拷贝的目的。因此,本实施例包括1)离线生成Effect/Shader参数对应关系以及2)运行期参数设置两个过程:
1)离线生成Effect/Shader参数对应关系。
DirectX Effect系统中的Effect参数与所包含的Shader的参数必然有对应关系,通过DirectX Effect系统设置的Effect参数最终会设置到底层Shader参数中。由于Shader编译时参数位置的确定性,Shader编译后就能完全确定所有参数的位置(即参数索引值或索引号)。因此如果能在离线编译Shader时获得这些参数索引值,就能在运行期利用来优化参数设置。
DirectX Effect的运行库提供了一个回调功能,即Effcect参数设置调用最终会产生一个Shader级别的API回调,因此可以通过DirectX的API注册一个回调处理类,然后在回调处理类中,就能截获所有的Shader参数调用数据,包括Shader参数值与对应的Shader参数索引值,因此就能知道所有的Shader参数值与Shader参数索引值的对应关系。
例如,图3是从VisualStudio中截取出来的运行期调用栈,可清晰的看到这个流程(从下往上看):
1)3D引擎render.dll的EffectTechnique::AnalyzeState调用CEffect::BeginPass函数,开始进行参数设置,代码就进入了D3DX9_43.dll,即DirectX系统的dll;
2)CEffect内部进行了若干层的处理步骤,进行参数处理,最后调用到SetVertexShaderConstantF,进行Shader级别的参数设置;
3)D3DXEffects内部的SetVertexShaderConstantF产生一个回调,代码流程重新进入render.dll里,回到引擎注册的EffectStateAnalyzer回调处理类;
4)注意EffectStateAnalyzer::SetVertexShaderConstantB里接收到的参数有:index与data,这两个分别是Shader参数索引值与Shader参数值。
本实施例利用这个回调机制进行Shader参数分析。在第一步AnaylzeState之前,就把Effect的各个参数设置对应的唯一识别码,并把识别码与Effect参数名配对记录下来记为识别码参数表。然后,调用BeginPass进行Effect参数设置,使得DirectX内部产生回调,最后代码流程重新回到引擎代码EffectStateAnalyzer::SetVertexShaderConstantB时,通过函数参数data和index得到了之前设置的Shader参数值及对应Shader参数索引值,然后把Shader参数值与识别码参数表进行比较,由于每个Shader参数值都是一个唯一的识别码,必然可以匹配到应的Effect参数名。通过这种办法,Effect参数名->Effect参数值->Shader参数值->Shader参数索引值,就能一一对应起来,最终生成所需的对应信息:Effect参数名->Shader参数索引。这个对应信息是固定的数据,可以在Effect/Shader离线编译时记录下来,然后运行期加载回来也是正确的对应关系,能利用来做正确的Shader参数设置。
2)运行期参数设置。
当通过过程1)得到了足够的参数对应信息后,运行期的Effect参数设置就不难了。优选的,本方案重写了一个Effect运行库,提供与原DirectX Effect基本一致的参数设置函数。但Effect的实现进行了简化,变为只记录参数值的地址(即参数索引值)。当实际进行DrawCall时,由于已经有Effect参数名->Shader参数索引值的对应关系表,引擎层就可以直接调用底层的Shader设置函数,直接把物体的参数值从引擎的内存,拷贝到Shader参数索引值对应的的驱动层内存,从而比DirectX Effect减少了一次内存拷贝。
因此,本实施例公开的基于DirectX Effect系统的3D渲染方法通过在调用DrawCall对当前画面的物体进行渲染时,根据预置的记录DirectX Effect系统中的Effect参数名与shader参数索引值的映射关系的的映射表,获取3D引擎内存中的所述物体的shader参数值所对应的shader参数索引值,并将所述3D引擎内存中的所述物体的shader参数值拷贝到所述shader参数索引值所对应的驱动内存中。因此,与现有技术中的DirectXEffect系统的两次内存拷贝相比,本实施例通过一次内存拷贝即可实现将Shader参数值拷贝到Shader参数索引值对应的驱动层内存,从而比现有技术的DirectX Effect系统减少了一次内存拷贝,从而提升了3D引擎的渲染效率。
参考图4,是本发明实施例2中一种基于DirectX Effect系统的3D渲染方法的流程示意图。该方法包括步骤S21~S24:
S21、在调用DrawCall对当前画面的物体进行渲染时,根据预置的映射表获取3D引擎内存中的所述物体的参数值所对应的shader参数索引值;其中,所述映射表中记录有DirectX Effect系统的Effect参数名与shader参数索引值的映射关系,且所述3D引擎内存中的每一物体的参数值设有对应的Effect参数名;
S22、根据所述物体的参数名判断对应的参数值是否为全局Effect参数值,若在判断为是全局Effect参数值并且非首次对当前画面调用DrawCall时,返回执行步骤S21,否则执行步骤S23;其中,所述全局参数值是指同一场景中所有物体都相同的参数值;
S23、将所述3D引擎内存中的所述物体的参数值拷贝到所述shader参数索引值所对应的驱动内存中;
S24、若当前画面的所有物体渲染完成,则将渲染完成后的当前画面输出,否则返回步骤S21。
其中,所述映射表通过图2所示步骤预先得到,具体实现过程请参考实施例1。
优选的,本实施例优选对游戏画面进行渲染。可以理解的,每一个游戏场景包括不同时刻的帧画面。
本实施例的基于DirectX Effect系统的3D渲染方法在实施例1的基础进行了进一步的优化,将Effect参数进行分类,分为全局Effect参数和局部Effect参数。其中,所述全局Effect参数是指同一场景中所有物体都相同的参数值,例如,光照效果或雾气效果等。除了设定为全局Effect参数的其他参数即为局部Effect参数。也就是说,用户可以预先设定同一场景中哪种效果的参数作为全局Effect参数,即具体设定哪个参数名作为全局Effect参数。因此,在渲染期间,通过物体的参数名即可判断对应的物体参数值是否为全局Effect参数值。
根据预置的根据预置的映射表,由于所述映射表中记录有DirectX Effect系统的Effect参数名与shader参数索引值的映射关系,也就是说,通过所述映射表指定了不同的Effect参数名的固定存储位置(即shader参数索引值)。因此,对于全局Effect参数,由于同个场景的每个物体的全局Effect参数是一样的,因此在3D渲染运行期,只需要在每帧第一次DrawCall时进行Shader参数设置(即具体为将所述3D引擎内存中的所述物体的参数值拷贝到所述shader参数索引值所对应的驱动内存中),而接下来所有的DrawCall都可以省略相同的全局Effect参数的设置调用。而这些参数不进行设置时,驱动层的参数内存会一直保留在第一次设置时的参数值,由于不同DrawCall的全局Effect参数的Shader参数索引值都一样,所以第一次进行DrawCall时设置的参数值对于后面的DrawCall都会一直正确生效。因此,本实施例进一步减少了内存拷贝与底层API调用消耗,提升了渲染效率。
本实施例的其他实施过程可参考实施例1,在此不再赘述。
图5是本发明实施例3中一种基于DirectX Effect系统的3D渲染装置的结构框图。该装置包括:
shader参数索引值获取模块31,用于在调用DrawCall对当前画面的物体进行渲染时,根据预置的映射表获取3D引擎内存中的所述物体的shader参数值所对应的shader参数索引值;其中,所述映射表中记录有DirectX Effect系统的Effect参数名与shader参数索引值的映射关系,且所述3D引擎内存中的每一物体的shader参数值设有对应的Effect参数名;
参数设置模块32,用于将所述3D引擎内存中的所述物体的shader参数值拷贝到所述shader参数索引值所对应的驱动内存中。
输出模块33,用于在当前画面的所有物体渲染完成后,将当前画面输出。
其中,所述映射表通过图2所示步骤预先得到,具体实现过程请参考实施例1。
优选的,本实施例优选对游戏画面进行渲染。可以理解的,每一个游戏场景包括不同时刻的帧画面。
本实施例的工作过程和原理请参考实施例1,在此不再赘述。
图6是本发明实施例4中一种基于DirectX Effect系统的3D渲染装置的结构框图。该装置包括:
shader参数索引值获取模块41,用于在调用DrawCall对当前画面的物体进行渲染时,根据预置的映射表获取3D引擎内存中的所述物体的shader参数值所对应的shader参数索引值;其中,所述映射表中记录有DirectX Effect系统的Effect参数名与shader参数索引值的映射关系,且所述3D引擎内存中的每一物体的shader参数值设有对应的Effect参数名;
判断模块42,根据所述物体的参数名判断对应的shader参数值是否为全局Effect参数值;其中,所述全局参数值是指同一场景中所有物体都相同的参数值;
参数设置模块43,用于在所述shader参数索引值获取模块首次对当前画面调用DrawCall时或判断模块判断为否时,将所述3D引擎内存中的所述物体的shader参数值拷贝到所述shader参数索引值所对应的驱动内存中。
输出模块44,用于在当前画面的所有物体渲染完成后,将当前画面输出。
其中,所述映射表通过图2所示步骤预先得到,具体实现过程请参考实施例1。
优选的,本实施例优选对游戏画面进行渲染。可以理解的,每一个游戏场景包括不同时刻的帧画面。
本实施例的工作过程和原理请参考实施例2,在此不再赘述。
本发明还公开了一种3D游戏引擎。本实施例的3D游戏引擎包括如如图5或图6所示的DirectX Effect系统的3D渲染装置。
通过实施本发明,能够有效减少3D渲染中的参数内存拷贝消耗与底层显卡驱动API的调用消耗,提升DrawCall的执行效率,以及提升3D渲染的帧数。下面结合实际测试数据说明。
实测某个大型3D游戏,利用现有技术的DirectX Effect系统进行渲染,测试计算到Effect的消耗占整个游戏CPU消耗的13%。然后,利用本发明的基于DirectX Effect系统的3D渲染方法进行渲染时,实测Effect的消耗降低到3%。而游戏某个场景下的运行帧率,则从60帧提升到67帧。
另外,由于本发明是在原来的DirectX Effect系统基础上做的改进,不需要重写整个Effect系统,项目中各种现存的Effect文件/Shader都能完美兼容,美术人员/程序员也不需要再学习另一套Effect系统。因此本方案对使用DirectX Effect系统的3D引擎,能用最小的改造成本达到最有效的性能提升。
综上所述,本发明实施例公开的基于DirectX Effect系统的3D渲染方法、装置以及3D游戏引擎在调用DrawCall对当前画面的物体进行渲染时,根据预置的记录DirectXEffect系统中的Effect参数名与shader参数索引值的映射关系的的映射表,获取3D引擎内存中的所述物体的参数值所对应的shader参数索引值,并将所述3D引擎内存中的所述物体的参数值拷贝到所述shader参数索引值所对应的驱动内存中。因此,与现有技术中的DirectX Effect系统的两次内存拷贝相比,本发明通过一次内存拷贝即可实现将物体的参数值拷贝到Shader参数索引值对应的驱动层内存,从而比现有技术的DirectX Effect系统减少了一次内存拷贝,从而提升了3D引擎的渲染效率。
需说明的是,以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。另外,本发明提供的装置实施例附图中,模块之间的连接关系表示它们之间具有通信连接,具体可以实现为一条或多条通信总线或信号线。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
通过以上的实施方式的描述,所属领域的技术人员可以清楚地了解到本发明可借助软件加必需的通用硬件的方式来实现,当然也可以通过专用硬件包括专用集成电路、专用CPU、专用存储器、专用元器件等来实现。一般情况下,凡由计算机程序完成的功能都可以很容易地用相应的硬件来实现,而且,用来实现同一功能的具体硬件结构也可以是多种多样的,例如模拟电路、数字电路或专用电路等。但是,对本发明而言更多情况下软件程序实现是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在可读取的存储介质中,如计算机的软盘,U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述的方法。
以上所述是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也视为本发明的保护范围。
Claims (17)
1.一种基于DirectX Effect系统的3D渲染方法,其特征在于,包括步骤:
S1、在调用DrawCall对当前画面的物体进行渲染时,根据预置的映射表获取3D引擎内存中的所述物体的参数值所对应的shader参数索引值;其中,所述映射表中记录有DirectXEffect系统的Effect参数名与shader参数索引值的映射关系,且所述3D引擎内存中的每一物体的参数值设有对应的Effect参数名;
S2、将所述3D引擎内存中的所述物体的参数值拷贝到所述shader参数索引值所对应的驱动内存中。
2.如权利要求1所述的基于DirectX Effect系统的3D渲染方法,其特征在于,所述映射表具体通过以下方式预先得到:
为DirectX Effect系统中的每一Effect参数名设置对应的唯一识别码,并记录Effect参数名与唯一识别码的映射关系;其中,每一所述唯一识别码作为对应的Effect参数名的参数值;
将所述唯一识别码拷贝到shader的驱动内存中以进行Effect参数设置,使所述DirectX Effect系统产生shader级别的API回调;
在所述API回调中获取shader参数索引值及对应的shader参数值;其中,所述shader参数值与所述唯一识别码一一对应;
基于所述shader参数值与所述唯一识别码的对应关系以及所述Effect参数名与唯一识别码的映射关系,得到所述Effect参数名与shader参数索引值的映射关系。
3.如权利要求1所述的基于DirectX Effect系统的3D渲染方法,其特征在于,所述方法还包括步骤:
S3、若当前画面的所有物体渲染完成,则将渲染完成后的当前画面输出,否则返回步骤S1。
4.如权利要求1~3任一项所述的基于DirectX Effect系统的3D渲染方法,其特征在于,所述画面为游戏画面。
5.一种基于DirectX Effect系统的3D渲染方法,其特征在于,包括步骤:
S1、在调用DrawCall对当前画面的物体进行渲染时,根据预置的映射表获取3D引擎内存中的所述物体的参数值所对应的shader参数索引值;其中,所述映射表中记录有DirectXEffect系统的Effect参数名与shader参数索引值的映射关系,且所述3D引擎内存中的每一物体的参数值设有对应的Effect参数名;
S2、根据所述物体的参数名判断对应的参数值是否为全局Effect参数值,若在判断为是全局Effect参数值并且非首次对当前画面调用DrawCall时,返回执行步骤S1,否则执行步骤S3;其中,所述全局参数值是指同一场景中所有物体都相同的参数值;
S3、将所述3D引擎内存中的所述物体的参数值拷贝到所述shader参数索引值所对应的驱动内存中。
6.如权利要求5所述的基于DirectX Effect系统的3D渲染方法,其特征在于,所述映射表具体通过以下方式预先得到:
为DirectX Effect系统中的每一Effect参数名设置对应的唯一识别码,并记录Effect参数名与唯一识别码的映射关系;其中,每一所述唯一识别码作为对应的Effect参数名的参数值;
将所述唯一识别码拷贝到shader的驱动内存中以进行Effect参数设置,使所述DirectX Effect系统产生shader级别的API回调;
在所述API回调中获取shader参数索引值及对应的shader参数值;其中,所述shader参数值与所述唯一识别码一一对应;
基于所述shader参数值与所述唯一识别码的对应关系以及所述Effect参数名与唯一识别码的映射关系,得到所述Effect参数名与shader参数索引值的映射关系。
7.如权利要求5所述的基于DirectX Effect系统的3D渲染方法,其特征在于,所述方法还包括步骤:
S4、若当前画面的所有物体渲染完成,则将渲染完成后的当前画面输出,否则返回步骤S1。
8.如权利要求5~7任一项所述的基于DirectX Effect系统的3D渲染方法,其特征在于,所述画面为游戏画面。
9.一种基于DirectX Effect系统的3D渲染装置,其特征在于,包括:
shader参数索引值获取模块,用于在调用DrawCall对当前画面的物体进行渲染时,根据预置的映射表获取3D引擎内存中的所述物体的参数值所对应的shader参数索引值;其中,所述映射表中记录有DirectX Effect系统的Effect参数名与shader参数索引值的映射关系,且所述3D引擎内存中的每一物体的参数值设有对应的Effect参数名;
参数设置模块,用于将所述3D引擎内存中的所述物体的参数值拷贝到所述shader参数索引值所对应的驱动内存中。
10.如权利要求9所述的基于DirectX Effect系统的3D渲染装置,其特征在于,所述映射表具体通过以下方式预先得到:
为DirectX Effect系统中的每一Effect参数名设置对应的唯一识别码,并记录Effect参数名与唯一识别码的映射关系;其中,每一所述唯一识别码作为对应的Effect参数名的参数值;
将所述唯一识别码拷贝到shader的驱动内存中以进行Effect参数设置,使所述DirectX Effect系统产生shader级别的API回调;
在所述API回调中获取shader参数索引值及对应的shader参数值;其中,所述shader参数值与所述唯一识别码一一对应;
基于所述shader参数值与所述唯一识别码的对应关系以及所述Effect参数名与唯一识别码的映射关系,得到所述Effect参数名与shader参数索引值的映射关系。
11.如权利要求9所述的基于DirectX Effect系统的3D渲染装置,其特征在于,所述装置还包括:
输出模块,用于在当前画面的所有物体渲染完成后,将当前画面输出。
12.如权利要求9~11任一项所述的基于DirectX Effect系统的3D渲染装置,其特征在于,所述画面为游戏画面。
13.一种基于DirectX Effect系统的3D渲染装置,其特征在于,包括:
shader参数索引值获取模块,用于在调用DrawCall对当前画面的物体进行渲染时,根据预置的映射表获取3D引擎内存中的所述物体的参数值所对应的shader参数索引值;其中,所述映射表中记录有DirectX Effect系统的Effect参数名与shader参数索引值的映射关系,且所述3D引擎内存中的每一物体的参数值设有对应的Effect参数名;
判断模块,根据所述物体的参数名判断对应的参数值是否为全局Effect参数值;其中,所述全局参数值是指同一场景中所有物体都相同的参数值;
参数设置模块,用于在所述shader参数索引值获取模块首次对当前画面调用DrawCall时或判断模块判断为否时,将所述3D引擎内存中的所述物体的参数值拷贝到所述shader参数索引值所对应的驱动内存中。
14.如权利要求13所述的基于DirectX Effect系统的3D渲染装置,其特征在于,所述映射表具体通过以下方式预先得到:
为DirectX Effect系统中的每一Effect参数名设置对应的唯一识别码,并记录Effect参数名与唯一识别码的映射关系;其中,每一所述唯一识别码作为对应的Effect参数名的参数值;
将所述唯一识别码拷贝到shader的驱动内存中以进行Effect参数设置,使所述DirectX Effect系统产生shader级别的API回调;
在所述API回调中获取shader参数索引值及对应的shader参数值;其中,所述shader参数值与所述唯一识别码一一对应;
基于所述shader参数值与所述唯一识别码的对应关系以及所述Effect参数名与唯一识别码的映射关系,得到所述Effect参数名与shader参数索引值的映射关系。
15.如权利要求13所述的基于DirectX Effect系统的3D渲染装置,其特征在于,所述装置还包括:
输出模块,用于在当前画面的所有物体渲染完成后,将当前画面输出。
16.如权利要求13~15任一项所述的基于DirectX Effect系统的3D渲染装置,其特征在于,所述画面为游戏画面。
17.一种3D游戏引擎,其特征在于,包括如权利要求9~16任一项所述的基于DirectXEffect系统的3D渲染装置。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610004878.1A CN105701854B (zh) | 2016-01-06 | 2016-01-06 | 一种3d渲染方法、装置及引擎 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610004878.1A CN105701854B (zh) | 2016-01-06 | 2016-01-06 | 一种3d渲染方法、装置及引擎 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN105701854A CN105701854A (zh) | 2016-06-22 |
CN105701854B true CN105701854B (zh) | 2018-07-03 |
Family
ID=56226082
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201610004878.1A Active CN105701854B (zh) | 2016-01-06 | 2016-01-06 | 一种3d渲染方法、装置及引擎 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN105701854B (zh) |
Families Citing this family (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108965975B (zh) * | 2017-05-24 | 2021-03-23 | 阿里巴巴集团控股有限公司 | 一种绘制方法及装置 |
CN108765533A (zh) * | 2018-05-17 | 2018-11-06 | 成都明镜视觉科技有限公司 | 一种shader参数可视化方法 |
CN109395384A (zh) * | 2018-09-12 | 2019-03-01 | Oppo广东移动通信有限公司 | 游戏渲染方法及相关产品 |
CN109302617B (zh) * | 2018-10-19 | 2020-12-15 | 武汉斗鱼网络科技有限公司 | 一种指定多元素的视频连麦方法、装置、设备及存储介质 |
CN111145329B (zh) * | 2019-12-25 | 2024-03-22 | 北京像素软件科技股份有限公司 | 模型渲染方法、系统及电子装置 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1851753A (zh) * | 2005-11-28 | 2006-10-25 | 北京航空航天大学 | 一种基于状态集的Shader三维图形绘制框架和绘制方法 |
CN102651142A (zh) * | 2012-04-16 | 2012-08-29 | 深圳超多维光电子有限公司 | 图像渲染方法和装置 |
CN105183566A (zh) * | 2015-10-16 | 2015-12-23 | 上海恺英网络科技有限公司 | 3d游戏渲染引擎的资源管理方法 |
CN105184847A (zh) * | 2015-10-16 | 2015-12-23 | 上海恺英网络科技有限公司 | 3d游戏渲染引擎的渲染方法 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8274517B2 (en) * | 2003-11-14 | 2012-09-25 | Microsoft Corporation | Systems and methods for downloading algorithmic elements to a coprocessor and corresponding techniques |
-
2016
- 2016-01-06 CN CN201610004878.1A patent/CN105701854B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1851753A (zh) * | 2005-11-28 | 2006-10-25 | 北京航空航天大学 | 一种基于状态集的Shader三维图形绘制框架和绘制方法 |
CN102651142A (zh) * | 2012-04-16 | 2012-08-29 | 深圳超多维光电子有限公司 | 图像渲染方法和装置 |
CN105183566A (zh) * | 2015-10-16 | 2015-12-23 | 上海恺英网络科技有限公司 | 3d游戏渲染引擎的资源管理方法 |
CN105184847A (zh) * | 2015-10-16 | 2015-12-23 | 上海恺英网络科技有限公司 | 3d游戏渲染引擎的渲染方法 |
Also Published As
Publication number | Publication date |
---|---|
CN105701854A (zh) | 2016-06-22 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109697060B (zh) | 视频特效系统及其生成方法、装置、设备和存储介质 | |
CN105701854B (zh) | 一种3d渲染方法、装置及引擎 | |
US20230033306A1 (en) | Image rendering method and apparatus, computer device, and storage medium | |
US10074206B1 (en) | Network-optimized graphics library for virtualized graphics processing | |
US9164798B2 (en) | Method, apparatus and computer for loading resource file for game engine | |
JP4766906B2 (ja) | 拡張グラフィックスパイプラインを提供するシステムおよび方法 | |
CN107393013B (zh) | 虚拟漫游文件生成、显示方法、装置、介质、设备和系统 | |
CN103049375B (zh) | 一种摄像头在线调试方法 | |
Ginsburg et al. | OpenGL ES 3.0 programming guide | |
US7877749B2 (en) | Utilizing and maintaining data definitions during process thread traversals | |
CN110716845B (zh) | 一种Android系统的日志信息读取的方法 | |
CN110413408A (zh) | 一种深度学习框架的显存控制方法、设备以及存储介质 | |
CN110968437A (zh) | 一种基于Java智能合约的单个合约并行执行的方法、装置、设备及介质 | |
CN107077379A (zh) | 一种虚拟机创建方法和装置 | |
US20180059978A1 (en) | Virtual disk expansion method and apparatus | |
WO2022262856A1 (zh) | 头戴显示设备的模型加载方法、装置及头戴显示设备 | |
CN112882694A (zh) | 一种程序编译方法、装置、电子设备及可读存储介质 | |
CN110554998A (zh) | 一种通过替换函数内部指令的钩子方法、装置、终端及存储介质 | |
CN116643778B (zh) | 一种应用程序优化方法及电子设备 | |
CN104063234A (zh) | 一种兼容方法及装置 | |
WO2015120797A1 (en) | Method and apparatus for testing compatibility of 3d engine | |
CN112486807A (zh) | 一种压力测试方法、装置、电子设备和可读存储介质 | |
CN111796812A (zh) | 图像渲染的方法、装置、电子设备及计算机可读存储介质 | |
CN114911541A (zh) | 配置信息的处理方法、装置、电子设备及存储介质 | |
CN112367295B (zh) | 插件展示方法及装置、存储介质及电子设备 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |