技术领域
[0001] 本公开涉及计算机技术领域,具体而言,涉及一种着色方法及装置。
相关背景技术
[0002] 着色器(Shader)是用来实现图像渲染的,用来替代固定渲染管线的可编辑程序。着色器替代了传统的固定渲染管线,可以实现3D图形学计算中的相关计算,由于其可编辑性,可以实现各种各样的图像效果而不用受显卡的固定渲染管线限制。对于不同架构或性能的终端设备,可以采用不同的着色策略,这些着色策略通常被称为着色管线。各个着色管线的代码需要分别编写,效率较低。
具体实施方式
[0062] 为使本公开实施例的目的、技术方案和优点更加清楚,下面将结合本公开实施例中附图,对本公开实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本公开一部分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本公开实施例的组件可以以各种不同的配置来布置和设计。因此,以下对在附图中提供的本公开的实施例的详细描述并非旨在限制要求保护的本公开的范围,而是仅仅表示本公开的选定实施例。基于本公开的实施例,本领域技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本公开保护的范围。
[0063] 应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。
[0064] 本文中术语“和/或”,仅仅是描述一种关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。另外,本文中术语“至少一种”表示多种中的任意一种或多种中的至少两种的任意组合,例如,包括A、B、C中的至少一种,可以表示包括从A、B和C构成的集合中选择的任意一个或多个元素。
[0065] 为了解决不同着色管线需要分别编写代码的技术问题,本公开提供了一种着色方法,通过配置信息及着色资源信息确定目标着色模式,在根据目标着色模式及着色资源信息生成目标着色模式对应的目标着色代码,只需要一份着色资源信息即可实现不同着色模式的着色,提高代码的复用率,效率较高。
[0066] 为便于对本实施例进行理解,首先对本公开实施例所公开的一种着色方法进行详细介绍,本公开实施例所提供的着色方法的执行主体一般为具有一定计算能力的计算机设备,该计算机设备例如包括:终端设备或服务器或其它处理设备。在一些可能的实现方式中,该着色方法可以通过处理器调用存储器中存储的计算机可读指令的方式来实现。
[0067] 参见图1所示,为本公开实施例提供的着色方法的流程图,所述方法包括步骤S101~S104,其中:
[0068] S101、获取终端设备的配置信息以及着色资源信息;所述着色资源信息包括待着色对象的材质模板、待着色对象的光照模板以及多个着色模式的着色路径。
[0069] 其中,终端设备可以为进行着色渲染的设备,中断设备的配置信息可以包括终端设备的设备型号标识、中央处理器信息、图形处理器信息、预设着色模式等信息中的至少一项。
[0070] 上述着色资源信息可以为预先编写好的模块化着色代码,材质模板中可以包括待着色对象的材质信息、贴图信息、待着色对象的着色函数等;光照模板可以包括各种类型及风格的光照着色函数及参数;着色路径可以包括着色管线的代码框架,对着色管线中各个模块代码的执行顺序做出了规定。
[0071] S102、基于所述配置信息,从所述多个着色模式中确定目标着色模式。
[0072] 该步骤中,可以根据配置信息,以及预设的配置‑模式映射表,查询与配置信息匹配的目标着色模式。
[0073] 上述目标着色模式可以与着色管线匹配,不同的着色管线可以对应不同的着色代码。
[0074] S103、基于所述材质模板、所述光照模板以及所述目标着色模式对应的目标着色路径,生成所述目标着色模式对应的目标着色代码。
[0075] 该步骤中,可以基于材质模板、光照模板及目标着色模式匹配的目标着色路径生成与目标着色模式对应的目标着色代码,示例性的,可以遍历所述目标着色路径,确定所述目标着色路径中多个代码引用节点;可以根据代码引用节点的信息,针对每个所述代码引用节点,从所述材质模板及所述光照模板中确定与所述代码引用节点匹配的目标代码段;然后将所述目标代码段添加至对应的代码引用节点,得到所述目标着色代码。由于目标着色路径与目标着色模式匹配,因此,得到的目标着色代码也与目标着色模式匹配。
[0076] 这样,即可通过不同着色路径及材质模板、光照模板,得到不同管线对应的目标着色代码。
[0077] 这里,代码引用节点还可以引用预设的场景效果模板,场景效果模板中包括一些通用的场景效果的着色代码,通过将其模块化为场景效果模板,能够提高代码的复用率。
[0078] S104、基于所述目标着色代码,对所述待着色对象进行着色。
[0079] 该步骤中,可以按顺序执行目标着色代码,通过目标着色代码对待着色对象进行着色。
[0080] 参见图2所示,为本公开实施例提供的另一种着色方法,该着色方法中,目标着色模式为延迟着色模式,首先执行上述目标着色代码,基于所述目标着色代码中的顶点着色代码,调用所述材质模板中的顶点着色函数,对所述待着色对象中的顶点进行着色,得到顶点着色产物,然后基于所述目标代码中的像素着色代码,调用所述材质模板中的像素着色函数,对所述待着色对象中的像素进行着色,最后,基于所述目标代码中的延迟着色代码,将所述材质模板中的材质信息存储至目标几何缓冲区,结束着色的第一阶段;在检测到针对所述待着色对象中的背景光照的着色触发事件后,可以开始着色的第二阶段,读取所述目标几何缓冲区中的材质信息,并基于所述目标代码中的光照着色代码以及读取的材质信息,对所述待着色对象中的背景光照进行着色。图2中,目标代码中可以存在一个或多个引用场景效果模板的代码引用节点(即插槽),该节点可以调用场景效果模板中的代码对场景添加场景特效,场景特效模板可以包括如雾、天气、溶解等。
[0081] 这样,通过对效果影响较小的光照着色延迟渲染,使得终端设备能够优先渲染顶点及像素的颜色,提高着色的性能。
[0082] 上述着色触发事件可以根据延迟时长或延迟条件设定,比如,可以将着色触发事件设置为所有的顶点及像素着色完毕。
[0083] 其中,上述着色方法还可以对顶点进行光照着色,在顶点进行着色之后,可以基于所述目标着色代码中的顶点光照着色代码,调用所述材质模板中的顶点光照着色函数,对所述待着色对象中的顶点的光照进行着色。
[0084] 参见图3所示,为本公开实施例提供的再一种着色方法,该着色方法中,目标着色模式为标准着色模式,该方法首先基于所述目标着色代码中的顶点着色代码,调用所述材质模板中的顶点着色函数,对所述待着色对象中的顶点进行着色,得到顶点着色产物;然后,基于所述目标代码中的像素着色代码,调用所述材质模板中的像素着色函数,对所述待着色对象中的像素进行着色;最后,直接基于所述目标代码中的光照着色代码以及所述从材质模板中读取材质的信息,对所述待着色对象中的背景光照进行着色,不进行延迟渲染。相似的,该着色方法也可以通过插槽调用场景效果模板,添加场景效果。
[0085] 本公开实施例提供的着色方法,首先获取终端设备的配置信息以及着色资源信息;所述着色资源信息包括待着色对象的材质模板、待着色对象的光照模板以及多个着色模式的着色路径;然后,基于所述配置信息,从所述多个着色模式中确定目标着色模式;之后,基于所述材质模板、所述光照模板以及所述目标着色模式对应的目标着色路径,生成所述目标着色模式对应的目标着色代码;最后,基于所述目标着色代码,对所述待着色对象进行着色。本公开实施例通过配置信息及着色资源信息确定目标着色模式,在根据目标着色模式及着色资源信息生成目标着色模式对应的目标着色代码,只需要一份着色资源信息即可实现不同着色模式的着色,提高代码的复用率,效率较高。
[0086] 本领域技术人员可以理解,在具体实施方式的上述方法中,各步骤的撰写顺序并不意味着严格的执行顺序而对实施过程构成任何限定,各步骤的具体执行顺序应当以其功能和可能的内在逻辑确定。
[0087] 基于同一发明构思,本公开实施例中还提供了与着色方法对应的着色装置,由于本公开实施例中的装置解决问题的原理与本公开实施例上述着色方法相似,因此装置的实施可以参见方法的实施,重复之处不再赘述。
[0088] 参照图4所示,为本公开实施例提供的一种着色装置的示意图,所述装置包括:
[0089] 获取模块410,用于获取终端设备的配置信息以及着色资源信息;所述着色资源信息包括待着色对象的材质模板、待着色对象的光照模板以及多个着色模式的着色路径;
[0090] 确定模块420,用于基于所述配置信息,从所述多个着色模式中确定目标着色模式;
[0091] 生成模块430,用于基于所述材质模板、所述光照模板以及所述目标着色模式对应的目标着色路径,生成所述目标着色模式对应的目标着色代码;
[0092] 着色模块440,用于基于所述目标着色代码,对所述待着色对象进行着色。
[0093] 一种可选的实施方式中,所述确定模块420具体用于:
[0094] 基于所述配置信息中的设备型号标识、中央处理器信息、图形处理器信息、预设着色模式中的至少一项,确定目标着色模式。
[0095] 一种可选的实施方式中,所述生成模块430具体用于:
[0096] 遍历所述目标着色路径,确定所述目标着色路径中多个代码引用节点;
[0097] 针对每个所述代码引用节点,从所述材质模板及所述光照模板中确定与所述代码引用节点匹配的目标代码段;
[0098] 将所述目标代码段添加至对应的代码引用节点,得到所述着色代码。
[0099] 一种可选的实施方式中,所述生成模块430在针对每个所述代码引用节点,从所述材质模板及所述光照模板中确定与所述代码引用节点匹配的目标代码段时,用于:
[0100] 针对每个所述代码引用节点,从所述材质模板、所述光照模板以及预设的场景效果模板中确定与所述代码引用节点匹配的目标代码段。
[0101] 一种可选的实施方式中,所述目标着色模式包括延迟着色模式;在所述目标着色模式为延迟着色模式的情况下,所述着色模块440用于:
[0102] 基于所述目标着色代码中的顶点着色代码,调用所述材质模板中的顶点着色函数,对所述待着色对象中的顶点进行着色;
[0103] 基于所述目标代码中的像素着色代码,调用所述材质模板中的像素着色函数,对所述待着色对象中的像素进行着色;
[0104] 基于所述目标代码中的延迟着色代码,将所述材质模板中的材质信息存储至目标几何缓冲区;
[0105] 在检测到针对所述待着色对象中的背景光照的着色触发事件后,读取所述目标几何缓冲区中的材质信息,并基于所述目标代码中的光照着色代码以及读取的材质信息,对所述待着色对象中的背景光照进行着色。
[0106] 一种可选的实施方式中,在所述基于所述目标着色代码中的顶点着色代码,调用所述材质模板中的顶点着色函数,对所述待着色对象中的顶点进行着色之后,所述着色模块440还用于:
[0107] 基于所述目标着色代码中的顶点光照着色代码,调用所述材质模板中的顶点光照着色函数,对所述待着色对象中的顶点的光照进行着色。
[0108] 一种可选的实施方式中,所述目标着色模式包括标准着色模式;在所述目标着色模式为标准着色模式的情况下,所述着色模块用于:
[0109] 基于所述目标着色代码中的顶点着色代码,调用所述材质模板中的顶点着色函数,对所述待着色对象中的顶点进行着色;
[0110] 基于所述目标代码中的像素着色代码,调用所述材质模板中的像素着色函数,对所述待着色对象中的像素进行着色;
[0111] 基于所述目标代码中的光照着色代码以及从所述材质模板中读取材质的信息,对所述待着色对象中的背景光照进行着色。
[0112] 关于装置中的各模块的处理流程、以及各模块之间的交互流程的描述可以参照上述方法实施例中的相关说明,这里不再详述。
[0113] 对应于图1中的着色方法,本公开实施例还提供了一种电子设备500,如图5所示,为本公开实施例提供的电子设备500结构示意图,包括:
[0114] 处理器51、存储器52、和总线53;存储器52用于存储执行指令,包括内存521和外部存储器522;这里的内存521也称内存储器,用于暂时存放处理器51中的运算数据,以及与硬盘等外部存储器522交换的数据,处理器51通过内存521与外部存储器522进行数据交换,当所述电子设备500运行时,所述处理器51与所述存储器52之间通过总线53通信,使得所述处理器51执行以下指令:
[0115] 获取终端设备的配置信息以及着色资源信息;所述着色资源信息包括待着色对象的材质模板、待着色对象的光照模板以及多个着色模式的着色路径;
[0116] 基于所述配置信息,从所述多个着色模式中确定目标着色模式;
[0117] 基于所述材质模板、所述光照模板以及所述目标着色模式对应的目标着色路径,生成所述目标着色模式对应的目标着色代码;
[0118] 基于所述目标着色代码,对所述待着色对象进行着色。
[0119] 一种可选的实施方式中,所述处理器51执行的指令中,所述基于所述配置信息,从所述多个着色模式中确定目标着色模式,包括:
[0120] 基于所述配置信息中的设备型号标识、中央处理器信息、图形处理器信息、预设着色模式中的至少一项,确定目标着色模式。
[0121] 一种可选的实施方式中,所述处理器51执行的指令中,所述基于所述材质模板、所述光照模板以及所述目标着色模式对应的目标着色路径,生成所述目标着色模式对应的目标着色代码,包括:
[0122] 遍历所述目标着色路径,确定所述目标着色路径中多个代码引用节点;
[0123] 针对每个所述代码引用节点,从所述材质模板及所述光照模板中确定与所述代码引用节点匹配的目标代码段;
[0124] 将所述目标代码段添加至对应的代码引用节点,得到所述着色代码。
[0125] 一种可选的实施方式中,所述处理器51执行的指令中,所述针对每个所述代码引用节点,从所述材质模板及所述光照模板中确定与所述代码引用节点匹配的目标代码段,包括:
[0126] 针对每个所述代码引用节点,从所述材质模板、所述光照模板以及预设的场景效果模板中确定与所述代码引用节点匹配的目标代码段。
[0127] 一种可选的实施方式中,所述处理器51执行的指令中,所述目标着色模式包括延迟着色模式;在所述目标着色模式为延迟着色模式的情况下,所述基于所述目标着色代码,对所述待着色对象进行着色,包括:
[0128] 基于所述目标着色代码中的顶点着色代码,调用所述材质模板中的顶点着色函数,对所述待着色对象中的顶点进行着色;
[0129] 基于所述目标代码中的像素着色代码,调用所述材质模板中的像素着色函数,对所述待着色对象中的像素进行着色;
[0130] 基于所述目标代码中的延迟着色代码,将所述材质模板中的材质信息存储至目标几何缓冲区;
[0131] 在检测到针对所述待着色对象中的背景光照的着色触发事件后,读取所述目标几何缓冲区中的材质信息,并基于所述目标代码中的光照着色代码以及读取的材质信息,对所述待着色对象中的背景光照进行着色。
[0132] 一种可选的实施方式中,所述处理器51在执行所述基于所述目标着色代码中的顶点着色代码,调用所述材质模板中的顶点着色函数,对所述待着色对象中的顶点进行着色之后,还用于执行:
[0133] 基于所述目标着色代码中的顶点光照着色代码,调用所述材质模板中的顶点光照着色函数,对所述待着色对象中的顶点的光照进行着色。
[0134] 一种可选的实施方式中,所述目标着色模式包括标准着色模式;所述处理器51执行的指令中,在所述目标着色模式为标准着色模式的情况下,所述基于所述目标着色代码,对所述待着色对象进行着色,包括:
[0135] 基于所述目标着色代码中的顶点着色代码,调用所述材质模板中的顶点着色函数,对所述待着色对象中的顶点进行着色;
[0136] 基于所述目标代码中的像素着色代码,调用所述材质模板中的像素着色函数,对所述待着色对象中的像素进行着色;
[0137] 基于所述目标代码中的光照着色代码以及从所述材质模板中读取材质的信息,对所述待着色对象中的背景光照进行着色。
[0138] 本公开实施例还提供一种计算机可读存储介质,该计算机可读存储介质上存储有计算机程序,该计算机程序被处理器运行时执行上述方法实施例中所述的着色方法的步骤。其中,该存储介质可以是易失性或非易失的计算机可读取存储介质。
[0139] 本公开实施例还提供一种计算机程序产品,该计算机程序产品承载有程序代码,所述程序代码包括的指令可用于执行上述方法实施例中所述的着色方法的步骤,具体可参见上述方法实施例,在此不再赘述。
[0140] 其中,上述计算机程序产品可以具体通过硬件、软件或其结合的方式实现。在一个可选实施例中,所述计算机程序产品具体体现为计算机存储介质,在另一个可选实施例中,计算机程序产品具体体现为软件产品,例如软件开发包(Software Development Kit,SDK)等等。
[0141] 所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统和装置的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。在本公开所提供的几个实施例中,应该理解到,所揭露的系统、装置和方法,可以通过其它的方式实现。以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,又例如,多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些通信接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
[0142] 所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
[0143] 另外,在本公开各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。
[0144] 所述功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个处理器可执行的非易失的计算机可读取存储介质中。基于这样的理解,本公开的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本公开各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(Read‑Only Memory,ROM)、随机存取存储器(Random Access Memory,RAM)、磁碟或者光盘等各种可以存储程序代码的介质。
[0145] 最后应说明的是:以上所述实施例,仅为本公开的具体实施方式,用以说明本公开的技术方案,而非对其限制,本公开的保护范围并不局限于此,尽管参照前述实施例对本公开进行了详细的说明,本领域的普通技术人员应当理解:任何熟悉本技术领域的技术人员在本公开揭露的技术范围内,其依然可以对前述实施例所记载的技术方案进行修改或可轻易想到变化,或者对其中部分技术特征进行等同替换;而这些修改、变化或者替换,并不使相应技术方案的本质脱离本公开实施例技术方案的精神和范围,都应涵盖在本公开的保护范围之内。因此,本公开的保护范围应所述以权利要求的保护范围为准。