一种着色器的生成方法、装置、播放器及存储介质与流程

    专利查询2023-06-14  107



    1.本技术涉及计算机图形学技术领域,特别是涉及一种着色器的生成方法、装置、播放器及存储介质。


    背景技术:

    2.着色器是渲染引擎中用来实现图像渲染的组件,用来代替固定渲染管线的可编程程序。不同渲染引擎中的着色器的源代码格式不同,例如,glsl、hlsl、cuda等,但最终都需编译成二进制码的形式,供gpu(graphics processing unit,图形处理器)执行使用。
    3.目前基于渲染引擎的图像渲染过程中,人工编写的着色器的源代码以字符串形式保存在数据库内,在需要处理图像渲染任务时,读取着色器的源代码,然后对着色器的源代码进行编译得到编译结果文件,再将编译结果文件输入渲染引擎生成着色器,进而采用该着色器完成图像渲染任务。
    4.在上述图像渲染过程中,对着色器的源代码的编译需要耗费较长时间,从而会造成着色器的初始化时间过长,而影响渲染引擎的启动时间,进而导致处理图像渲染任务所需的整体时间较长。


    技术实现要素:

    5.本技术实施例提供一种着色器的生成方法、装置、播放器及存储介质,以缩短着色器的初始化时间,缩短处理图像渲染任务所需的整体时间。具体技术方案如下:
    6.第一方面,本技术实施例提供了一种着色器的生成方法,应用于预编译组件,所述方法包括:
    7.获取着色器源代码;
    8.对所述着色器源代码进行预编译,得到预编译结果文件,以使渲染组件在获取到渲染指令的情况下,读取所述预编译结果文件,并基于所述预编译结果文件生成着色器。
    9.可选的,所述对所述着色器源代码进行预编译,得到预编译结果文件的步骤,包括:
    10.确定所述着色器源代码对应的运行平台与所述预编译组件的运行平台是否相同;
    11.在所述着色器源代码对应的运行平台与所述预编译组件的运行平台不同的情况下,对所述着色器源代码进行转换,得到目标格式的着色器代码,其中,所述目标格式为所述预编译组件的运行平台的着色器语言格式;
    12.对所述目标格式的着色器代码进行预编译,得到预编译结果文件。
    13.可选的,所述对所述着色器源代码进行转换,得到目标格式的着色器代码的步骤,包括:
    14.对所述着色器源代码进行解析,确定所述着色器源代码包括的名词及表达式;
    15.获取所述着色器源代码对应的运行平台的第一着色器语言名词库以及所述预编译组件的运行平台的第二着色器语言名词库;
    16.基于所述第一着色器语言名词库及所述第二着色器语言名词库,将所述着色器源代码中的名词替换为所述第二着色器语言名词库中对应的名词;
    17.基于所述预编译组件的运行平台的着色器语言格式,对所述着色器源代码中的表达式进行转换,得到目标格式的着色器代码。
    18.可选的,在所述对所述着色器源代码进行预编译,得到预编译结果文件的步骤之后,所述方法还包括:
    19.在所述预编译结果文件的大小达到预设阈值的情况下,对所述预编译结果文件进行压缩,得到压缩后的结果文件。
    20.可选的,在所述对所述着色器源代码进行预编译,得到预编译结果文件的步骤之后,所述方法还包括:
    21.对所述着色器源代码进行加密处理,得到加密后的源代码;
    22.将所述加密后的源代码添加至所述预编译结果文件中。
    23.可选的,所述预编译结果文件包括文件头、索引表以及着色器表,其中:
    24.所述文件头包括文件头的大小;所述索引表包括着色器二进制码在所述预编译结果文件中的起始位置标识;所述着色器表包括所述着色器二进制码及所述着色器二进制码大小,其中,所述着色器二进制码为对所述着色器源代码进行预编译得到的。
    25.第二方面,本技术实施例提供了一种着色器的生成方法,应用于渲染组件,所述方法包括:
    26.在获取到渲染指令的情况下,读取预编译结果文件,其中,所述预编译结果文件为预编译组件预先对着色器源代码进行预编译得到的;
    27.基于所述预编译结果文件生成着色器。
    28.可选的,所述基于所述预编译结果文件生成着色器的步骤,包括:
    29.对所述预编译结果文件进行解析,获得所述预编译结果文件中包括的着色器二进制码,其中,所述着色器二进制码为所述预编译组件对所述着色器源代码进行预编译得到的;
    30.将所述着色器二进制码输入渲染引擎接口,以使渲染引擎根据所述着色器二进制码生成着色器。
    31.可选的,所述预编译结果文件包括文件头、索引表以及着色器表,其中,所述文件头包括文件头的大小;所述索引表包括所述着色器二进制码在所述预编译结果文件中的起始位置标识;所述着色器表包括所述着色器二进制码及所述着色器二进制码大小;
    32.所述对所述预编译结果文件进行解析,获得所述预编译结果文件中包括的着色器二进制码的步骤,包括:
    33.对所述预编译结果文件进行解析,获得所述文件头的大小;
    34.基于所述文件头的大小确定所述索引表的位置,并从所述索引表的位置读取所述着色器二进制码在所述预编译结果文件中的起始位置标识;
    35.基于所述着色器二进制码在所述预编译结果文件中的起始位置标识,确定目标着色器的着色器二进制码在所述预编译结果文件中的起始位置,并从所述着色器表中获取所述目标着色器二进制码大小,其中,所述目标着色器为所述渲染指令所针对的着色器;
    36.从所述起始位置开始,读取所述目标着色器二进制码大小的着色器二进制码。
    37.可选的,在所述基于所述预编译结果文件生成着色器的步骤之前,所述方法还包括:
    38.在所述预编译结果文件为压缩文件的情况下,对所述预编译结果文件进行解压,得到解压后的结果文件;
    39.所述基于所述预编译结果文件生成着色器的步骤,包括:
    40.基于所述解压后的结果文件生成着色器。
    41.可选的,所述方法还包括:
    42.在所述预编译结果文件包括加密后的源代码的情况下,对所述加密后的源代码进行解密处理,得到所述着色器源代码。
    43.第三方面,本技术实施例提供了一种着色器的生成装置,应用于预编译组件,所述装置包括:
    44.源代码获取模块,用于获取着色器源代码;
    45.预编译模块,用于对所述着色器源代码进行预编译,得到预编译结果文件,以使渲染组件在获取到渲染指令的情况下,读取所述预编译结果文件,并基于所述预编译结果文件生成着色器。
    46.第四方面,本技术实施例提供了一种着色器的生成装置,应用于渲染组件,所述装置包括:
    47.文件读取模块,用于在获取到渲染指令的情况下,读取预编译结果文件,其中,所述预编译结果文件为预编译组件预先对着色器源代码进行预编译得到的;
    48.着色器生成模块,用于基于所述预编译结果文件生成着色器。
    49.第五方面,本技术实施例提供了一种播放器,所述播放器包括预编译组件和渲染组件,其中:
    50.所述预编译组件,用于执行上述第一方面任一所述的方法步骤;
    51.所述渲染组件,用于执行上述第二方面任一所述的方法步骤。
    52.第六方面,本技术实施例提供了一种计算机可读存储介质,其特征在于,所述计算机可读存储介质内存储有计算机程序,所述计算机程序被处理器执行时实现上述第一方面或第二方面任一所述的方法步骤。
    53.本技术实施例所提供的方案中,预编译组件可以获取着色器源代码,进而对着色器源代码进行预编译,得到预编译结果文件,以使渲染组件在获取到渲染指令的情况下,读取预编译结果文件,并基于预编译结果文件生成着色器。由于预编译组件可以预先获取着色器源代码,进而对着色器源代码进行预编译,得到预编译结果文件备用,这样,渲染组件在获取到渲染指令的情况下,可以直接读取该预编译结果文件,并基于预编译结果文件生成着色器,无需在需要处理图像渲染任务时对着色器源代码进行编译,从而大大缩短了着色器的初始化时间,缩短渲染引擎的启动时间,进而可以缩短处理图像渲染任务所需的整体时间。当然,实施本技术的任一产品或方法并不一定需要同时达到以上所述的所有优点。
    附图说明
    54.为了更清楚地说明本技术实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本
    申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
    55.图1为本技术实施例所提供的第一种着色器的生成方法的流程图;
    56.图2为图1所示实施例的着色器的生成方法的示意图;
    57.图3为基于图1所示实施例的源代码转换方式的一种流程图;
    58.图4为基于图1所示实施例的预编译结果文件的一种结构示意图;
    59.图5(a)为图4所示实施例中的文件头的一种结构示意图;
    60.图5(b)为图4所示实施例中的索引表的一种结构示意图;
    61.图5(c)为图4所示实施例中的着色器表的一种结构示意图;
    62.图6为本技术实施例所提供的第二种着色器的生成方法的流程图;
    63.图7为基于图6所示实施例的预编译结果文件的解析方式的一种流程图;
    64.图8为本技术实施例所提供的第一种着色器的生成装置的结构示意图;
    65.图9为本技术实施例所提供的第二种着色器的生成装置的结构示意图;
    66.图10为本技术实施例所提供的一种播放器的结构示意图。
    具体实施方式
    67.下面将结合本技术实施例中的附图,对本技术实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本技术一部分实施例,而不是全部的实施例。基于本技术中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本技术保护的范围。
    68.为了缩短着色器的初始化时间,提高图像渲染任务的处理效率,本技术实施例提供了一种着色器的生成方法、装置、播放器及计算机可读存储介质。
    69.下面首先对本技术实施例所提供的第一种着色器的生成方法进行介绍。本技术实施例所提供的第一种着色器的生成方法可以应用于电子设备中预设的预编译组件,该预编译组件用于对着色器源代码进行预编译。
    70.如图1所示,一种着色器的生成方法,应用于预编译组件,所述方法包括:
    71.s101,获取着色器源代码;
    72.s102,对所述着色器源代码进行预编译,得到预编译结果文件,以使渲染组件在获取到渲染指令的情况下,读取所述预编译结果文件,并基于所述预编译结果文件生成着色器。
    73.可见,本技术实施例所提供的方案中,预编译组件可以获取着色器源代码,进而对着色器源代码进行预编译,得到预编译结果文件,以使渲染组件在获取到渲染指令的情况下,读取预编译结果文件,并基于预编译结果文件生成着色器。由于预编译组件可以预先获取着色器源代码,进而对着色器源代码进行预编译,得到预编译结果文件备用,这样,渲染组件在获取到渲染指令的情况下,可以直接读取该预编译结果文件,并基于预编译结果文件生成着色器,无需在需要处理图像渲染任务时对着色器源代码进行编译,从而大大缩短了着色器的初始化时间,缩短渲染引擎的启动时间,进而可以缩短处理图像渲染任务所需的整体时间。
    74.上述预编译组件为部署在电子设备中的用于对着色器源代码进行预编译的组件,
    电子设备可以为播放器。在开发人员编写完成着色器源代码后,可以将着色器源代码以字符串的形式保存成文件,并存储至预编译组件的运行平台的平台目录下。这样,在上述步骤s101中,预编译组件便可以获取着色器源代码。
    75.进而,预编译组件可以执行上述步骤s102,即对着色器源代码进行预编译,得到预编译结果文件。在一种实施方式中,预编译组件可以将着色器源代码转化成二进制码,得到预编译结果文件,并将该预编译结果文件保存下来。
    76.渲染组件在获取到渲染指令的情况下,说明此时需要处理图像渲染任务,那么渲染组件便可以读取已经编译好的预编译结果文件,并基于该预编译结果文件生成着色器,采用该着色器便可以完成图像渲染任务。
    77.可见,渲染组件在获取到渲染指令的情况下,可以直接读取该预编译结果文件,并基于预编译结果文件生成着色器,无需在需要处理图像渲染任务时对着色器源代码进行编译,从而大大缩短了着色器的初始化时间,缩短渲染引擎的启动时间,进而可以缩短处理图像渲染任务所需的整体时间。
    78.由于开发人员编写着色器源代码所使用的着色器语言可能与预编译组件的运行平台对应的着色器语言不同,那么预编译组件无法对着色器源代码进行编译。例如,hlsl着色器语言只有windows平台的d3d(direct3d)渲染引擎可以识别编译,嵌入式arm(advanced risc machines)平台中的opengl(open graphics library,开放图形库)可以编译运行glsl着色器语言所编写的着色器代码,那么嵌入式arm平台的预编译组件也就无法编译hlsl编写的着色器源代码。
    79.为了解决跨平台应用的问题,作为本技术实施例的一种实施方式,上述对所述着色器源代码进行预编译,得到预编译结果文件的步骤,可以包括:
    80.确定所述着色器源代码对应的运行平台与所述预编译组件的运行平台是否相同;在所述着色器源代码对应的运行平台与所述预编译组件的运行平台不同的情况下,对所述着色器源代码进行转换,得到目标格式的着色器代码;对所述目标格式的着色器代码进行预编译,得到预编译结果文件。
    81.预编译组件在获取着色器源代码之后,为了保证能够顺利完成预编译,可以确定着色器源代码对应的运行平台与预编译组件的运行平台是否相同。在一种实施方式中,着色器源代码可以包括对应的运行平台的标识,这样,预编译组件便可以对着色器源代码进行解析以获取该标识,进而根据该标识确定着色器源代码对应的运行平台。然后与自身的运行平台进行比较,确定二者是否相同。
    82.如果着色器源代码对应的运行平台与预编译组件的运行平台相同,说明预编译组件可以对该着色器源代码进行编译,那么便可以继续执行上述对所述着色器源代码进行预编译,得到预编译结果文件的步骤。
    83.如果着色器源代码对应的运行平台与预编译组件的运行平台不同,说明预编译组件无法对该着色器源代码进行编译,那么预编译组件可以对着色器源代码进行转换,得到目标格式的着色器代码。其中,目标格式为预编译组件的运行平台的着色器语言格式。也就是说,预编译组件可以对着色器源代码进行转换,得到自身可以进行编译的着色器语言格式的着色器代码。
    84.得到上述目标格式的着色器代码后,预编译组件便可以对该目标格式的着色器代
    码进行预编译,得到预编译结果文件。
    85.如图2所示,预编译组件可以在多个平台运行,在每个平台运行时,便可以将各种着色器语言(例如,glsl、cuda、cg、hlsl、gpul)编写的着色器源代码(源码)翻译至自身所在平台对应的目标格式的着色器代码,进而对目标格式的着色器代码进行编译生成预编译结果文件。在需要进行图像渲染时,gpu中的渲染组件便可以获取该预编译结果文件,生成着色器,应用程序加载该着色器便可以执行图像渲染任务,从而输出渲染后图像。
    86.可见,在本实施例中,预编译组件可以确定着色器源代码对应的运行平台与预编译组件的运行平台是否相同,如果不同,则对着色器源代码进行转换,得到目标格式的着色器代码,进而对目标格式的着色器代码进行预编译,得到预编译结果文件。这样,即使开发人员编写着色器源代码所使用的着色器语言与预编译组件的运行平台对应的着色器语言不同,预编译组件依然可以进行编译得到预编译结果文件,实现跨平台应用的目的。并且预编译组件可以在多个平台运行,并输出对应平台的着色器语言格式的预编译结果文件,供对应平台的渲染组件生成着色器以完成图像渲染任务。
    87.作为本技术实施例的一种实施方式,如图3所示,上述对所述着色器源代码进行转换,得到目标格式的着色器代码的步骤,可以包括:
    88.s301,对所述着色器源代码进行解析,确定所述着色器源代码包括的名词及表达式;
    89.虽然各种着色器语言并不相同,但是具有共同的特性,即着色器源代码均是由各种名词和表达式组成的,为了对着色器源代码进行翻译转换,预编译组件可以对着色器源代码进行解析,确定着色器源代码包括的名词及表达式。
    90.s302,获取所述着色器源代码对应的运行平台的第一着色器语言名词库以及所述预编译组件的运行平台的第二着色器语言名词库;
    91.为了确定着色器源代码包括的名词在预编译组件的运行平台的着色器语言中所对应的名词,预编译组件可以获取着色器源代码对应的运行平台的第一着色器语言名词库以及预编译组件的运行平台的第二着色器语言名词库。
    92.第一着色器语言名词库中包括着色器源代码的着色器语言中的各个名词,第二着色器语言名词库中包括预编译组件的运行平台的着色器语言中的各个名词。
    93.s303,基于所述第一着色器语言名词库及所述第二着色器语言名词库,将所述着色器源代码中的名词替换为所述第二着色器语言名词库中对应的名词;
    94.接下来,预编译组件便可以基于第一着色器语言名词库及第二着色器语言名词库,将着色器源代码中的名词替换为第二着色器语言名词库中对应的名词。作为一种实施方式,预编译组件可以根据第一着色器语言名词库及第二着色器语言名词库中各个名词的对应关系,从第二着色器语言名词库中查找与着色器源代码包括的名词对应的各个名词。
    95.进而将着色器源代码中的名词替换为所查找到的第二着色器语言名词库中对应的名词,从而完成名词的替换。
    96.s304,基于所述预编译组件的运行平台的着色器语言格式,对所述着色器源代码中的表达式进行转换,得到目标格式的着色器代码。
    97.由于各种着色器语言对于想要表达同一个目的表达式的具体编写格式是不同的,因此预编译组件还可以基于预编译组件的运行平台的着色器语言格式,对着色器源代码中
    的表达式进行转换。这样,进行了名词和表达式转换后的源代码便是符合预编译组件的运行平台的着色器语言格式的代码,也就是目标格式的着色器代码。进而,预编译组件可以顺利对该着色器代码进行编译。
    98.可见,在本实施例中,预编译组件可以对着色器源代码进行解析,确定着色器源代码包括的名词及表达式,获取着色器源代码对应的运行平台的第一着色器语言名词库以及预编译组件的运行平台的第二着色器语言名词库,基于第一着色器语言名词库及第二着色器语言名词库,将着色器源代码中的名词替换为第二着色器语言名词库中对应的名词,进而基于预编译组件的运行平台的着色器语言格式,对着色器源代码中的表达式进行转换,得到目标格式的着色器代码。这样,可以得到符合预编译组件的运行平台的着色器语言格式的代码,以保证可以顺利进行着色器代码的编译。
    99.作为本技术实施例的一种实施方式,在上述对所述着色器源代码进行预编译,得到预编译结果文件的步骤之后,上述方法还可以包括:
    100.在所述预编译结果文件的大小达到预设阈值的情况下,对所述预编译结果文件进行压缩,得到压缩后的结果文件。
    101.由于预编译结果文件的大小过大会造成渲染组件读取预编译结果文件缓慢等问题,所以在预编译结果文件的大小达到预设阈值的情况下,预编译组件可以对预编译结果文件进行压缩,得到压缩后的结果文件。具体压缩方式在此不做具体限定,例如,可以为zlib、winrar等。
    102.其中,上述预设阈值可以根据磁盘的存储空间大小、存储器或寄存器的读取性能、图像渲染效率等因素设置,在此不做具体限定。例如,可以为100m、200m、500m等。
    103.可见,在本实施例中,在预编译结果文件的大小达到预设阈值的情况下,预编译组件可以对预编译结果文件进行压缩,得到压缩后的结果文件,这样,可以减少存储空间的占用,提高渲染组件读取预编译结果文件的速度。
    104.作为本技术实施例的一种实施方式,在上述对所述着色器源代码进行预编译,得到预编译结果文件的步骤之后,上述方法还可以包括:
    105.对所述着色器源代码进行加密处理,得到加密后的源代码;将所述加密后的源代码添加至所述预编译结果文件中。
    106.在某些情况下可能会需要使用着色器源代码,例如,在排查着色器出现的问题时需要查看着色器源代码,因此需要将着色器源代码添加至预编译结果文件中。在这种情况下,为了保证着色器源代码的数据安全,预编译组件可以对着色器源代码进行加密处理,得到加密后的源代码,进而将加密后的源代码添加至预编译结果文件中。
    107.对着色器源代码进行加密处理的具体方式可以采用数据加密处理领域的任一加密处理方式,例如,可以为aes(advanced encryption standard,高级加密标准)加密、des(data encryption standard,数据加密标准)加密、dsa(digital signature algorithm,数字签名算法)等,在此不做具体的限定。
    108.可见,在本实施例中,预编译组件可以对着色器源代码进行加密处理,得到加密后的源代码,进而将加密后的源代码添加至预编译结果文件中。这样可以满足某些情况下可能会需要使用着色器源代码的需求,同时还能保证着色器源代码的数据安全性,保密性高。
    109.作为本技术实施例的一种实施方式,如图4所示,上述预编译结果文件包括文件头
    410、索引表420以及着色器表430,其中:
    110.所述文件头410包括文件头的大小(hesder_size);所述索引表420包括着色器二进制码在所述预编译结果文件中的起始位置标识;所述着色器表430包括所述着色器二进制码及所述着色器二进制码大小。
    111.文件头410可以包括文件头的大小,还可以包括预编译组件的运行平台类型(engine_type)、预编译结果文件版本(vesion)、预编译结果文件大小(file_size)、索引表中的索引数量(index_count)、运行平台的相关信息(platform_info)等,其具体格式可以如图5(a)所示。
    112.索引表420可以包括预编译得到的着色器二进制码在预编译结果文件中的起始位置标识(positionl)。为了使渲染组件能够准确地从预编译结果文件中读取着色器二进制码,预编译结果文件的索引表420中可以包括起始位置标识,用于着色器二进制码在预编译结果文件中的起始位置。其中,着色器二进制码为对着色器源代码进行预编译得到的。
    113.由于一般完成一项图像渲染任务需要多个着色器,所以预编译组件进行编译得到的预编译结果文件中可以包括多个着色器对应的着色器二进制码,那么为了准确标识各个着色器二进制码在预编译结果文件中的起始位置,索引表420还可以包括多个索引(index),每个索引对应一个着色器的着色器二进制码。具体格式可以如图5(b)所示。
    114.着色器表430主要用于保存着色器二进制码(program content)及生成着色器所需的一些参数,生成着色器所需的参数根据预编译组件运行平台的不同而变化。以运行平台的着色器语言为opengl为例,着色器表430的格式可以如图5(c)所示。可以包括存储格式(program format)、着色器二进制码大小(program size)、着色器二进制码等内容。
    115.在一种实施方式中,如果后续着色器使用过程中需要使用着色器源代码,那么预编译组件可以将加密后的源代码(source code after encryption)放入着色器表430中,以图5(c)所示的着色器表430为例,可以放入着色器二进制码后。
    116.预编译结果文件中可以包括多个着色器对应的着色器二进制码,那么便可以包括多个着色器表,每个着色器表对应一个着色器,用于保存该着色器的着色器二进制码及生成该着色器所需的一些参数。
    117.可见,在本实施例中,上述预编译结果文件可以包括文件头、索引表以及着色器表,文件头包括文件头的大小,索引表包括着色器二进制码在所述预编译结果文件中的起始位置标识,着色器表包括所述着色器二进制码及着色器二进制码大小。该预编译结果文件可以完整保存着色器源代码的编译结果,并且可以同时保存多个着色器源代码的编译结果。渲染组件后续可以根据文件头、索引表以及着色器表从预编译结果文件中读取所需生成的着色器对应的着色器二进制码等信息,可以顺利生成着色器,完成图像渲染任务。
    118.相应于上述第一种着色器的生成方法,本技术实施例还提供了第二种着色器的生成方法。下面对本技术实施例所提供的第二种着色器的生成方法进行介绍。本技术实施例所提供的第二种着色器的生成方法可以应用于电子设备中的渲染组件,该渲染组件用于生成着色器。
    119.如图6所示,一种着色器的生成方法,应用于渲染组件,所述方法包括:
    120.s601,在获取到渲染指令的情况下,读取预编译结果文件;
    121.其中,所述预编译结果文件为预编译组件预先对着色器源代码进行预编译得到
    的。
    122.s602,基于所述预编译结果文件生成着色器。
    123.可见,本技术实施例所提供的方案中,渲染组件可以在获取到渲染指令的情况下,读取预编译结果文件,其中,预编译结果文件为预编译组件预先对着色器源代码进行预编译得到的,进而渲染组件可以基于预编译结果文件生成着色器。由于预编译组件可以预先获取着色器源代码,进而对着色器源代码进行预编译,得到预编译结果文件备用,这样,渲染组件在获取到渲染指令的情况下,可以直接读取该预编译结果文件,并基于预编译结果文件生成着色器,无需在需要处理图像渲染任务时对着色器源代码进行编译,从而大大缩短了着色器的初始化时间,缩短渲染引擎的启动时间,进而可以缩短处理图像渲染任务所需的整体时间。
    124.在上述步骤s601中,针对渲染组件获取到渲染指令的情况,说明此时需要处理图像渲染任务,那么渲染组件便可以读取已经编译好的预编译结果文件,进而在上述步骤s602中,基于该预编译结果文件生成着色器,采用该着色器便可以完成图像渲染任务。
    125.其中,预编译结果文件为预编译组件预先对着色器源代码进行预编译得到的,也就是说,预编译结果文件可以为预编译组件采用上述第一种着色器的生成方法的任一实施例得到的。
    126.作为本技术实施例的一种实施方式,上述基于所述预编译结果文件生成着色器的步骤,可以包括:
    127.对所述预编译结果文件进行解析,获得所述预编译结果文件中包括的着色器二进制码;将所述着色器二进制码输入渲染引擎接口,以使渲染引擎根据所述着色器二进制码生成着色器。
    128.其中,着色器二进制码为预编译组件对着色器源代码进行预编译得到的。渲染组件读取到预编译结果文件后,可以对预编译结果文件进行解析,获得预编译结果文件中包括的着色器二进制码,进而将着色器二进制码输入渲染引擎接口,这样,渲染引擎便可以根据该着色器二进制码生成对应的着色器,从而利用该着色器完成图像渲染任务。
    129.在一种实施方式中,如果渲染组件从预编译结果文件中没有解析出着色器二进制码,可以输出错误提示信息。以提醒管理人员出现着色器生成错误的异常情况,以便管理人员进行处理。
    130.可见,在本实施例中,渲染组件可以对预编译结果文件进行解析,获得预编译结果文件中包括的着色器二进制码,进而将着色器二进制码输入渲染引擎接口,以使渲染引擎根据着色器二进制码生成着色器。这样可以方便快速地生成着色器,图像渲染任务的处理效率。
    131.作为本技术实施例的一种实施方式,上述预编译结果文件可以包括文件头、索引表以及着色器表,其中,所述文件头包括文件头的大小;所述索引表包括所述着色器二进制码在所述预编译结果文件中的起始位置标识;所述着色器表包括所述着色器二进制码及所述着色器二进制码大小。
    132.由于预编译结果文件的具体格式已经在上述第一种着色器的生成方法实施例中进行了介绍,所以在此不再赘述。
    133.如图7所示,上述对所述预编译结果文件进行解析,获得所述预编译结果文件中包
    括的着色器二进制码的步骤,可以包括:
    134.s701,对所述预编译结果文件进行解析,获得所述文件头的大小;
    135.s702,基于所述文件头的大小确定所述索引表的位置,并从所述索引表的位置读取所述着色器二进制码在所述预编译结果文件中的起始位置标识;
    136.为了从预编译结果文件准确地读取所需要的着色器二进制码,渲染组件可以对预编译结果文件进行解析,从而获得文件头的大小。由于文件头之后为索引表,所以渲染组件可以基于文件头的大小确定索引表的位置,文件头的结束位置即为索引表的位置,进而,渲染组件可以从索引表的位置读取着色器二进制码在预编译结果文件中的起始位置标识。
    137.其中,对预编译结果文件进行解析的具体方式可以为文件解析领域的任一文件解析方式,只要可以获得文件头的大小即可,在此不做具体限定及说明。
    138.s703,基于所述着色器二进制码在所述预编译结果文件中的起始位置标识,确定目标着色器的着色器二进制码在所述预编译结果文件中的起始位置,并从所述着色器表中获取所述目标着色器二进制码大小;
    139.预编译结果文件中一般包括多个着色器对应的着色器二进制码,也就是说,预编译结果文件主要由文件头和各个着色器对应的着色器二进制码组成。预编译结果文件的索引表中可以包括起始位置标识,用于着色器二进制码在预编译结果文件中的起始位置。
    140.确定待目标着色器的着色器二进制码在预编译结果文件中的起始位置后,只要知道该着色器二进制码大小,既可以从预编译结果文件中读取目标着色器的着色器二进制码,因此,渲染组件可以从目标着色器对应的着色器表中获取目标着色器二进制码大小。其中,目标着色器为渲染指令所针对的着色器,也就是当前需要生成的着色器。目标着色器可以为一个,也可以为多个,这都是合理的。
    141.s704,从所述起始位置开始,读取所述目标着色器二进制码大小的着色器二进制码。
    142.确定了目标着色器的着色器二进制码在预编译结果文件中的起始位置和大小后,渲染组件便可以从预编译结果文件中,从起始位置开始,读取目标着色器二进制码大小的着色器二进制码,该着色器二进制码即为目标着色器对应的二进制码。
    143.在一种实施方式中,渲染组件还可以读取目标着色器的着色器表包括的其他信息,例如,加密后的源代码等。
    144.可见,在本实施例中,预编译结果文件包括文件头、索引表以及着色器表的情况下,渲染组件可以准确地读取所需生成的着色器对应的着色器二进制码等内容,从而准确快速地生成着色器。
    145.作为本技术实施例的一种实施方式,在上述基于所述预编译结果文件生成着色器的步骤之前,上述方法还可以包括:
    146.在所述预编译结果文件为压缩文件的情况下,对所述预编译结果文件进行解压,得到解压后的结果文件。
    147.如果预编译结果文件为压缩文件,那么渲染组件可以根据预编译结果文件的压缩方式,对预编译结果文件进行解压,得到解压后的结果文件。
    148.相应的,上述基于所述预编译结果文件生成着色器的步骤,可以包括:
    149.基于所述解压后的结果文件生成着色器。
    150.进而,渲染组件便可以基于该解压后的结果文件生成着色器。
    151.作为本技术实施例的一种实施方式,上述方法还可以包括:
    152.在所述预编译结果文件包括加密后的源代码的情况下,对所述加密后的源代码进行解密处理,得到所述着色器源代码。
    153.如果渲染组件从预编译结果文件中读取了加密后的源代码,渲染组件可以根据着色器源代码的加密方式,对加密后的源代码进行解密处理,得到着色器源代码,进而,在需要时可以使用该着色器源代码。
    154.相应于上述第一种着色器的生成方法,本技术实施例还提供了一种着色器的生成装置。下面对本技术实施例所提供的第一种着色器的生成装置进行介绍。本技术实施例所提供的第一种着色器的生成方法可以应用于电子设备中的预设的预编译组件,该预编译组件用于对着色器源代码进行预编译。
    155.如图8所示,一种着色器的生成装置,其特征在于,应用于预编译组件,所述装置包括:
    156.源代码获取模块810,用于获取着色器源代码;
    157.预编译模块820,用于对所述着色器源代码进行预编译,得到预编译结果文件,以使渲染组件在获取到渲染指令的情况下,读取所述预编译结果文件,并基于所述预编译结果文件生成着色器。
    158.可见,本技术实施例所提供的方案中,预编译组件可以获取着色器源代码,进而对着色器源代码进行预编译,得到预编译结果文件,以使渲染组件在获取到渲染指令的情况下,读取预编译结果文件,并基于预编译结果文件生成着色器。由于预编译组件可以预先获取着色器源代码,进而对着色器源代码进行预编译,得到预编译结果文件备用,这样,渲染组件在获取到渲染指令的情况下,可以直接读取该预编译结果文件,并基于预编译结果文件生成着色器,无需在需要处理图像渲染任务时对着色器源代码进行编译,从而大大缩短了着色器的初始化时间,缩短渲染引擎的启动时间,进而可以缩短处理图像渲染任务所需的整体时间。
    159.作为本技术实施例的一种实施方式,上述预编译模块820可以包括:
    160.平台确定单元,用于在对所述着色器源代码进行预编译,得到预编译结果文件之前,确定所述着色器源代码对应的运行平台与所述预编译组件的运行平台是否相同;
    161.解释翻译单元,用于在所述着色器源代码对应的运行平台与所述预编译组件的运行平台不同的情况下,对所述着色器源代码进行转换,得到目标格式的着色器代码;
    162.其中,所述目标格式为所述预编译组件的运行平台的着色器语言格式。
    163.预编译单元,用于对所述目标格式的着色器代码进行预编译,得到预编译结果文件。
    164.作为本技术实施例的一种实施方式,上述解释翻译单元可以包括:
    165.代码解析子单元,用于对所述着色器源代码进行解析,确定所述着色器源代码包括的名词及表达式;
    166.名词库获取子单元,用于获取所述着色器源代码对应的运行平台的第一着色器语言名词库以及所述预编译组件的运行平台的第二着色器语言名词库;
    167.名词替换子单元,用于基于所述第一着色器语言名词库及所述第二着色器语言名
    词库,将所述着色器源代码中的名词替换为所述第二着色器语言名词库中对应的名词;
    168.表达式转换子单元,用于基于所述预编译组件的运行平台的着色器语言格式,对所述着色器源代码中的表达式进行转换,得到目标格式的着色器代码。
    169.作为本技术实施例的一种实施方式,上述装置还可以包括:
    170.压缩处理模块,用于在对所述着色器源代码进行预编译,得到预编译结果文件之后,在所述预编译结果文件的大小达到预设阈值的情况下,对所述预编译结果文件进行压缩,得到压缩后的结果文件。
    171.作为本技术实施例的一种实施方式,上述装置还可以包括:
    172.加密处理模块,用于在对所述着色器源代码进行预编译,得到预编译结果文件之后,对所述着色器源代码进行加密处理,得到加密后的源代码;
    173.代码添加模块,用于将所述加密后的源代码添加至所述预编译结果文件中。
    174.作为本技术实施例的一种实施方式,上述预编译结果文件可以包括文件头、索引表以及着色器表,其中:
    175.所述文件头包括文件头的大小;所述索引表包括着色器二进制码在所述预编译结果文件中的起始位置标识;所述着色器表包括所述着色器二进制码及所述着色器二进制码大小。
    176.其中,所述着色器二进制码为对所述着色器源代码进行预编译得到的。
    177.相应于上述第二种着色器的生成方法,本技术实施例还提供了另一种着色器的生成装置。下面对本技术实施例所提供的第二种着色器的生成装置进行介绍。本技术实施例所提供的第二种着色器的生成方法可以应用于电子设备中的渲染组件,该渲染组件用于生成着色器。
    178.如图9所示,一种着色器的生成装置,应用于渲染组件,所述装置包括:
    179.文件读取模块910,用于在获取到渲染指令的情况下,读取预编译结果文件;
    180.其中,所述预编译结果文件为预编译组件预先对着色器源代码进行预编译得到的。
    181.着色器生成模块920,用于基于所述预编译结果文件生成着色器。
    182.可见,本技术实施例所提供的方案中,渲染组件可以在获取到渲染指令的情况下,读取预编译结果文件,其中,预编译结果文件为预编译组件预先对着色器源代码进行预编译得到的,进而渲染组件可以基于预编译结果文件生成着色器。由于预编译组件可以预先获取着色器源代码,进而对着色器源代码进行预编译,得到预编译结果文件备用,这样,渲染组件在获取到渲染指令的情况下,可以直接读取该预编译结果文件,并基于预编译结果文件生成着色器,无需在需要处理图像渲染任务时对着色器源代码进行编译,从而大大缩短了着色器的初始化时间,缩短渲染引擎的启动时间,进而可以缩短处理图像渲染任务所需的整体时间。
    183.作为本技术实施例的一种实施方式,上述着色器生成模块920可以包括:
    184.文件解析单元,用于对所述预编译结果文件进行解析,获得所述预编译结果文件中包括的着色器二进制码;
    185.其中,所述着色器二进制码为所述预编译组件对所述着色器源代码进行预编译得到的。
    186.第一着色器生成单元,用于将所述着色器二进制码输入渲染引擎接口,以使渲染引擎根据所述着色器二进制码生成着色器。
    187.作为本技术实施例的一种实施方式,上述预编译结果文件可以包括文件头、索引表以及着色器表,其中,所述文件头包括文件头的大小;所述索引表包括所述着色器二进制码在所述预编译结果文件中的起始位置标识;所述着色器表包括所述着色器二进制码及所述着色器二进制码大小;
    188.上述文件解析单元可以包括:
    189.标识获取子单元,用于对所述预编译结果文件进行解析,获得所述文件头的大小;
    190.位置标识获取子单元,用于基于所述文件头的大小确定所述索引表的位置,并从所述索引表的位置读取所述着色器二进制码在所述预编译结果文件中的起始位置标识;
    191.位置确定子单元,用于基于所述着色器二进制码在所述预编译结果文件中的起始位置标识,确定目标着色器的着色器二进制码在所述预编译结果文件中的起始位置和结束位置,并从所述着色器表中获取所述目标着色器二进制码大小;
    192.其中,所述目标着色器为所述渲染指令所针对的着色器。
    193.代码读取子单元,用于从所述起始位置开始,读取所述目标着色器二进制码大小的着色器二进制码。
    194.作为本技术实施例的一种实施方式,上述装置还可以包括:
    195.解压处理模块,用于在基于所述预编译结果文件生成着色器之前,在所述预编译结果文件为压缩文件的情况下,对所述预编译结果文件进行解压,得到解压后的结果文件;
    196.上述着色器生成模块920可以包括:
    197.第二着色器生成单元,用于基于所述解压后的结果文件生成着色器。
    198.作为本技术实施例的一种实施方式,上述装置还可以包括:
    199.解密处理模块,用于在所述预编译结果文件包括加密后的源代码的情况下,对所述加密后的源代码进行解密处理,得到所述着色器源代码。
    200.本技术实施例还提供了一种播放器,如图10所示,播放器包括预编译组件1010和渲染组件1020,其中:
    201.所述预编译组件1010,用于执行上述任一实施例所述的第一种着色器生成方法步骤。
    202.所述渲染组件1020,用于执行任一实施例所述的第二种着色器生成方法步骤。
    203.可见,本技术实施例所提供的方案中,播放器中预编译组件可以获取着色器源代码,进而对着色器源代码进行预编译,得到预编译结果文件。播放器中的渲染组件在获取到渲染指令的情况下,读取预编译结果文件,并基于预编译结果文件生成着色器。由于预编译组件可以预先获取着色器源代码,进而对着色器源代码进行预编译,得到预编译结果文件备用,这样,渲染组件在获取到渲染指令的情况下,可以直接读取该预编译结果文件,并基于预编译结果文件生成着色器,无需在需要处理图像渲染任务时对着色器源代码进行编译,从而大大缩短了着色器的初始化时间,缩短渲染引擎的启动时间,进而可以缩短处理图像渲染任务所需的整体时间。
    204.本技术实施例还提供了一种计算机可读存储介质,所述计算机可读存储介质内存储有计算机程序,所述计算机程序被处理器执行时实现上述任一实施例所述的第一种着色
    器生成方法步骤,或者上述任一实施例所述的第二种着色器生成方法步骤。
    205.可见,本技术实施例所提供的方案中,计算机程序被处理器执行时预编译组件可以获取着色器源代码,进而对着色器源代码进行预编译,得到预编译结果文件。渲染组件在获取到渲染指令的情况下,读取预编译结果文件,并基于预编译结果文件生成着色器。由于预编译组件可以预先获取着色器源代码,进而对着色器源代码进行预编译,得到预编译结果文件备用,这样,渲染组件在获取到渲染指令的情况下,可以直接读取该预编译结果文件,并基于预编译结果文件生成着色器,无需在需要处理图像渲染任务时对着色器源代码进行编译,从而大大缩短了着色器的初始化时间,缩短渲染引擎的启动时间,进而可以缩短处理图像渲染任务所需的整体时间。
    206.需要说明的是,对于上述装置、播放器及计算机可读存储介质实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
    207.进一步需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个
    ……”
    限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
    208.本说明书中的各个实施例均采用相关的方式描述,各个实施例之间相同相似的部件互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。
    209.以上所述仅为本技术的较佳实施例而已,并非用于限定本技术的保护范围。凡在本技术的精神和原则之内所作的任何修改、等同替换、改进等,均包含在本技术的保护范围内。

    技术特征:
    1.一种着色器的生成方法,其特征在于,应用于预编译组件,所述方法包括:获取着色器源代码;对所述着色器源代码进行预编译,得到预编译结果文件,以使渲染组件在获取到渲染指令的情况下,读取所述预编译结果文件,并基于所述预编译结果文件生成着色器。2.如权利要求1所述的方法,其特征在于,所述对所述着色器源代码进行预编译,得到预编译结果文件的步骤,包括:确定所述着色器源代码对应的运行平台与所述预编译组件的运行平台是否相同;在所述着色器源代码对应的运行平台与所述预编译组件的运行平台不同的情况下,对所述着色器源代码进行转换,得到目标格式的着色器代码,其中,所述目标格式为所述预编译组件的运行平台的着色器语言格式;对所述目标格式的着色器代码进行预编译,得到预编译结果文件。3.如权利要求2所述的方法,其特征在于,所述对所述着色器源代码进行转换,得到目标格式的着色器代码的步骤,包括:对所述着色器源代码进行解析,确定所述着色器源代码包括的名词及表达式;获取所述着色器源代码对应的运行平台的第一着色器语言名词库以及所述预编译组件的运行平台的第二着色器语言名词库;基于所述第一着色器语言名词库及所述第二着色器语言名词库,将所述着色器源代码中的名词替换为所述第二着色器语言名词库中对应的名词;基于所述预编译组件的运行平台的着色器语言格式,对所述着色器源代码中的表达式进行转换,得到目标格式的着色器代码。4.如权利要求1所述的方法,其特征在于,在所述对所述着色器源代码进行预编译,得到预编译结果文件的步骤之后,所述方法还包括:在所述预编译结果文件的大小达到预设阈值的情况下,对所述预编译结果文件进行压缩,得到压缩后的结果文件。5.如权利要求1所述的方法,其特征在于,在所述对所述着色器源代码进行预编译,得到预编译结果文件的步骤之后,所述方法还包括:对所述着色器源代码进行加密处理,得到加密后的源代码;将所述加密后的源代码添加至所述预编译结果文件中。6.如权利要求1-5任一项所述的方法,其特征在于,所述预编译结果文件包括文件头、索引表以及着色器表,其中:所述文件头包括文件头的大小;所述索引表包括着色器二进制码在所述预编译结果文件中的起始位置标识;所述着色器表包括所述着色器二进制码及所述着色器二进制码大小,其中,所述着色器二进制码为对所述着色器源代码进行预编译得到的。7.一种着色器的生成方法,其特征在于,应用于渲染组件,所述方法包括:在获取到渲染指令的情况下,读取预编译结果文件,其中,所述预编译结果文件为预编译组件预先对着色器源代码进行预编译得到的;基于所述预编译结果文件生成着色器。8.如权利要求7所述的方法,其特征在于,所述基于所述预编译结果文件生成着色器的步骤,包括:
    对所述预编译结果文件进行解析,获得所述预编译结果文件中包括的着色器二进制码,其中,所述着色器二进制码为所述预编译组件对所述着色器源代码进行预编译得到的;将所述着色器二进制码输入渲染引擎接口,以使渲染引擎根据所述着色器二进制码生成着色器。9.如权利要求8所述的方法,其特征在于,所述预编译结果文件包括文件头、索引表以及着色器表,其中,所述文件头包括文件头的大小;所述索引表包括所述着色器二进制码在所述预编译结果文件中的起始位置标识;所述着色器表包括所述着色器二进制码及所述着色器二进制码大小;所述对所述预编译结果文件进行解析,获得所述预编译结果文件中包括的着色器二进制码的步骤,包括:对所述预编译结果文件进行解析,获得所述文件头的大小;基于所述文件头的大小确定所述索引表的位置,并从所述索引表的位置读取所述着色器二进制码在所述预编译结果文件中的起始位置标识;基于所述着色器二进制码在所述预编译结果文件中的起始位置标识,确定目标着色器的着色器二进制码在所述预编译结果文件中的起始位置,并从所述着色器表中获取所述目标着色器二进制码大小,其中,所述目标着色器为所述渲染指令所针对的着色器;从所述起始位置开始,读取所述目标着色器二进制码大小的着色器二进制码。10.如权利要求7所述的方法,其特征在于,在所述基于所述预编译结果文件生成着色器的步骤之前,所述方法还包括:在所述预编译结果文件为压缩文件的情况下,对所述预编译结果文件进行解压,得到解压后的结果文件;所述基于所述预编译结果文件生成着色器的步骤,包括:基于所述解压后的结果文件生成着色器。11.如权利要求7-10任一项所述的方法,其特征在于,所述方法还包括:在所述预编译结果文件包括加密后的源代码的情况下,对所述加密后的源代码进行解密处理,得到所述着色器源代码。12.一种着色器的生成装置,其特征在于,应用于预编译组件,所述装置包括:源代码获取模块,用于获取着色器源代码;预编译模块,用于对所述着色器源代码进行预编译,得到预编译结果文件,以使渲染组件在获取到渲染指令的情况下,读取所述预编译结果文件,并基于所述预编译结果文件生成着色器。13.一种着色器的生成装置,其特征在于,应用于渲染组件,所述装置包括:文件读取模块,用于在获取到渲染指令的情况下,读取预编译结果文件,其中,所述预编译结果文件为预编译组件预先对着色器源代码进行预编译得到的;着色器生成模块,用于基于所述预编译结果文件生成着色器。14.一种播放器,其特征在于,所述播放器包括预编译组件和渲染组件,其中:所述预编译组件,用于执行权利要求1-6任一项所述的方法步骤;所述渲染组件,用于执行权利要求7-11任一项所述的方法步骤。

    技术总结
    本申请实施例提供了一种着色器的生成方法、装置、播放器及存储介质,所述方法应用于预编译组件,包括:获取着色器源代码;对所述着色器源代码进行预编译,得到预编译结果文件,以使渲染组件在获取到渲染指令的情况下,读取所述预编译结果文件,并基于所述预编译结果文件生成着色器。由于预编译组件可以预先获取着色器源代码,进而对着色器源代码进行预编译,得到预编译结果文件备用,渲染组件可以直接读取该预编译结果文件,并基于预编译结果文件生成着色器,无需在需要处理图像渲染任务时对着色器源代码进行编译,从而大大缩短了着色器的初始化时间,缩短渲染引擎的启动时间,进而可以缩短处理图像渲染任务所需的整体时间。缩短处理图像渲染任务所需的整体时间。缩短处理图像渲染任务所需的整体时间。


    技术研发人员:黄宋悦 张欣 陈杰
    受保护的技术使用者:杭州海康威视数字技术股份有限公司
    技术研发日:2020.11.23
    技术公布日:2022/5/25
    转载请注明原文地址:https://tc.8miu.com/read-16962.html

    最新回复(0)