CN114210055B - 一种图像渲染方法和电子设备 - Google Patents
一种图像渲染方法和电子设备 Download PDFInfo
- Publication number
- CN114210055B CN114210055B CN202210159851.5A CN202210159851A CN114210055B CN 114210055 B CN114210055 B CN 114210055B CN 202210159851 A CN202210159851 A CN 202210159851A CN 114210055 B CN114210055 B CN 114210055B
- Authority
- CN
- China
- Prior art keywords
- rendering
- electronic device
- instruction
- frame
- frame buffer
- 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
Images
Classifications
-
- A—HUMAN NECESSITIES
- A63—SPORTS; GAMES; AMUSEMENTS
- A63F—CARD, BOARD, OR ROULETTE GAMES; INDOOR GAMES USING SMALL MOVING PLAYING BODIES; VIDEO GAMES; GAMES NOT OTHERWISE PROVIDED FOR
- A63F13/00—Video games, i.e. games using an electronically generated display having two or more dimensions
- A63F13/50—Controlling the output signals based on the game progress
- A63F13/52—Controlling the output signals based on the game progress involving aspects of the displayed game scene
-
- A—HUMAN NECESSITIES
- A63—SPORTS; GAMES; AMUSEMENTS
- A63F—CARD, BOARD, OR ROULETTE GAMES; INDOOR GAMES USING SMALL MOVING PLAYING BODIES; VIDEO GAMES; GAMES NOT OTHERWISE PROVIDED FOR
- A63F13/00—Video games, i.e. games using an electronically generated display having two or more dimensions
- A63F13/80—Special adaptations for executing a specific game genre or game mode
- A63F13/837—Shooting of targets
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/451—Execution arrangements for user interfaces
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5027—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resource being a machine, e.g. CPUs, Servers, Terminals
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Multimedia (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Human Computer Interaction (AREA)
- Image Generation (AREA)
- Controls And Circuits For Display Device (AREA)
Abstract
本申请实施例公开了一种图像渲染方法和电子设备,涉及图像处理领域,能够实现对半透明粒子渲染结果的合理复用,从而有效降低多帧图像渲染过程中,针对半透明粒子渲染的重复开销,进而减少由此导致的功耗、算力的浪费。具体方案为:该应用程序下发第一指令流,该第一指令流用于指示该电子设备执行第一帧图像的渲染操作,该第一帧图像中包括第一主场景以及第一半透明粒子。该电子设备合成第一渲染结果以及第二渲染结果,获取该第一帧图像。该第一渲染是该第一主场景的渲染结果,该第二渲染结果是该第一半透明粒子的渲染结果,该第二渲染结果存储在该电子设备的第一帧缓冲中。
Description
技术领域
本申请实施例涉及图像处理领域,尤其涉及一种图像渲染方法和电子设备。
背景技术
随着电子设备的发展,显示图像的内容也越来越丰富。在一些图像中,可以包括半透明粒子。而对于连续多个帧图像中半透明粒子的渲染,会对电子设备产生较大的渲染开销,表现为电子设备算力消耗大、发热严重等,影响用户体验。
发明内容
本申请实施例提供一种图像渲染方法和电子设备,能够实现对半透明粒子渲染结果的合理复用,从而有效降低多帧图像渲染过程中,针对半透明粒子渲染的重复开销,进而减少由此导致的功耗、算力的浪费。
为了达到上述目的,本申请实施例采用如下技术方案:
第一方面,提供一种图像渲染方法,应用于电子设备,该电子设备中安装有应用程序,该方法包括:该应用程序下发第一指令流,该第一指令流用于指示该电子设备执行第一帧图像的渲染操作,该第一帧图像中包括第一主场景以及第一半透明粒子。该电子设备合成第一渲染结果以及第二渲染结果,获取该第一帧图像。该第一渲染是该第一主场景的渲染结果,该第二渲染结果是该第一半透明粒子的渲染结果,该第二渲染结果存储在该电子设备的第一帧缓冲中。
基于该方案,电子设备可以在进行第一帧图像的渲染时,不需要执行对该图像中半透明粒子的渲染过程。作为代替,电子设备可以从对应的存储空间,如第一帧缓冲,中读取该半透明粒子的渲染结果。这样,就可以节省对当前帧图像的半透明粒子的渲染开销,同时可以不影响第一帧图像上半透明粒子的显示。
在一种可能的设计中,该第一指令流中包括第一指令段和第二指令段,该第一指令段用于指示该电子设备对该第一主场景进行渲染以获取该第一渲染结果,该第二指令段用于指示该电子设备对该第一半透明粒子进行渲染。在该电子设备合成第一渲染结果以及第二渲染结果之前,该方法还包括:该电子设备根据该第一指令段进行渲染获取该第一渲染结果。该电子设备从该第一帧缓冲中获取该第二渲染结果。基于该方案,提供了一种第一帧图像中主场景渲染结果以及半透明粒子的渲染结果的获取方案。比如,电子设备可以基于当前帧图像中下发的对应的指令流进行渲染,获取对应的主场景渲染结果。又如,电子设备可以直接从第一帧缓冲中读取该半透明粒子对应的渲染结果。本示例中,该第一帧图像可以是进行半透明粒子渲染结果复用的帧图像。
在一种可能的设计中,该第二渲染结果是该电子设备对第二帧图像进行渲染后,存储在该第一帧缓冲中的,该第二帧图像的渲染早于该第一帧图像的渲染。基于该方案,电子设备可以在进行第一帧图像之前进行渲染时,比如进行第二帧图像进行渲染时,将完成渲染的结果存储在第一帧缓冲中,由此实现后续帧图像的复用。
在一种可能的设计中,在该应用程序下发该第一指令流之前,该方法还包括:该应用程序下发第二指令流,该第二指令流用于指示该电子设备执行第二帧图像的渲染操作,该第二帧图像中包括第二主场景以及该第一半透明粒子。基于该方案,应用程序可以在执行半透明粒子的复用之前,下发进行第二帧图像的渲染的指令。该第二帧图像中可以包括对应的主场景渲染指令以及半透明粒子的渲染指令。在多个连续帧图像的显示中,各个帧图像中都可以包括半透明粒子,那么就可以通过本申请实施例提供方案进行半透明粒子渲染结果的复用。
在一种可能的设计中,该第二指令流中包括第三指令段和第四指令段,该第三指令段用于指示该电子设备对该第二主场景进行渲染以获取第三渲染结果,该第四指令段用于指示该电子设备对该第二帧图像中的该第一半透明粒子进行渲染。在该应用程序下发第二指令流之前,该方法还包括:该电子设备根据该第三指令段进行渲染获取该第三渲染结果。该电子设备根据该第四指令段获取该第四渲染结果。类似于第一帧图像对应的指令流,在其他帧图像的指令流中,也可以包括对主场景以及半透明粒子的渲染指令。在本示例中,该第二帧图像可以是不进行半透明粒子复用的帧图像。该第二帧图像可以为应用程序开始运行之后的第1帧图像。那么没有经过其他帧图像的渲染,因此不存在可以复用的半透明粒子渲染结果。或者,第二帧图像可以是不符合预设规则要求的帧图像。比如,该第二帧图像与已经存储的半透明粒子的渲染结果对应帧图像中,半透明粒子的位置等相差较大,无法进行较好的复用。那么,在该第二帧图像中就可以重新进行半透明粒子的渲染,从而获取新的渲染结果供后续帧图像进行复用。
在一种可能的设计中,该方法还包括:该电子设备创建该第一帧缓冲。该电子设备根据该第四指令段获取该第四渲染结果,包括:该电子设备将该第四指令段指示的帧缓冲替换为该第一帧缓冲,以获取第五指令段。该电子设备执行该第五指令段的渲染操作,以获取该第一半透明粒子的第二渲染结果,并将该第二渲染结果存储在该第一帧缓冲中。基于该方案,提供了一种具体的进行半透明粒子渲染结果备份存储的方案。在第二帧图像中,可以通过替换帧缓冲ID的形式,将半透明粒子渲染结果存储在对应的第一帧缓冲里。该第一帧缓冲可以是基于本方案新创建的,那么在后续渲染的过程中,电子设备就可以通过该新创建的帧缓冲进行数据的复用。
在一种可能的设计中,该电子设备根据该第一指令流中,预设的开头指令以及结尾指令,确定该第二指令段。基于该方案,提供了一种具体的确定半透明粒子的渲染指令流的方案。比如,开头指令可以为glEnable()或者glEnablei()指令。又如,结尾指令可以为glDisable()指令或者glDisablei()指令。通过识别该第二指令段,电子设备就可以明确半透明粒子的渲染指令流。在本申请的另一些实现中,该结尾指令也可以为glDiscardFramebufferEXT()。
在一种可能的设计中,该电子设备根据该第二指令流中,预设的开头指令以及结尾指令,确定该第四指令段。基于该方案,提供了针对第二指令流中,确定半透明粒子的渲染指令流的方案。比如,开头指令可以为glEnable()或者glEnablei()指令。又如,结尾指令可以为glDisable()指令或者glDisablei()指令。在本申请的另一些实现中,该结尾指令也可以为glDiscardFramebufferEXT()。
在一种可能的设计中,该电子设备中设置有拦截模块、创建模块以及替换模块,该方法包括:该拦截模块用于拦截该第四指令段。该创建模块用于创建该第一帧缓冲。该替换模块用于根据该第一帧缓冲的标识(ID)以及该拦截的第四指令段,替换该第四指令段中的帧缓冲ID,以获取指向该第一帧缓冲的第五指令段。该电子设备的图形处理器(GPU)根据该第五指令段,执行该第一半透明粒子的渲染,并将获取的该第二渲染结果存储在该第一帧缓冲中。基于该方案,提供了电子设备中具体的一种软件划分,通过各个模块的交互实现本申请提供的半透明粒子的复用方案。
在一种可能的设计中,该电子设备中还设置有合并模块,该方法还包括:该合并模块用于指示该GPU合并该第二渲染结果以及该第三渲染结果,以获取该第二帧图像的渲染结果。基于该方案,本申请中,半透明粒子的渲染结果与主场景的渲染结果可以是分别进行渲染的,因此可以通过合并模块下发的指令,指示GPU将两个渲染结果进行合并,从而获取完整的渲染结果。
在一种可能的设计中,该方法还包括:根据第三帧图像的过程确定该主场景的帧缓冲ID,该主场景的帧缓冲是该第三帧图像的处理过程中,绘制命令(Drawcall)数量最大的帧缓冲。基于该方案,提供了一种主场景的确定方式。在确定主场的帧缓冲ID之后,后续其他帧缓冲也可以采用该帧缓冲ID进行主场景的渲染,由此使得在后续帧图像中电子设备可以明确进行主场景渲染的指令流,还可以根据主场景对应帧缓冲中的数据以及半透明粒子的渲染结果进行合并从而获取对应帧图像的完整渲染结果。
在一种可能的设计中,在该电子设备中设置有计数器,该电子设备每执行一次帧图像的渲染,该计数器加1。在该电子设备合成第一渲染结果以及第二渲染结果,获取该第一帧图像之前,该方法还包括:该电子设备确定该第一帧图像渲染时,该计数器的值符合预设规则。基于该方案,提供了一种半透明粒子的复用方案。对于多个帧图像的渲染过程中,可以针对其中几个帧图像执行半透明粒子的复用。比如,隔一帧复用一次。这样,可以节省部分帧图像的半透明粒子渲染开销,同时能够通过隔一帧复用一次的方案,实现半透明粒子的及时更新,进而使得复用效果的准确合理。
在一种可能的设计中,在该电子设备确定该第一帧图像渲染时,该计数器的值不符合预设规则的情况下,该方法还包括:该电子设备创建该第一帧缓冲,将该第一指令流中用于指示进行第一半透明粒子渲染的指令段指向的帧缓冲替换为该第一帧缓冲,该电子设备执行该第一半透明粒子的渲染,并存储在该第一帧缓冲中。基于该方案,对于不需要进行复用的帧图像,电子设备可以对应执行原生逻辑指示的正常渲染。由此实现对应帧图像的渲染以及半透明粒子的渲染结果的更新。
在一种可能的设计中,该预设规则为:该计数器的值为偶数。基于该方案,提供了一种预设规则的方案。由此实现隔一帧复用的效果。比如,从第2帧开始进行复用。此外,对于奇数帧不复用的方案设置,可以使得第1帧图像可以不进行复用,从而避免由于之前没有进行过半透明粒子的渲染而导致的复用失败的情况。
在一种可能的设计中,在该电子设备合成第一渲染结果以及第二渲染结果,获取该第一帧图像之前,该方法还包括:该电子设备根据确定该第一帧图像渲染时的视角变化小于预设的视角阈值。基于该方案,在执行复用之前还可以通过其他判断机制使得复用效果更加准确。比如,在视角变化较小时,则表明两个帧图像中半透明粒子的位置比较接近,由此保证后续复用效果的准确性。
在一种可能的设计中,该电子设备根据该第一帧图像的MVP矩阵以及第二帧图像的MVP矩阵,确定该视角变化,该第二帧图像的渲染早于该第一帧图像的渲染。基于该方案,提供了一种确定视角变化的具体方案。其中,当前帧图像(如第一帧图像)的MVP矩阵可以是通过应用程序下发的指令流确定的。第二帧图像的MVP矩阵可以是第二帧图像渲染过程中缓存到电子设备中。在本申请中,在更新半透明粒子渲染时,电子设备可以同时更新对应帧图像的MVP矩阵。
在一种可能的设计中,在该第一帧图像渲染时的视角变化大于预设的视角阈值的情况下,该方法还包括:该电子设备创建该第一帧缓冲,将该第一指令流中用于指示进行第一半透明粒子渲染的指令段指向的帧缓冲替换为该第一帧缓冲,该电子设备执行该第一半透明粒子的渲染,并存储在该第一帧缓冲中。基于该方案,在视角变化较大时,则可以不执行半透明离粒子的复用,而是直接进行半透明粒子的渲染。
在一种可能的设计中,该方法还包括:该电子设备根据该第一渲染结果和该第一帧缓冲中的渲染结果,合并获取该第一帧图像的渲染结果。基于该方案,通过合并指令,就可以获取对应帧图像的渲染结果。
第二方面,提供一种电子设备,电子设备包括一个或多个处理器和一个或多个存储器;一个或多个存储器与一个或多个处理器耦合,一个或多个存储器存储有计算机指令;当一个或多个处理器执行计算机指令时,使得电子设备执行如上述第一方面以及各种可能的设计中任一种的图像渲染方法。
第三方面,提供一种芯片系统,芯片系统包括接口电路和处理器;接口电路和处理器通过线路互联;接口电路用于从存储器接收信号,并向处理器发送信号,信号包括存储器中存储的计算机指令;当处理器执行计算机指令时,芯片系统执行如上述第一方面以及各种可能的设计中任一种的图像渲染方法。
第四方面,提供一种计算机可读存储介质,计算机可读存储介质包括计算机指令,当计算机指令运行时,执行如上述第一方面以及各种可能的设计中任一种的图像渲染方法。
第五方面,提供一种计算机程序产品,计算机程序产品中包括指令,当计算机程序产品在计算机上运行时,使得计算机可以根据指令执行如上述第一方面以及各种可能的设计中任一种的图像渲染方法。
应当理解的是,上述第二方面,第三方面,第四方面,以及第五方面提供的技术方案,其技术特征均可对应到第一方面及其可能的设计中提供的图像渲染方法,因此能够达到的有益效果类似,此处不再赘述。
附图说明
图1为一种半透明粒子的示意图;
图2为一种渲染过程的示意图;
图3为多帧图像的半透明粒子渲染示意图;
图4为本申请实施例提供的多帧图像的半透明粒子渲染示意图;
图5为本申请实施例提供的电子设备的软件划分示意图;
图6为本申请实施例提供的一种图像渲染的模块交互示意图;
图7为本申请实施例提供的又一种图像渲染的模块交互示意图;
图8为本申请实施例提供的又一种图像渲染的模块交互示意图;
图9为本申请实施例提供的一种图像渲染方法的流程示意图;
图10为本申请实施例提供的又一种图像渲染的模块交互示意图;
图11为本申请实施例提供的又一种图像渲染的模块交互示意图;
图12为本申请实施例提供的又一种图像渲染方法的流程示意图;
图13为本申请实施例提供的又一种图像渲染方法的流程示意图;
图14为本申请实施例提供的又一种图像渲染方法的流程示意图;
图15为一种坐标变换的示意图;
图16为本申请实施例提供的一种参考视线的示意图;
图17为本申请实施例提供的又一种图像渲染方法的流程示意图;
图18为本申请实施例提供的一种电子设备的组成示意图;
图19为本申请实施例提供的一种芯片系统的组成示意图。
具体实施方式
电子设备可以通过其上设置的显示屏,向用户展示图像。在一些场景下,图像中可以包括半透明粒子。其中,半透明粒子可以在图像中表现为半透明状态。比如,以电子设备显示的图像为游戏场景下的图像为例。在射击类游戏中,图像中可能包括烟雾、枪火、浪花等半透明粒子。电子设备可以通过在图像中增加半透明粒子的渲染特效,增加场景显示的真实感,提升用户体验。例如,如图1所示,在区域A中可以包括浪花对应的半透明粒子的渲染特效。可以看到,区域A中的浪花可以表现为半透明状态。由此,在该帧图像中,用户可以看到半透明的浪花,还可以透过浪花看到其后的景物,从而达到模拟真实视觉体验的效果。又如,在区域B中可以包括烟雾对应的半透明粒子的渲染特效。可以看到,区域B中的烟雾可以表现为半透明状态。相比于区域A中的浪花,该烟雾的透明度可以更低。由此,通过展示该帧图像,使得用户获得模拟真实的视觉体验。
为了获取用于显示的图像数据,电子设备在展示图像之前,可以根据应用程序(如游戏应用)下发的渲染指令流,进行图像的渲染,进而获取图像数据进行显示。
结合图2,在进行某一帧图像的渲染时,游戏应用可以下发渲染指令流。中央处理器(Central Processing Unit,CPU)可以根据该渲染指令流,调用图像库中的接口,以便于指示图形处理器(Graphic Processing Unit,GPU)执行对应的渲染操作。GPU执行渲染操作的渲染结果可以存储在电子设备中,通过后续渲染指令流对应的渲染之后,就可以获取送显数据。电子设备可以根据该送显数据,在显示屏上显示该帧图像。
在一些场景下,如果当前帧图像中包括半透明粒子,则在游戏应用下发的指令流中就可以包括指示进行半透明粒子渲染的指令流A。对应的,电子设备也可以通过如图2所示的流程实现对应半透明粒子的渲染。
应当理解的是,半透明粒子不会孤立地存在某一帧图像中,而是在相邻的多帧图像中都会存在相同或相似的半透明粒子,从而实现半透明粒子显示的连续性。也就是说,在相邻的多帧图像的渲染过程中,游戏应用都会下发与指令流A类似的指令流,用于进行相同或相似半透明粒子的渲染。例如,如图3所示,在第1帧图像的渲染过程中,游戏应用会下发指令流A指示电子设备进行半透明粒子(如图1所示的区域A中的浪花)的渲染。对应的,CPU、图形库以及GPU会根据如图2所示的流程执行该区域A中浪花的渲染,以获取如图1中的区域A所示的浪花对应的渲染结果。在接下来的第2帧图像中也会包括与如第一帧图像类似的浪花。因此,在第2帧图像的渲染指令流中,会包括指令流A(或者与指令流A类似的指令流)以便指示电子设备进行浪花的渲染。对应的,CPU、图形库以及GPU依然会根据如图2所示的流程执行该浪花的渲染。
可以看到,指令流A对应的半透明粒子(如浪花)的渲染过程,在多个帧图像中被CPU、图形库以及GPU重复执行了多次,而获取的结果基本相同。而对于半透明粒子的渲染过程又较为复杂。因此,会造成多帧图像渲染过程中针对半透明粒子的渲染的重复开销。造成了电子设备进行图像渲染过程中的功耗、算力的浪费,同时导致电子设备的发热、卡顿、显示丢帧等问题。
为了解决上述问题,本申请实施例提供一种针对图像中半透明粒子的渲染方法,能够实现对半透明粒子渲染结果的合理复用。从而有效降低多帧图像渲染过程中,针对半透明粒子渲染的重复开销,进而减少由此导致的功耗、算力的浪费。
示例性的,结合图4,基于本申请实施例提供的方案,可以在前一帧图像(如第1帧图像)的渲染过程中,将半透明粒子的渲染结果存储在预设位置。这样,在后一帧图像(如第2帧图像)的渲染过程中,CPU在接收到游戏应用下发的对半透明粒子进行渲染的指令流A后,可以直接返回该指令流。也就是说,在第2帧图像的渲染过程中,不需要再次对半透明粒子进行渲染,电子设备可以在需要使用该半透明粒子的渲染结果时,复用第1帧图像对半透明粒子的渲染结果。比如,从预设位置调取该半透明粒子的渲染结果。由此避免多个帧图像中对于相同或相近的半透明粒子渲染过程的重复执行,进而降低针对半透明粒子的渲染开销。
以下结合附图对本申请实施例提供的方案进行详细说明。
需要说明的是,本申请实施例提供的图像渲染方法,可以应用在用户的电子设备中。比如,该电子设备可以是手机、平板电脑、个人数字助理(personal digitalassistant,PDA)、增强现实(augmented reality,AR)\虚拟现实(virtual reality,VR)设备、媒体播放器等便携式移动设备,该电子设备也可以是智能手表等能够提供显示能力的可穿戴电子设备。本申请实施例对该设备的具体形态不作特殊限制。
示例性的,在一些实施例中,从硬件组成的角度,本申请实施例涉及的电子设备可以包括处理器,外部存储器接口,内部存储器,通用串行总线(universal serial bus,USB)接口,充电管理模块,电源管理模块,电池,天线1,天线2,移动通信模块,无线通信模块,音频模块,扬声器,受话器,麦克风,耳机接口,传感器模块,按键,马达,指示器,摄像头,显示屏,以及用户标识模块(subscriber identification module,SIM)卡接口等。其中,传感器模块可以包括压力传感器,陀螺仪传感器,气压传感器,磁传感器,加速度传感器,距离传感器,接近光传感器,指纹传感器,温度传感器,触摸传感器,环境光传感器,骨传导传感器等。
需要说明的是,上述硬件组成并不构成对电子设备的具体限定。在另一些实施例中,电子设备可以包括更多或更少的部件,或者组合某些部件,或者拆分某些部件,或者不同的部件布置。
在另一些实施例中,本申请实施例涉及的电子设备还可以具有软件划分。以电子设备中运行有安卓操作系统为例。在该安卓操作系统中,可以具有分层的软件划分。
示例性的,图5为本申请实施例提供的一种电子设备的软件组成的示意图。如图5所示,该电子设备可以包括应用(application,APP)层,框架(Framework)层,系统库,以及硬件(HardWare)层等。
其中,应用层也可以称为应用程序层。在一些实现中,应用程序层可以包括一系列应用程序包。应用程序包可以包括相机,图库,日历,通话,地图,导航,WLAN,蓝牙,音乐,视频,短信息等应用程序。在本申请实施例中,应用程序包还可以包括需要通过渲染图像向用户展示图像或者视频的应用程序。其中,视频可以理解为多帧图像的连续播放。其中可以包括具有半透明粒子的帧图像。示例性的,该应用程序可以包括游戏类应用程序,例如和平精英®,王者荣耀®等。
框架层也可以称为应用程序框架层。该框架层可以为应用层的应用程序提供应用编程接口(application programming interface,API)和编程框架。框架层包括一些预先定义的函数。示例性的,框架层可以包括窗口管理器,内容提供器,视图系统,资源管理器,通知管理器,活动管理器,输入管理器等。窗口管理器提供窗口管理服务(Window ManagerService,WMS),WMS可以用于窗口管理、窗口动画管理、surface管理以及作为输入系统的中转站。内容提供器用来存放和获取数据,并使这些数据可以被应用程序访问。该数据可以包括视频,图像,音频,拨打和接听的电话,浏览历史和书签,电话簿等。视图系统包括可视控件,例如显示文字的控件,显示图片的控件等。视图系统可用于构建应用程序。显示界面可以由一个或多个视图组成的。例如,包括短信通知图标的显示界面,可以包括显示文字的视图以及显示图片的视图。资源管理器为应用程序提供各种资源,比如本地化字符串,图标,图片,布局文件,视频文件等等。通知管理器使应用程序可以在状态栏中显示通知信息,可以用于传达告知类型的消息,可以短暂停留后自动消失,无需用户交互。比如通知管理器被用于告知下载完成,消息提醒等。通知管理器还可以是以图表或者滚动条文本形式出现在系统顶部状态栏的通知,例如后台运行的应用程序的通知,还可以是以对话窗口形式出现在屏幕上的通知。例如在状态栏提示文本信息,发出提示音,电子设备振动,指示灯闪烁等。活动管理器可以提供活动管理服务(Activity Manager Service,AMS),AMS可以用于系统组件(例如活动、服务、内容提供者、广播接收器)的启动、切换、调度以及应用进程的管理和调度工作。输入管理器可以提供输入管理服务(Input Manager Service,IMS),IMS可以用于管理系统的输入,例如触摸屏输入、按键输入、传感器输入等。IMS从输入设备节点取出事件,通过和WMS的交互,将事件分配至合适的窗口。
在本申请实施例中,在框架层中可以设置有一个或多个功能模块,用于实现本申请实施例提供的方案。示例性的,框架层中可以设置有拦截模块、创建模块、替换模块以及合成模块等。其中,拦截模块可以用于进行相关指令的拦截。创建模块可以用于进行新的帧缓冲(FrameBuffer,FB)的创建,该新建的帧缓冲即可对应到如图4所示的预设位置。替换模块可以用于根据新建的帧缓冲替换原始命令流中绑定的帧缓冲,从而使得半透明粒子的渲染结果可以被存储在新建的帧缓冲中,以便于后续复用。合成模块可以用于将新建的帧缓冲中存储的半透明粒子与主场景进行合并,从而获取完整的渲染结果。
系统库可以包括图形库。在不同实现中,图形库可以包括如下中的至少一种:开放图形库(Open Graphics Library,OpenGL)、嵌入式系统的开放图形库(OpenGL forEmbedded Systems,OpenGL ES)、Vulkan等。在一些实施例中,系统库中还可以包括其他模块。例如:表面管理器(surface manager),媒体框架(Media Framework)、标准C库(Standard C library,libc)、SQLite、Webkit等。
其中,表面管理器用于对显示子系统进行管理,并且为多个应用程序提供了二维(2D)和三维(3D)图层的融合。媒体框架支持多种常用的音频,视频格式回放和录制,以及静态图像文件等。媒体库可以支持多种音视频编码格式,例如:动态图像专家组4(MovingPictures Experts Group,MPEG4),H.264,动态影像专家压缩标准音频层面3(MovingPicture Experts Group Audio Layer3,MP3),高级音频编码(Advanced Audio Coding,AAC),自适应多码解码(Adaptive Multi-Rate,AMR),联合图像专家组(JointPhotographic Experts Group,JPEG,或称为JPG),便携式网络图形(Portable NetworkGraphics,PNG)等。OpenGL ES和/或Vulkan提供应用程序中2D图形和3D图形的绘制和操作。SQLite为电子设备400的应用程序提供轻量级关系型数据库。
在如图5的示例中,电子设备中还可以包括硬件层。该硬件层中可以包括CPU,GPU,以及具有存储功能的存储器。在一些实现中,CPU可以用于控制框架层中的各个模块实现其各自的功能,GPU可以用于根据框架层中各个模块处理后的指令所调用的图形库(如OpenGLES)中的API执行相应的渲染处理。
以下说明中,将结合如图5所示的软件划分,对本申请实施例提供的方案进行详细说明。
本申请实施例提供的渲染方案,可以在第N帧图像渲染过程中,将半透明粒子预先存储在新建的帧缓冲中。在后面帧图像的渲染过程中,电子设备可以直接将应用程序(如游戏应用)下发的对半透明粒子的渲染指令流返回,不再重复执行,而是直接复用新建的帧缓冲中的半透明粒子的渲染结果。
以下说明中,以第N+1帧图像复用第N帧图像中渲染的半透明粒子为例。在本申请中,第N+1帧图像也可以对应到第一帧图像,对应第一指令流。第N帧图像可以对应到第二帧图像,对应第二指令流。
为了便于理解,以下首先以应用程序为游戏应用,对本申请实施例提供方案中涉及的游戏运行过程中指令流的组成,以及相关概念(如主场景等)进行简要说明。
可以理解的是,在游戏应用运行之后,会在需要进行第N帧图像的显示时,向电子设备下发包括多个指令的指令流。其中可以包括用于指示电子设备进行半透明粒子的渲染的指令流12;用于指示电子设备进行主场景渲染的指令流11;用于指示电子设备将半透明粒子与第N帧的主场景合并到同一张贴图上的指令流14等。其中,指令流12可以对应到第一指令流的第四指令段。指令流11可以对应到第一指令流的第三指令段。
与第N帧图像类似的,在其他图像的渲染中,游戏应用下发的指令流也可以包括多个。以第N+1帧图像为例。游戏应用下发的指令流可以包括:用于指示电子设备进行半透明粒子的渲染的指令流22,用于指示电子设备进行主场景渲染的指令流21,以及用于指示电子设备将半透明粒子与第N+1帧的主场景(如主场景21)合并到同一张贴图上的指令流24等。其中,指令流22可以对应到第一指令流的第二指令段。指令流21可以对应到第一指令流的第一指令段。
其中,主场景可以对应到当前帧图像的渲染渲染过程中,对应绘制指令(drawcall)数量最多的渲染管线(renderpass)。在对一帧图像的渲染过程中,可以包括多个renderpass。每个renderpass的渲染结果都可以存储在帧缓冲中。每个renderpass的渲染都可以包括多个drawcall。执行drawcall数量越多,则对应的renderpass执行完成后获取的贴图的内容就越丰富。
一般而言,不同帧图像的主场景可以不同。比如,第N帧图像的主场景可以为主场景11,第N帧图像中的主场景也可以称为第二主场景。第N+1帧图像的主场景可以为主场景21。第N+1帧图像中的主场景也可以称为第一主场景。
需要说明的是,对于一个固定的游戏场景而言,主场景对应的randerpass(即主场景对应的帧缓冲)一般不会发生变化。也就是说,对于连续的几帧图像,渲染主场景的randerpass的帧缓冲相同。因此,在本申请实施例中,可以根据第N-1帧图像渲染过程中各个randerpass中包括drawcall的数量,确定后面几帧图像的主场景。比如,第N-1帧图像的渲染完成后,电子设备可以确定在帧缓冲FB0(即ID为0的帧缓冲)上执行的drawcall数量最多。那么就可以确定后续帧图像的主场景对应帧缓冲为FB0。在本申请中,FB0也可以称为帧缓冲11。
在本申请的另一些实现中,主场景的确认也可以是实时进行的。例如,在执行第N帧图像所有渲染指令的操作之后,电子设备可以将该第N帧图像的渲染过程中drawcall数量最大的帧缓冲作为主场景的帧缓冲。类似的,对于其他帧图像,如第N+1帧图像,电子设备也可以实时执行主场景帧缓冲的确认以及更新。
在本申请中,该确定主场景的过程,可以是在执行第N帧图像的渲染之前完成的。在一些实施例中,电子设备可以在游戏开始运行并完成加载后,根据游戏应用下发的第一帧图像的渲染指令确定后续帧图像渲染过程中的主场景,或者,根据预设的第M帧图像的渲染指令确定后续帧图像渲染过程中的主场景。其中,第M帧图像可以是第N帧图像之前的帧图像。在一些实现中,M可以大于1,这样可以确保游戏稳定运行后在确定主场景。
此外,该确定主场景的步骤,可以是在游戏运行过程中只执行一次,后续帧图像均以该确定结果为准确定帧图像的。在另一些实施例中,该确定主场景的步骤,也可以是按照预设周期循环执行,以更新主场景的帧缓冲信息(如帧缓冲ID等)。在另一些实施例中,该确定主场景的步骤,也可以是根据电子设备的实时负载情况触发执行的。比如,对于游戏应用而言,在切换主场景时,电子设备的负载可能发生显著的变化。那么,在电子设备的负载变化超过预设的负载阈值时,可以触发该主场景的确定步骤,更新主场景的缓冲信息。在后续的帧图像渲染过程中,可以根据该更新后的主场景的缓冲信息执行相关操作。
在本申请实施例中,以第N帧图像的渲染过程中为例,电子设备可以响应于游戏应用下发的指令流11,进行主场景的渲染。
示例性的,结合图6。游戏应用可以下发指令流11,用于指示电子设备进行主场景的渲染。在本示例中,拦截模块可以用于执行半透明粒子相关指令流的拦截。对于其他指令流,拦截模块可以将这些指令流回调给图形库,以便指示GPU执行相应的渲染操作,从而避免渲染过程出错。对于拦截模块识别来自游戏应用的指令流是否是半透明粒子渲染相关指令流的方案,将在后续图7的说明中详细陈述。例如,半透明粒子渲染相关指令流可以以固定的指令开头,以固定的指令结尾。那么拦截模块就可以通过识别该固定的开头指令以及固定的结尾指令,实现对半透明粒子相关指令流的拦截。
如图6所示,对于指令流11,拦截模块可以直接将该指令流11回调给图形库,由此调用对应的API,指示GPU执行主场景的渲染。可以理解的是,在该第N帧图像开始渲染之前,电子设备可以根据前述方案确定主场景对应的帧缓冲为帧缓冲11(如FB0)。因此,在完成FB0上的渲染之后,就完成了该第N帧图像中主场景的渲染。由此,电子设备就可以获取第N帧图像中主场景的渲染结果,即存储在帧缓冲11中的主场景11。
结合前述关于第N帧图像的指令流的说明。游戏应用还可以下发指示进行半透明粒子渲染的指令流12。
示例性的,图7示出了本申请实施例中,第N帧图像中对于半透明粒子的渲染过程。
如图7所示,在进行第N帧图像的渲染过程中,游戏应用可以下发指令流12,指示电子设备进行半透明粒子的渲染。在本申请中,该指令流12可以是游戏应用下发的指令流中,以glEnable指令开始,以glDisable指令结束的指令段。该glEnable指令即可对应到上述说明中的开头指令,glDisable指令即可对应到上述说明中的结尾指令。
应当理解的是,在进行第N图像的渲染过程中,以渲染环境为OpenGL为例。由于OpenGL是一个状态机,因此,在渲染半透明粒子时需要改变相应的渲染状态。此外,为了渲染出不同的透明度级别,需要通过会使能(enable)颜色混合状态。在本示例中,游戏应用可以通过glEnable指令使能(enable)颜色混合状态,即通过glEnable指令指示电子设备开始进行半透明粒子的渲染。
示例性的,如下表1示出了本示例中指令流12的开始部分的一种示意。
表1
指令ID(EID) | 指令内容(Event) |
>3245 | glEnablei(GL_BLEND,0) |
>3246 | glBlendFuncSeparate(GL_DST_COLOR,GL_NONE,GL_NONE,GL_LINES) |
>3247 | glViewport(0,0,1480,720) |
在表1的示例中,游戏应用通过下发的ID为3245的指令通过glEnablei(GL_BLEND,0),即glEnablei指令指示电子设备使能颜色混合状态。那么,在后续指令中,游戏应用就可以通过不同的指令指示电子设备进行半透明粒子渲染对应的操作。例如,游戏应用可以通过ID为3246的glBlendFuncSeparate指令设置混合因子。游戏应用可以通过ID为3247的glViewport指令设置视口参数。
需要说明的是,在表1的示例中,是以使能指令为glEnablei指令为例进行说明的。在本申请的不同实现中,该glEnablei指令可以起到与glEnable指令类似的功能。其区别在于,在游戏应用下发的指令是以索引的方式进行数据寻址时,会在指令中增加索引(index)参数(如表1中的glEnablei指令中携带的0),那么,就会使用glEnablei指令进行使能。相对的,在游戏应用下发的指令没有采用索引的方式进行数据寻址时,就不需要携带index,那么,就会使用glEnable指令进行使能。以下示例中,以使用glEnable指令进行使能为例进行说明。
在表1中的每个指令下,都可以包括一个或多个具体的指示。比如,一个指令中可以包括多个绘制元素(DrawElements)。示例性的,如下表2示出了指令中包括的具体的DrawElements的一种示意。
表2
6101 | glDrawElements(1020) |
6142 | glDrawElements(231) |
6161 | glDrawElements(231) |
6162 | glDiscardFramebufferEXT(Framebuffer 557) |
如表2所示,游戏应用可以通过函数6101、函数6142、函数6161依次指示电子设备执行对应的绘制操作。在所有DrawElements执行完成后,就可以完成半透明粒子的全部渲染。
在表2的示例中,在下发所有半透明粒子的渲染指令后,游戏应用可以调用glDiscardFramebufferEXT()函数。比如,游戏应用可以在发出最后一个Drawelements之后,下发如表2所示的ID为6162的glDiscardFramebufferEXT(Framebuffer 557)。该接口主要用于在移动端底层区块延迟渲染(Tile-Based Deferred Rendering,TBRT)渲染框架下,为了减少区块(tile)与显存的数据同步造成的带宽消耗,通过该接口告知显卡驱动,当前帧的FrameBuffer的数据下一帧不需要,减少当前帧tile同步回显存以及下一帧显存同步到tile的带宽消耗。在本示例中,该glDiscardFramebufferEXT()函数可以用于指示半透明粒子的渲染指令已经下发完成。
游戏应用可以在完成glDiscardFramebufferEXT()的下发之后,在下发下一个针对其他对象(即非半透明粒子的其他对象)的DrawElements之前,通过下发glDisable指令,指示电子设备彻底关闭当前针对半透明粒子的颜色混合操作。
示例性的,如下表3示出了本示例中指令流12的结束部分的一种示意。
表3
指令ID(EID) | 指令内容(Event) |
>6167 | glBindBuffer(GL_UNIFORM_BUFFER,Buffer 15245) |
>6168 | glBufferSubData(Buffer 15254,(96 bytes)) |
>6169 | glBindBuffer(GL_UNIFORM_BUFFER,Buffer 21484) |
>6170 | glBufferSubData(Buffer 21484,(48 bytes)) |
>6171 | glDisablei(GL_BLEND,0) |
在表3输出的指令流示例中,游戏应用可以通过ID为6167的glBindBuffer()指令绑定ID为15245的帧缓冲,通过ID为6168的glBufferSubData()指令将数据传递到Buffer15254中。游戏应用还可以通过ID为6169的glBindBuffer()指令绑定ID为21484的帧缓冲,通过ID为6170的glBufferSubData()指令将数据传递到Buffer 21484中。这样,就完成了该帧图像的半透明粒子的渲染指令的下发。游戏应用可以下发ID为6171的glDisablei()指令,指示电子设备针对该半透明粒子的渲染指令下发完成,关闭颜色混合操作。
类似于前述关于glEnablei指令与glEnable指令的关系说明,在关闭颜色混合操作时,在采用不同的数据寻址时,电子设备可以使用glDisablei()指令或者glDisable()指令实现其功能。以下示例中,以电子设备使用glDisable()指令关闭颜色混合为例。
通过上述说明,可以看到,在当前帧图像(如第N帧图像)的渲染指令流中,以glEnable()指令为开头,以glDisable()指令为结尾的指令流12可以包括所有对半透明粒子的渲染指令。
需要说明的是,上述分析中,通过glEnable()指令为开头,以glDisable()指令为结尾来标识指令流12仅为一种示意。在其他实现环境中(如不同于OpenGL的渲染环境),指令流12的开头指令和/或结尾指令也可以不同。
继续参考图7,在本申请实施例中,拦截模块可以拦截该指令流12以便其他模块执行对应的操作。示例性的,拦截模块可以在识别到第N帧图像的指令流中的glEnable()指令时,开始执行拦截,直至识别到指令流中glDisable()指令为止。由此实现对指令流12的拦截。
而对于指令流12之外的指令,拦截模块可以直接回到给图形库以便执行相应的操作。例如,如图6所示的主场景渲染过程,拦截模块可以直接将指令流11回调给图形库,以便实现主场景的渲染。
在本示例中,拦截模块可以将拦截到的指令流12传输给创建模块。
示例性的,创建模块可以在接收到指令流12后,在电子设备的存储器中新建帧缓冲,用于存储对第N帧图像的半透明粒子的渲染结果。比如,创建模块可以创建帧缓冲12,用于存储半透明粒子的渲染结果。该帧缓冲12也可以称为第一帧缓冲。
应当理解的是,在现有技术中,游戏应用下发的指令流12可以通过调用图形库中的接口指示GPU对半透明粒子进行渲染并存储在对应的帧缓冲(如原始帧缓冲)。该原始帧缓冲存储的数据对于CPU一般不可见,因此无法实现在后续帧图像渲染过程中,对该原始帧缓冲中内容的复用。在本申请实施例中,通过创建新的帧缓冲,如帧缓冲12,使得后续存储在该帧缓冲12中的数据(如半透明粒子的渲染结果)可以继续被电子设备调用,从而实现数据的复用。
在本申请的一些实施例中,创建模块还可以创建其他帧缓冲。比如,创建模块可以创建帧缓冲13。该帧缓冲13可以用于执行其他的渲染操作。比如,在GPU完成对主场景以及半透明粒子的渲染之后,可以在该帧缓冲13上执行主场景以及半透明粒子的合成操作。
需要说明的是,在如图7所示的示例中,是以创建模块在接收到拦截模块发送的指令流12后创建帧缓冲12和帧缓冲13为例进行说明的。在本申请的另一些示例中,创建帧缓冲12和/或帧缓冲13的时机也可不同。例如,创建模块可以在第N帧图像开始渲染时就预先创建帧缓冲12和/或帧缓冲13。创建模块可以记录预先创建帧缓冲12和/或帧缓冲13的ID,以便后续直接使用。
可以看到,创建模块创建帧缓冲12以及帧缓冲13是用于执行后续渲染过程中的数据存储的。不直接使用原始帧缓冲的目的是为了便于后续重复调用。因此,在本申请的另一些实施例中,如果存在可以被CPU调用的可用帧缓冲,创建模块也可以不再创建新的帧缓冲,而是直接使用该已经被创建的帧缓冲即可。
作为一种示例,以第N帧图像为游戏加载完成后第1帧图像为例。由于当前帧图像为第1帧图像,一般不存在已经创建的可被CPU调用的空闲帧缓冲,那么创建模块可以根据如图7所示的机制,在接收到拦截模块发送的指令流12后创建帧缓冲12和帧缓冲13。
在本申请实施例中,为了保证帧缓冲12和帧缓冲13的后续正常使用,创建模块还可以在创建帧缓冲12和帧缓冲13之外,执行相关处理。比如创建对应的贴图、绑定贴图等。
以下对创建模块创建新的帧缓冲的过程进行举例说明。
例如,以帧缓冲12的ID为alpha_A为例。那么,帧缓冲12可以标识为FB(alpha_A)。创建模块可以通过如下过程实现对FB(alpha_A)的创建以及相关处理。
1、通过glGenTextures(1,&(Texture_A))创建用于保存半透明粒子渲染的纹理贴图Texture_A。
2、通过glGenFramebuffers(1, &( alpha_A))创建该FB(alpha_A)。
3、通过glBindFramebuffer(GL_FRAMEBUFF,alpha_A)绑定帧缓冲。
4、通过glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,GL_TEXTURE_2D,Texture_A, 0)将Texture_A绑定到FB(alpha_A)。
这样,在新创建的FB(alpha_A)上就可以进行图像的渲染。比如,将需要渲染的数据渲染到贴图Texture_A上并保存在FB(alpha_A)对应的存储空间中。
类似的,创建模块还可以进行帧缓冲13的创建以及相关处理。以帧缓冲13的ID为alpha_B为例。那么,帧缓冲13可以标识为FB(alpha_B)。创建模块可以通过如下过程实现对FB(alpha_B)的创建以及相关处理。
1、通过glGenTextures(1,&(Texture_B))创建用于保存半透明粒子渲染的纹理贴图Texture_B。
2、通过glGenFramebuffers(1, &( alpha_B))创建该FB(alpha_B)。
3、通过glBindFramebuffer(GL_FRAMEBUFF,alpha_B)绑定帧缓冲。
4、通过glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,GL_TEXTURE_2D,Texture_B, 0)将Texture_B绑定到FB(alpha_B)。
这样,在新创建的FB(alpha_B)上就可以进行图像的渲染。比如,将需要渲染的数据渲染到贴图Texture_B上并保存在FB(alpha_B)对应的存储空间中。
在本申请实施例中,创建模块还可以用于将指令流12以及新建帧缓冲的ID传输给替换模块。比如,继续以新建的帧缓冲12为FB(alpha_A),帧缓冲13为FB(alpha_B)为例。创建模块可以将指令流12、FB(alpha_A)的ID(如alpha_A)以及FB(alpha_B)的ID(如alpha_B)发送给替换模块。
替换模块可以用于根据新建的帧缓冲的ID,替换游戏应用下发的指令流12中的原帧缓冲的ID,以便于后续相关的渲染操作可以在CPU能够调用的新建的帧缓冲上执行。
示例性的,替换模块可以将指令流12中用于进行半透明粒子渲染的帧缓冲ID替换为alpha_A。由此使得后续在进行半透明粒子的渲染过程中,可以将渲染结果存储在FB(alpha_A)的贴图Texture_A上。
以指令流12中指示的进行半透明粒子的渲染的帧缓冲ID为beta_A为例。替换模块可以将指令流12中,绑定帧缓冲ID为beta_A的命令替换为绑定帧缓冲ID为alpha_A的命令。替换模块还可以将指令流12中,其他绑定在beta_A上的指令替换为绑定在alpha_A上。由此获取指向FB(alpha_A)的指令流13。该替换之后的指令流13也可以称为第五指令段。
如图7所示,替换模块可以将该指令流13传输给图形库,以便于图形库调用对应的接口,指示GPU执行第N帧图像中半透明粒子的渲染。由于该指令流13中绑定的帧缓冲指向帧缓冲12(如上述示例中的FB(alpha_A)),因此,GPU对该第N帧图像中半透明粒子的渲染结果可以保存在FB(alpha_A)的贴图Texture_A上。
由此就完成了第N帧图像中半透明粒子的渲染,渲染结果可以存储在帧缓冲12中。
需要说明的是,在不同的实现中,如图6所示的主场景的渲染过程,以及如图7所示的半透明粒子的渲染过程,两个过程的先后顺序可以是不同的。比如,在一些实现中,游戏应用可以先通过指令流11指示电子设备执行如图6所示的主场景渲染。之后,游戏应用可以通过指令流12指示电子设备执行如图7所示的半透明粒子渲染。
在本申请实施例中,完成主场景渲染以及半透明粒子渲染之后,由于两个渲染结果存储在不同的贴图上,因此需要通过合并操作将主场景和半透明粒子合并到一个贴图上。
示例性的,第N帧图像的主场景渲染结果(如主场景11)存储在帧缓冲11中,半透明粒子的渲染结果存储在帧缓冲12中。
那么,电子设备中的合成模块,就可以在完成主场景以及半透明粒子的渲染之后,指示GPU执行两个渲染结果的合成动作。
作为一种可能的实现,以电子设备首先完成如图6所示的主场景渲染,然后完成如图7所示的半透明粒子渲染年为例。结合图7,在替换模块向图形库发出了指令流13之后,则GPU就可以顺序完成半透明粒子的渲染。如图8所示,替换模块可以在向图形库发出指令流13之后,向合成模块发送半透明粒子渲染完成指示。由此使得合成模块知晓半透明粒子渲染完成。接着,合成模块可以向GPU发送指令流14,用于指示GPU执行主场景渲染结果与半透明粒子渲染结果的合成。
可以理解的是,在本示例中,在合成模块发送指令流14时,即使GPU还没有完全完成半透明粒子的渲染操作,而由于该指令流14到达GPU的时间晚于指令流13,因此在GPU的指令队列中,指令流14的执行也会在指令流13之后,因此可以保证在执行合成操作时,主场景渲染结果与半透明粒子渲染结果均已经存储在对应的帧缓冲中。
在本申请的另一些实现中,合成模块发出指令流14的触发机制也可以不同于图8。例如,GPU可以在完成指令流13的执行之后,向合成模块返回半透明粒子渲染完成指示。那么,响应于该半透明粒子渲染完成指示,合成模块就可以发出指令流14,以指示GPU执行主场景渲染结果与半透明粒子渲染结果的合成。
响应于合成模块发出的指令流14,GPU可以从帧缓冲11中读取存储的数据,以及从帧缓冲12中读取存储的数据。可以理解的是,在第N帧图像的渲染过程中,帧缓冲11中的数据为第N帧图像的主场景渲染结果(即主场景11),帧缓冲12中的数据为第N帧图像的半透明粒子的渲染结果。GPU可以在创建模块创建的帧缓冲13上执行该合成操作。示例性的,GPU可以将主场景11拷贝(copy)到帧缓冲13的贴图上,接着将帧缓冲12中的半透明粒子的渲染结果合成到帧缓冲13的贴图上,从而完成合成操作。
作为一种示例,以下给出本申请提供的一种合成操作的算法示例。
"highp vec4 color1 = texture(FB0_main, TexCoord);\n"
"highp vec4 color2 = texture(Texture_A, TexCoord);\n"
"if(color1.a < 0.001)\n"
"outColor.rgb = color1.rgb + color2.rgb;\n"
"else\n"
"outColor.rgb = color1.a * color1.rgb + (1.0f - color1.a) *color2.rgb;\n"
由此,即可在帧缓冲13上得到包括主场景以及半透明粒子的渲染结果。接着,电子设备可以根据游戏应用下发的第N帧图像中的其他指令,对该帧缓冲13上的数据继续进行处理。比如,在帧缓冲13的贴图上执行用户界面(User Interface,UI)渲染,之后获取送显数据。根据该送显数据,即可在显示屏上显示第N帧图像。
这样,即可完成第N帧图像的渲染过程。可以看到,本申请实施例中,对第N帧图像的渲染过程中,可以将半透明粒子的渲染结果存储在新建的帧缓冲上,由此实现后续帧图像的复用功能。
为了能够对本申请实施例提供的方案进行更加清楚的说明,以下结合如图9所示的交互流程图,继续对第N帧图像的渲染过程进行说明。如图9所示,该方案可以包括:
S901、在游戏应用下发指令流11后,拦截模块将指令流11回调给图形库。
其中,指令流11用于指示电子设备执行主场景的渲染。结合前述说明,拦截模块可以根据预设的开头指令以及结尾指令,执行对应指令流的拦截。对于其他指令流可以直接回调给图形库。比如,对于指令流11可以直接回调给图形库,即执行S901。
S902、图形库指示GPU执行对应的渲染操作。
示例性的,图形库根据指令流11调用对应的API,指示GPU执行主场景相关的渲染操作。渲染结果(如主场景11)可以存储在指令流11指示的帧缓冲11中。
S903、GPU渲染获取主场景11数据。
S904、GPU将主场景11数据存储在帧缓冲11中。
由此完成主场景的渲染,获取主场景对应的贴图存储在帧缓冲11中。
上述S901-S904的具体执行过程,可以参考如图6的说明,此处不再赘述。
S905、在游戏应用下发指令流12后,拦截模块拦截指令流12。
其中,指令流12可以是指示电子设备执行半透明粒子的渲染的指令。
示例性的,拦截模块可以监测游戏应用下发指令流中是否出现预设的开头指令。比如,该开头指令可以为glEnable()指令。拦截模块可以在监测到该glEnable()指令后,开始指令的拦截。拦截模块可以监测游戏应用下发指令流中是否出现预设的结尾指令。比如,该结尾指令可以为glDisable()指令。拦截模块可以在监测到该glDisable()指令后,停止指令的拦截。由此拦截到的指令就可以为指令流12。
S906、拦截模块向创建模块发送指令流12。
S907、创建模块创建帧缓冲12和帧缓冲13。
S908、创建模块将指令流12以及新建帧缓冲ID发送给替换模块。
示例性的,新建帧缓冲ID可以包括帧缓冲12以及帧缓冲13的ID。其中,发送帧缓冲12的ID的时机可以是在替换模块执行以下S909之前。发送帧缓冲13的ID的时机可以是执行合成操作之前。比如,在执行如下S914之前发送该帧缓冲13的ID。在不同实现中,帧缓冲12的ID和帧缓冲13的ID可以一同发送,也可以分开发送。
S909、替换模块将指令流12中绑定的帧缓冲替换为帧缓冲12。
其中,指令流12用于指示半透明粒子的渲染,那么指令流12中绑定的帧缓冲即用于存储半透明粒子的渲染结果。在本示例中,替换模块可以将指令流12中绑定的帧缓冲替换为新建的帧缓冲12,以在帧缓冲12中存储半透明粒子的渲染结果。
在替换模块完成S909的操作之后,就可以获取对应的指令流13。该指令流13与指令流12同样用于指示电子设备进行半透明粒子的渲染,其区别在于保存半透明粒子的帧缓冲被替换为帧缓冲12。
S910、替换模块向图形库发送指令流13。
S911、图形库指示GPU执行对应的渲染操作。
示例性的,图形库根据指令流13调用对应的API,指示GPU执行半透明粒子相关的渲染操作。这样半透明粒子的渲染结果可以存储在指令流13指示的帧缓冲12中。
S912、GPU渲染获取半透明粒子的渲染结果。
S913、GPU将半透明粒子的渲染结果存储在帧缓冲12中。
上述S905-S913的具体执行过程,可以参考如图7的说明,此处不再赘述。
S914、替换模块向合成模块发送半透明粒子渲染完成指示。
示例性的,替换模块可以在发送指令流13之后执行该S914。在一些实施例中,替换模块可以在执行该S914时,向合成模块发送帧缓冲13的ID,以便于后续在帧缓冲13上执行合成操作。
S915、合成模块向GPU发送指令流14。其中,该指令流14用于指示GPU在帧缓冲13上执行合成操作。
S916、GPU从帧缓冲11中读取主场景11数据。
S917、GPU从帧缓冲12中读取半透明粒子的渲染结果。
在一些实施例中,由于GPU已经完成主场景以及半透明粒子的渲染,因此GPU能够知晓主场景和半透明粒子的存储位置。那么GPU就可以在接收到指令流14后,执行S914以及S915。在另一些实施例中,在执行S915时,合成模块向GPU发送的指令流14中也可以携带有需要合成的帧缓冲的ID,比如,在指令流14中可以携带有帧缓冲11和帧缓冲12的ID,以便于GPU根据指令流14指示的帧缓冲执行后续S916和S917。作为一种可能的实现,合成模块携带在指令流14中的需要合成的帧缓冲ID可以是在S914中,由替换模块发送给合成模块的。
S918、GPU合成主场景11数据以及半透明粒子数据。
S919、GPU将合成结果存储在帧缓冲13中。上述S914-S919的具体执行过程,可以参考如图8的说明,此处不再赘述。
需要说明的是,在如图9的示例中,合成了主场景以及半透明粒子的渲染结果的贴图保存在帧缓冲13中。因此,电子设备还可以将当前帧图像渲染过程中,基于包括主场景以及半透明粒子渲染结果进行的其他渲染指令(如指示电子设备进行UI渲染的指令)所指向的帧缓冲替换为帧缓冲13。以便电子设备可以根据后续的渲染指令在帧缓冲13的贴图上继续执行UI等元素的渲染,从而获取完整的当前帧图像的渲染结果。
这样,通过前述图6-图9的说明,即可完成第N帧图像的渲染。在帧缓冲12中可以存储有第N帧图像的半透明粒子的渲染结果。
以下对第N+1帧图像复用第N帧图像中的半透明粒子的渲染结果的方案进行说明。
示例性的,请参考图10。在第N+1帧图像的渲染过程中,游戏应用可以下发指令流21用于指示电子设备进行第N+1帧图像的主场景的渲染。
类似于第N帧图像中的拦截机制,拦截模块可以将指令流21直接回调给图形库。对应的,图形库可以调用与指令流21对应的API指示GPU执行渲染操作。GPU可以根据指令流21的指示,实现对第N+1帧主场景的渲染操作。在主场景不变的情况下,指令流21会指示GPU将第N+1帧图像的主场景的渲染结果(如主场景21)存储在帧缓冲11中。对应的,GPU就可以在帧缓冲11(如FB0)的贴图上执行主场景21的渲染操作。
这样,在完成如图10所示的渲染流程之后,在帧缓冲11中就可以更新为第N+1帧图像的主场景的渲染结果。比如,在FB0的贴图上可以保存有主场景21对应的数据。
在本示例中,如图10所示的第N+1帧图像的主场景渲染过程,与如图6示出的第N帧图像的主场景渲染过程类似,其具体执行过程可以互相参考,此处不再赘述。
在本示例中,对第N+1帧图像的渲染中,还可以包括对半透明粒子的渲染过程。
示例性的,请参考图11。游戏应用可以下发指令流22,用于指示电子设备进行半透明粒子的渲染。与第N帧图像的指令流12类似,该指令流22的开头指令和结尾指令可以相对固定。比如,指令流22的开头指令可以为glEnsable()指令。又如,指令流22的结尾指令可以为glDisable()指令。在glEnsable()指令以及glDisable()指令之间下发的指令即为第N+1帧图像中游戏应用指示电子设备执行的半透明粒子的渲染指令。
在本示例中,拦截模块在识别到指令流22后,不再将指令流22向其他模块传递。也就是说,拦截模块可以监测游戏应用下发的指令流,在监测到glEnsable()指令时,将后续的直至glDisable()指令之前的指令全部返回,而不会下发给GPU或者其他模块进行响应处理。
这样,在第N+1帧图像的渲染过程中,虽然游戏应用下发的对半透明粒子的渲染指令,但电子设备实际并不会执行对该半透明粒子的渲染过程。由此节省第N+1帧图像渲染过程中的渲染开销。
如图11所示,拦截模块还可以在接收到指令流22之后,向合成模块发送合成触发指示。示例性的,在一些实施例中,拦截模块可以在监测到glEnsable()指令后,向合成模块发送合成触发指示。在另一些实施例中,拦截模块可以在监测到glDisable()指令后,向合成模块发送合成触发指示。该合成触发指示可以用于指示合成模块触发合成指令。
可以理解的是,在第N+1帧图像开始渲染时,在帧缓冲12中可以存储有第N帧图像渲染过程中保存的半透明粒子的渲染结果。
在执行第N+1帧图像的渲染的过程中,基于如图10所示的主场景渲染示意,在帧缓冲11中存储的数据可以被更新为第N+1帧图像的主场景21。而对于帧缓冲12,由于拦截模块将指令流22进行了返回,电子设备并不执行对应的半透明粒子的渲染,因此,在帧缓冲12中依然可以存储有第N帧图像的半透明粒子的渲染结果。
在本示例中,电子设备可以基于第N帧图像的半透明粒子的渲染结果,以及第N+1帧图像中主场景的渲染结果(如主场景21)进行合成,以获取第N+1帧图像的渲染结果。
示例性的,继续参考图11。合成模块可以在接收到合成触发指示后,向GPU发送指令流23,用于指示GPU执行帧缓冲11以及帧缓冲12中渲染结果的合成。示例性的,GPU可以响应于该指令流23,从帧缓冲11中读取主场景21,从帧缓冲12中读取半透明粒子的渲染结果,将主场景21以及半透明粒子的渲染结果合成到帧缓冲13上。由此,即可在帧缓冲13中获取第N+1帧图像的渲染结果。需要说明的是,在本示例中,该指令流23与如图8或图9所示的指令流14的功能类似,GPU响应于该指令流23执行的合成操作与如图8或图9所示的GPU响应于指令流14执行的合成操作类似,其执行过程可以互相参考,此处不再赘述。
这样,在第N+1帧图像的渲染过程中,复用了第N帧图像的半透明粒子的渲染结果,从而降低了第N+1帧图像的渲染开销。
为了能够对本申请实施例提供的方案进行更加清楚的说明,以下结合如图12所示的交互流程图,继续对第N+1帧图像的渲染过程进行说明。如图12所示,该方案可以包括:
S1201、在游戏应用下发指令流21后,拦截模块将指令流21回调给图形库。
其中,该指令流21可以用于指示电子设备执行第N+1帧图像的主场景的渲染。
S1202、图形库指示GPU执行对应的渲染操作。
S1203、GPU渲染获取主场景21数据。
S1204、GPU将主场景21数据存储在帧缓冲11中。
在本示例中,对第N+1帧图像中主场景的渲染过程与第N帧图像的渲染过程类似,该S1201-S1204的执行过程可以对应到如图10的说明。应当理解的是,在一些实施例中,该S1201-S1204的执行过程可以参考如图9所示的S901-S904,具体实施过程可以互相参考,此处不再赘述。通过该S1201-S1204即可在帧缓冲11中获取第N+1帧图像的主场景的渲染结果,如主场景21。
S1205、在游戏应用下发指令流22后,拦截模块返回该指令流22,并向合成模块发出合成触发指示。其中,指令流22可以用于指示电子设备进行第N+1帧图像的半透明粒子的渲染。
S1206、合成模块向GPU发送指令流23。该指令流23可以用于指示GPU执行合并操作。
通过该S1205-S1206的操作,电子设备就可以实现对指令流22的返回以及指示GPU执行半透明粒子渲染结果的复用的效果。其具体执行过程可以参考如图11中的说明。
S1207、GPU从帧缓冲11中读取主场景21数据。
S1208、GPU从帧缓冲12中读取半透明粒子的渲染结果。
S1209、GPU合成主场景21数据以及半透明粒子数据。
S1210、GPU将合成结果存储在帧缓冲13中。
该S1207-S1210的合并过程可以参考如图9所示的S914-S919,由此通过复用第N帧图像中的半透明粒子的渲染结果,获取第N+1帧图像的渲染结果。类似于前述图9的说明,电子设备可以将后续其他第N+1帧渲染中基于主场景以及半透明粒子的渲染结果的指令指向的帧缓冲替换到帧缓冲13中,从而实现完整的渲染处理,获取完整的第N+1帧图像的渲染结果。
通过上述如图6-图12的说明,电子设备能够在第N帧图像渲染过程中,将半透明粒子的渲染结果存储在新建的帧缓冲中。以便在第N+1帧图像中不再进行半透明粒子的渲染,而是通过复用该存储在新建的帧缓冲中的渲染结果,将其与第N+1帧图像的主场景进行合并即可获取第N+1帧图像的渲染结果。由此至少节省了第N+1帧图像的半透明粒子的渲染开销。
上述示例中,是从模块之间交互的角度对本申请实施例提供的方案进行说明的。以下将从电子设备的角度,继续对本申请实施例提供的方案进行说明。
示例性的,请参考图13,为本申请实施例提供的一种图像渲染的流程示意图。如图13所以,该方案可以包括:
S1301、电子设备确定主场景对应的帧缓冲11。
结合前述说明,电子设备可以在第N帧图像开始处理之前,确定主场景对应的帧缓冲11。比如,可以确定已经完成渲染的帧图像中,drawcall数量最大的渲染管线的帧缓冲为主场景的帧缓冲。
S1302、电子设备在帧缓冲11上进行第N帧图像的主场景渲染获取主场景11。
从S1302开始,电子设备可以根据游戏应用下发的指令流执行第N帧图像的渲染。
S1303、电子设备在新创建的帧缓冲12上存储第N帧图像的半透明粒子的渲染结果。
S1304、电子设备根据主场景11以及半透明粒子的渲染结果确定第N帧图像的渲染结果。
该S1302-S1304的执行过程可以对应到如图6-图9的方案说明,具体实施过程可以互相参考。
S1305、电子设备在帧缓冲11上进行第N+1帧图像的主场景渲染获取主场景21。
S1306、电子设备根据主场景21以及半透明粒子数据确定第N+1帧图像的渲染结果。
该S1305-S1306的执行过程可以对应到电子设备对第N+1帧图像的渲染过程,其具体实施过程可以参考如图10-图12的说明。
应当理解的是,上述如图6-图13的说明,均是以第N+1帧图像复用第N帧图像的半透明粒子渲染结果为例进行说明的。其中,第N帧图像可以为游戏开始运行之后的任意一帧图像。而对于第N帧图像后的不同于第N+1帧图像,在一些实施例中也可以继续复用第N帧图像的半透明粒子渲染结果,在另一些实施例则可以复用其他帧图像的半透明粒子渲染结果,或者重新执行当前帧图像的半透明粒子的渲染,以便更新半透明粒子的渲染结果,获取更加准确的渲染结果。
在本申请实施例中,在电子设备中可以预设有相应的策略,用于确定需要执行半透明粒子渲染的帧图像,以及用于复用半透明粒子的帧图像。
示例性的,电子设备可以根据当前正在渲染的帧图像的特征(如当前执行渲染的帧图像是游戏开始运行后第几帧图像等),确定是否执行半透明粒子的复用。
作为一种示例,在电子设备中可以设置有计数器,每个帧图像开始渲染时,计数器执行++1。例如,游戏开始运行后,第1帧图像开始渲染时,计数器++1,结果为1,用于标识当前帧图像为第1帧图像。又如,第N帧图像开始渲染时,计数器++1,结果为N,用于标识当前帧图像为第N帧图像。这样,电子设备就可以根据计数器的值,结合预设规则,确定对当前帧图像是否执行半透明粒子的渲染或者复用。
需要说明的是,在游戏开始运行之后,执行第1帧图像的渲染时,由于没有进行过半透明粒子的渲染,因此不会执行半透明粒子渲染结果的复用。那么,在预设规则中,可以覆盖该情况,比如,在电子设备中预设规则可以为:计数器的值是否为偶数,如果是,则执行半透明粒子的渲染,如果不是(即计数器的值为奇数),则执行半透明粒子的复用。那么,在第1帧图像执行渲染时,由于计数器的值为1,即为奇数,因此可以在新创建的帧缓冲上执行半透明粒子的渲染。对应的,在执行第2帧图像的渲染时,计数器++1,结果为2,即偶数。因此可以执行半透明粒子的复用。
示例性的,结合图13的流程示意图,请参考图14,为本申请实施例提供的又一种图像渲染的流程示意图。如图14所示,该方案可以包括:
S1401、确定主场景对应的帧缓冲11。
结合前述说明,该确定主场景的过程可以是在开始当前帧图像的渲染之前执行的。
S1402、在开始当前帧图像的渲染时,计数器加1。
在本示例中,通过计数器加1,使得计数器的值可以用于标识当前帧图像的特征。这样,不同帧图像就可以具有不同特征,对应的,通过计数器的值就能够区分不同的帧图像。
S1403、在帧缓冲11上进行当前帧图像的主场景渲染获取主场景11。
示例性,该过程可以参考前述示例中对第N帧图像或者第N+1帧图像的主场景渲染过程。
S1404、判断计数器的值是否符合预设规则。
在本示例中,可以根据预设规则,确定是否执行半透明粒子的渲染或者复用。例如,以预设规则为:计数器的值是否为偶数。如果计数器的值是偶数,则执行半透明粒子的复用,即执行S1407。反之,如果计数器的值为不是偶数,即为奇数,则执行半透明粒子的渲染,即执行以下S1405-S1406。
S1405、在新创建的帧缓冲12上进行当前帧图像的半透明粒子的渲染结果。
S1406、根据主场景11以及半透明粒子的渲染结果确定当前帧图像的渲染结果。
该过程可以参考前述示例中的第N帧图像的渲染过程。由此在实现当前帧图像的渲染结果的同时,在帧缓冲12上保存对应的半透明粒子的渲染结果。以便其他帧图像复用该半透明粒子的渲染结果。
S1407、根据主场景11数据以及存储在帧缓冲12中的半透明粒子渲染结果确定当前帧图像的渲染结果。
该过程可以参考前述示例中的第N+1帧图像的渲染过程。由此实现当前帧图对于半透明粒子渲染结果的复用。
可以理解的是,图14所示的流程示意作为本申请的一种可能实现,可以应用到包括第N帧以及第N+1帧图像的渲染过程中,从而支持如图6-图13中所示的方案实现。
上述示例中,在执行当前帧图像的渲染过程中,可以根据预设规则判断是否触发对已有半透明粒子的渲染结果的复用。在本申请的另一些实施例中,电子设备还可以结合其他判断条件,确定是否触发对半透明粒子的渲染结果的复用,从而使得半透明粒子的渲染结果的复用更加严格,由此获取更加准确的渲染结果。
示例性的,电子设备可以结合当前帧图像中半透明粒子与之前帧图像中半透明粒子在图像中位置的变化情况,确定两个帧图像中半透明粒子的渲染结果是否可以复用。
应当理解的是,半透明粒子属于高频信号(即对应着图像变化剧烈的细节部分)。人眼对于高频信号较为敏感,因此当游戏人物视角大幅晃动时,半透明粒子需要实时更新。
在本示例中,可以通过模型-观察-投影(Model-View-Projection,MVP)矩阵的变化情况,确定人物视角是否出现大幅晃动。
以下结合图15对MVP矩阵进行简要说明。在进行图像渲染的过程,电子设备需要确定当前帧图像中包括的一个或多个对象的顶点位置。示例性的,应用程序下发的渲染命令中,可以包括对象的顶点坐标。在一些实现中,该渲染命令中包括的顶点坐标可以是基于对象自身的局部坐标系的坐标。在本申请中,对象基于局部坐标系的分布空间可以称为局部空间(Local Space)。电子设备为了能够确定对象在显示屏上各个顶点的坐标,可以基于局部空间中对象的坐标进行矩阵变换。由此获取对象在基于显示屏的空间(如称为屏幕空间(Screen Space))坐标系下的坐标。
作为一种示例,电子设备可以通过局部空间向世界空间(World Space)向观察空间(View Space)向裁剪空间(Clip Space)向屏幕空间(Screen Space)的矩阵变换处理,将对象的各个顶点在局部空间下的局部坐标转换为屏幕空间下的坐标。
示例性的,如图15所示,示出了一种坐标由局部空间向世界空间向观察空间向裁剪空间的矩阵变换的逻辑过程示意。在本示例中,游戏应用下发的渲染命令中,可以包括对物体1的渲染。如图15所示,在局部空间中,坐标系可以是基于物体1的。比如,局部空间中的坐标系原点可以是设置在物体1的中心,或者一个顶点所在的位置等。游戏应用可以在下发对物体1的渲染命令中,携带该局部空间的坐标系下,物体1的各个顶点的坐标,即局部坐标。电子设备可以通过游戏应用下发的M矩阵,将局部空间中的坐标转换为世界空间中的坐标。其中,世界空间可以是相对于局部空间更大的区域。比如,以游戏应用下发的渲染命令用于进行游戏图像的渲染为例。局部空间可以对应能够覆盖某一个对象(如物体1)的较小区域。而世界空间可以对应游戏中,包括物体1以及其他物体(如物体2)的一张地图的区域。电子设备可以将局部空间中的局部坐标,结合M矩阵进行M矩阵变换,从而获取物体1在世界空间中的坐标。类似的,在游戏应用下发了在该帧图像中的对物体2的渲染命令的情况下,通过上述M矩阵变换,电子设备还可以获取物体2在世界空间中的坐标。
在获取当前帧图像中,各个物体的顶点在世界空间中的坐标之后,电子设备可以根据游戏应用下发的V矩阵,将世界空间中的坐标,转换为观察空间中的坐标。可以理解的是,世界空间中的坐标可以是三维空间中的坐标。而电子设备在向用户展示帧图像时,各个对象(如物体1,物体2等)则是在二维的显示屏上进行显示的。在使用不同的观察角度观察世界空间中的对象时,则会看到不同的二维画面。该观察角度可以是与在世界空间中设置的摄像机(或者观察者)的位置相关的。在本示例中,与摄像机位置对应的坐标空间可以称为观察空间。示例性的,以摄像机设置在世界空间中的y轴正方向为例。那么基于V矩阵的变换,就可以获取在该摄像机位置对应的观察空间中,物体1和物体2的各个顶点的坐标。如图15所示,由于摄像机位于y轴正方向,向下进行拍摄,因此对应在观察空间中的物体1和物体2可以呈现为俯视效果。
在电子设备获取观察空间中的各个对象的坐标后,可以将其投影到裁剪坐标。该裁剪坐标对应的坐标空间可以称为裁剪空间。可以理解的是,在进行V矩阵变换过程中,可以是对世界空间中的较大区域的变换,因此获取的图像范围可能是比较大的。而由于电子设备显示屏的尺寸有限,因此可能无法将该观察空间中的所有对象同时进行显示。在本示例中,电子设备就可以将观察空间中的各个对象的坐标,投影到裁剪空间中。在投影到裁剪空间中后,能够显示在显示屏上的对象的坐标可以在-1.0到1.0的范围内。而对于无法显示在显示屏上的部分对象的坐标,则可以在-1.0到1.0的范围之外。这样,电子设备就可以根据坐标在-1.0到1.0范围内的顶点坐标进行对应的显示。示例性的,电子设备可以根据游戏应用下发的P矩阵,对观察空间中的各个坐标进行P矩阵变换,从而获取各个坐标对应的在裁剪空间中的裁剪坐标。
因此,MVP矩阵在发生显著变化时,则标识游戏中人物的视角出现了显著的偏转。这样,之前的半透明粒子的位置在当前帧图像中显然不在适用。在本示例中,电子设备还可以根据视角变化是否在预设的视角阈值之内,确定是否执行半透明粒子的复用。在一些实施例中,为例能够确定不同帧图像中的视角变化,如图16所示,可以构建基于观察空间的参考相机。基于当前帧图像的MVP矩阵,即可换算得到参考相机在世界空间中的参考视线方向。类似的,基于之前帧图像的MVP矩阵,也可换算获取对应帧图像的参考视线方向。电子设备通过对比两个参考时间方向,接口确定视角变化。在一些实施例中,视角变化量可以为不同帧图像的参考视线方向的夹角。
作为一种可能的实现,在电子设备中可以构造一个可以参照的相机观察方向,如矩阵表示为(10,0,0,0),该方向可以是基于观察空间的方向。在执行当前帧图像的渲染时,电子设备可以根据游戏应用下发的指令,确定当前帧图像的MVP矩阵。例如,电子设备可以根据游戏应用下发给CPU的指令中,通过glBufferSubData()等指令传递的uniform矩阵获取MVP矩阵的数据。这样,电子设备可以获取第N帧图像的P矩阵(如记为P_N)、VP逆矩阵(如记为VP_INV_N),以及M矩阵(如记为M_N)。类似的,电子设备可以获取其他帧图像的MVP矩阵。例如,电子设备可以在第N+1帧图像渲染过程中,获取第N+1帧图像的P矩阵(如记为P_N+1)、VP逆矩阵(如记为VP_INV_N+1),以及M矩阵(如记为M_N+1)。
这样,在进行第N+1帧图像的渲染过程中,电子设备就可以根据第N+1帧图像与第N帧图像的视角变化情况,确定是否可以复用第N帧图像的半透明粒子的渲染结果。
示例性的,电子设备可以根据如下计算方法确定视角变化:
cameraToWorld = (10,0,0,0) * P_N * VP_INV_N;//第N帧图像中,相机在世界坐标中的位置;
preCameraToWorld = (10,0,0,0) * P_N+1 * (VP_INV_N+1);第N+1帧图像中,相机在世界坐标中的位置;
alpha=cameraToWorld- M_N; //第N帧图像中相机方向矩阵;
beta= preCameraToWorld- (M_N+1); //第N+1帧图像中相机方向矩阵;
aProductb = alpha[0] * beta[0] + alpha[1] * beta[1] + alpha[2] * beta[2];
aMode = std::sqrt(alpha[0] * alpha[0] + alpha[1] * alpha[1] + alpha[2] * alpha[2]);
bMode = std::sqrt(beta[0] * beta[0] + beta[1] * beta[1] + beta[2] *beta[2]);
cosRes = aProductb/(aMode *bMode);
turnTheta = (std::acos(cosRes)*180)/PI。
最终获取的turnTheta角度就可以是第N+1帧图像与第N帧图像的视角变化。
电子设备可以根据该turnTheta与预设的角度阈值之间的大小关系,确定是否可以复用第N帧图像的半透明粒子的渲染结果。比如,在turnTheta小于预设的角度阈值时,则表明两帧图像之间差异较小,可以复用半透明粒子的渲染结果。对应的,在turnTheta大于预设的角度阈值时,则表明两帧图像之间差异较大,不能复用半透明粒子的渲染结果。
基于此,请参考图17,为本申请实施例提供的又一种图像渲染方法的流程示意图。该方案在图14的基础上增加了对于视角变化的判断步骤,从而获取更加准确的渲染结果。如图17所示,本示例中的方案区别与图14的方案,在执行S1404之后,如果判断符合预设规则,则执行S1701继续进行判断。即判断视角变化是否小于视角阈值。在该S1701的判断之前,可以执行S1702,即根据当前帧图像的MVP矩阵,以及备份MVP矩阵,确定视角变化。具体执行方式可以参考以上示例中视角变化的确定方案。在该S1702的判断中,在视角变化小于视角阈值时,则表明可以进行半透明粒子的复用,即执行S1407。对应的,在视角变化大于视角阈值时,则表明不能进行半透明粒子的复用,返回执行S1405。
这样,在执行复用之前,可以进一步根据视角变化确定是否可以进行半透明粒子的复用,从而提升半透明粒子的复用准确性,提升最终获取图像的质量。
上述主要从各个服务模块的角度对本申请实施例提供的方案进行了介绍。为了实现上述功能,其包含了执行各个功能相应的硬件结构和/或软件模块。本领域技术人员应该很容易意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,本申请能够以硬件或硬件和计算机软件的结合形式来实现。某个功能究竟以硬件还是计算机软件驱动硬件的方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本申请的范围。需要说明的是,本申请实施例中对模块的划分是示意性的,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式。
图18示出了的一种电子设备1800的组成示意图。如图18所示,该电子设备1800可以包括:处理器1801和存储器1802。该存储器1802用于存储计算机执行指令。示例性的,在一些实施例中,当该处理器1801执行该存储器1802存储的指令时,可以使得该电子设备1800执行上述实施例中任一种所示的图像渲染方法。
需要说明的是,上述方法实施例涉及的各步骤的所有相关内容均可以援引到对应功能模块的功能描述,在此不再赘述。
图19示出了的一种芯片系统1900的组成示意图。该芯片系统1900可以包括:处理器1901和通信接口1902,用于支持相关设备实现上述实施例中所涉及的功能。在一种可能的设计中,芯片系统还包括存储器,用于保存终端必要的程序指令和数据。该芯片系统,可以由芯片构成,也可以包含芯片和其他分立器件。需要说明的是,在本申请的一些实现方式中,该通信接口1902也可称为接口电路。
需要说明的是,上述方法实施例涉及的各步骤的所有相关内容均可以援引到对应功能模块的功能描述,在此不再赘述。
在上述实施例中的功能或动作或操作或步骤等,可以全部或部分地通过软件、硬件、固件或者其任意组合来实现。当使用软件程序实现时,可以全部或部分地以计算机程序产品的形式来实现。该计算机程序产品包括一个或多个计算机指令。在计算机上加载和执行计算机程序指令时,全部或部分地产生按照本申请实施例所述的流程或功能。所述计算机可以是通用计算机、专用计算机、计算机网络、或者其他可编程装置。所述计算机指令可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一个计算机可读存储介质传输,例如,所述计算机指令可以从一个网站站点、计算机、服务器或者数据中心通过有线(例如同轴电缆、光纤、数字用户线(digital subscriber line,DSL))或无线(例如红外、无线、微波等)方式向另一个网站站点、计算机、服务器或数据中心进行传输。所述计算机可读存储介质可以是计算机能够存取的任何可用介质或者是包括一个或多个可以用介质集成的服务器、数据中心等数据存储设备。所述可用介质可以是磁性介质(例如,软盘、硬盘、磁带),光介质(例如,DVD)、或者半导体介质(例如固态硬盘(solid state disk,SSD))等。
尽管结合具体特征及其实施例对本申请进行了描述,显而易见的,在不脱离本申请的精神和范围的情况下,可对其进行各种修改和组合。相应地,本说明书和附图仅仅是所附权利要求所界定的本申请的示例性说明,且视为已覆盖本申请范围内的任意和所有修改、变化、组合或等同物。显然,本领域的技术人员可以对本申请进行各种改动和变型而不脱离本申请的精神和范围。这样,倘若本申请的这些修改和变型属于本申请权利要求及其等同技术的范围之内,则本申请也意图包括这些改动和变型在内。
Claims (20)
1.一种图像渲染方法,其特征在于,应用于电子设备,所述电子设备中安装有应用程序,所述方法包括:
所述应用程序下发第一指令流,所述第一指令流用于指示所述电子设备执行第一帧图像的渲染操作,所述第一帧图像中包括第一主场景以及第一半透明粒子;
所述电子设备合成第一渲染结果以及第二渲染结果,获取所述第一帧图像;所述第一渲染是所述第一主场景的渲染结果,所述第二渲染结果是所述第一半透明粒子的渲染结果,所述第二渲染结果在所述第一指令流下发前,已经存储在所述电子设备的第一帧缓冲中,存储所述第一渲染结果的帧缓冲与所述第一帧缓冲不同。
2.根据权利要求1所述的方法,其特征在于,所述第一指令流中包括第一指令段和第二指令段,所述第一指令段用于指示所述电子设备对所述第一主场景进行渲染以获取所述第一渲染结果,所述第二指令段用于指示所述电子设备对所述第一半透明粒子进行渲染;
在所述电子设备合成第一渲染结果以及第二渲染结果之前,所述方法还包括:
所述电子设备根据所述第一指令段进行渲染获取所述第一渲染结果;
所述电子设备从所述第一帧缓冲中获取所述第二渲染结果。
3.根据权利要求1或2所述的方法,其特征在于,所述第二渲染结果是所述电子设备对第二帧图像进行渲染后,存储在所述第一帧缓冲中的,所述第二帧图像的渲染早于所述第一帧图像的渲染。
4.根据权利要求1所述的方法,其特征在于,在所述应用程序下发所述第一指令流之前,所述方法还包括:
所述应用程序下发第二指令流,所述第二指令流用于指示所述电子设备执行第二帧图像的渲染操作,所述第二帧图像中包括第二主场景以及所述第一半透明粒子。
5.根据权利要求4所述的方法,其特征在于,所述第二指令流中包括第三指令段和第四指令段,所述第三指令段用于指示所述电子设备对所述第二主场景进行渲染以获取第三渲染结果,所述第四指令段用于指示所述电子设备对所述第二帧图像中的所述第一半透明粒子进行渲染;
在所述应用程序下发第二指令流之前,所述方法还包括:
所述电子设备根据所述第三指令段进行渲染获取所述第三渲染结果;
所述电子设备根据所述第四指令段获取第四渲染结果。
6.根据权利要求5所述的方法,其特征在于,所述方法还包括:
所述电子设备创建所述第一帧缓冲;
所述电子设备根据所述第四指令段获取所述第四渲染结果,包括:
所述电子设备将所述第四指令段指示的帧缓冲替换为所述第一帧缓冲,以获取第五指令段;
所述电子设备执行所述第五指令段的渲染操作,以获取所述第一半透明粒子的第二渲染结果,并将所述第二渲染结果存储在所述第一帧缓冲中。
7.根据权利要求2所述的方法,其特征在于,
所述电子设备根据所述第一指令流中,预设的开头指令以及结尾指令,确定所述第二指令段。
8.根据权利要求6所述的方法,其特征在于,
所述电子设备根据所述第二指令流中,预设的开头指令以及结尾指令,确定所述第四指令段。
9.根据权利要求5-8中任一项所述的方法,其特征在于,所述电子设备中设置有拦截模块、创建模块以及替换模块,所述方法包括:
所述拦截模块用于拦截第四指令段;
所述创建模块用于创建所述第一帧缓冲;
所述替换模块用于根据所述第一帧缓冲的标识ID以及所述拦截的第四指令段,替换所述第四指令段中的帧缓冲ID,以获取指向所述第一帧缓冲的第五指令段;
所述电子设备的图形处理器GPU根据所述第五指令段,执行所述第一半透明粒子的渲染,并将获取的所述第二渲染结果存储在所述第一帧缓冲中。
10.根据权利要求9所述的方法,其特征在于,所述电子设备中还设置有合并模块,所述方法还包括:
所述合并模块用于指示所述GPU合并所述第二渲染结果以及第三渲染结果,以获取第二帧图像的渲染结果。
11.根据权利要求1所述的方法,其特征在于,所述方法还包括:
根据第三帧图像的过程确定所述主场景的帧缓冲ID,所述主场景的帧缓冲是所述第三帧图像的处理过程中,绘制命令Drawcall数量最大的帧缓冲。
12.根据权利要求1或2或4-8中任一项所述的方法,其特征在于,在所述电子设备中设置有计数器,所述电子设备每执行一次帧图像的渲染,所述计数器加1;
在所述电子设备合成第一渲染结果以及第二渲染结果,获取所述第一帧图像之前,所述方法还包括:
所述电子设备确定所述第一帧图像渲染时,所述计数器的值符合预设规则。
13.根据权利要求12所述的方法,其特征在于,在所述电子设备确定所述第一帧图像渲染时,所述计数器的值不符合预设规则的情况下,所述方法还包括:
所述电子设备创建所述第一帧缓冲,将所述第一指令流中用于指示进行第一半透明粒子渲染的指令段指向的帧缓冲替换为所述第一帧缓冲,
所述电子设备执行所述第一半透明粒子的渲染,并存储在所述第一帧缓冲中。
14.根据权利要求13所述的方法,其特征在于,所述预设规则为:所述计数器的值为偶数。
15.根据权利要求1或13或14所述的方法,其特征在于,
在所述电子设备合成第一渲染结果以及第二渲染结果,获取所述第一帧图像之前,所述方法还包括:
所述电子设备根据确定所述第一帧图像渲染时的视角变化小于预设的视角阈值。
16.根据权利要求15所述的方法,其特征在于,所述电子设备根据所述第一帧图像的模型-观察-投影MVP矩阵以及第二帧图像的MVP矩阵,确定所述视角变化,所述第二帧图像的渲染早于所述第一帧图像的渲染。
17.根据权利要求15所述的方法,其特征在于,在所述第一帧图像渲染时的视角变化大于预设的视角阈值的情况下,所述方法还包括:
所述电子设备创建所述第一帧缓冲,将所述第一指令流中用于指示进行第一半透明粒子渲染的指令段指向的帧缓冲替换为所述第一帧缓冲,
所述电子设备执行所述第一半透明粒子的渲染,并存储在所述第一帧缓冲中。
18.根据权利要求12所述的方法,其特征在于,所述方法还包括:
所述电子设备根据所述第一渲染结果和所述第一帧缓冲中的渲染结果,合并获取所述第一帧图像的渲染结果。
19.一种电子设备,其特征在于,所述电子设备包括一个或多个处理器和一个或多个存储器;所述一个或多个存储器与所述一个或多个处理器耦合,所述一个或多个存储器存储有计算机指令;
当所述一个或多个处理器执行所述计算机指令时,使得所述电子设备执行如权利要求1-18中任一项所述的图像渲染方法。
20.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质包括计算机指令,当所述计算机指令运行时,执行如权利要求1-18中任一项所述的图像渲染方法。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210713538.1A CN116672702A (zh) | 2022-02-22 | 2022-02-22 | 一种图像渲染方法和电子设备 |
CN202210159851.5A CN114210055B (zh) | 2022-02-22 | 2022-02-22 | 一种图像渲染方法和电子设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210159851.5A CN114210055B (zh) | 2022-02-22 | 2022-02-22 | 一种图像渲染方法和电子设备 |
Related Child Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202210713538.1A Division CN116672702A (zh) | 2022-02-22 | 2022-02-22 | 一种图像渲染方法和电子设备 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN114210055A CN114210055A (zh) | 2022-03-22 |
CN114210055B true CN114210055B (zh) | 2022-07-01 |
Family
ID=80709191
Family Applications (2)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202210713538.1A Pending CN116672702A (zh) | 2022-02-22 | 2022-02-22 | 一种图像渲染方法和电子设备 |
CN202210159851.5A Active CN114210055B (zh) | 2022-02-22 | 2022-02-22 | 一种图像渲染方法和电子设备 |
Family Applications Before (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202210713538.1A Pending CN116672702A (zh) | 2022-02-22 | 2022-02-22 | 一种图像渲染方法和电子设备 |
Country Status (1)
Country | Link |
---|---|
CN (2) | CN116672702A (zh) |
Families Citing this family (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116095413B (zh) * | 2022-05-30 | 2023-11-07 | 荣耀终端有限公司 | 视频处理方法及电子设备 |
CN117635789A (zh) * | 2022-08-18 | 2024-03-01 | 华为技术有限公司 | 着色方法、着色装置和电子设备 |
CN116704075A (zh) * | 2022-10-14 | 2023-09-05 | 荣耀终端有限公司 | 图像处理方法、设备及存储介质 |
CN116664375B (zh) * | 2022-10-17 | 2024-04-12 | 荣耀终端有限公司 | 图像预测方法、装置、设备及存储介质 |
CN116450363B (zh) * | 2023-06-13 | 2023-11-14 | 荣耀终端有限公司 | 一种资源调度方法及电子设备 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5977977A (en) * | 1995-08-04 | 1999-11-02 | Microsoft Corporation | Method and system for multi-pass rendering |
CN108292238A (zh) * | 2015-12-18 | 2018-07-17 | 想象技术有限公司 | 控制gpu的调度 |
CN112837402A (zh) * | 2021-03-01 | 2021-05-25 | 腾讯科技(深圳)有限公司 | 场景渲染方法、装置、计算机设备和存储介质 |
Family Cites Families (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
AU2018100891A4 (en) * | 2016-11-15 | 2018-08-02 | Chanby Pty Ltd | A compostable tableware |
CN111508055B (zh) * | 2019-01-30 | 2023-04-11 | 华为技术有限公司 | 渲染方法及装置 |
-
2022
- 2022-02-22 CN CN202210713538.1A patent/CN116672702A/zh active Pending
- 2022-02-22 CN CN202210159851.5A patent/CN114210055B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5977977A (en) * | 1995-08-04 | 1999-11-02 | Microsoft Corporation | Method and system for multi-pass rendering |
CN108292238A (zh) * | 2015-12-18 | 2018-07-17 | 想象技术有限公司 | 控制gpu的调度 |
CN112837402A (zh) * | 2021-03-01 | 2021-05-25 | 腾讯科技(深圳)有限公司 | 场景渲染方法、装置、计算机设备和存储介质 |
Non-Patent Citations (1)
Title |
---|
OpenGL半透明效果的实现(混合)、雾效果和圆滑(抗锯齿);别给迷住了;《CSDN》;20170101;第1-4页 * |
Also Published As
Publication number | Publication date |
---|---|
CN114210055A (zh) | 2022-03-22 |
CN116672702A (zh) | 2023-09-01 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN114210055B (zh) | 一种图像渲染方法和电子设备 | |
CN114708369B (zh) | 一种图像渲染方法和电子设备 | |
US11068072B2 (en) | Mixed reality display system and mixed reality display terminal | |
CN113553014B (zh) | 多窗口投屏场景下的应用界面显示方法及电子设备 | |
CN111491174A (zh) | 虚拟礼物获取及展示方法、装置、设备及存储介质 | |
US11587280B2 (en) | Augmented reality-based display method and device, and storage medium | |
KR20220088924A (ko) | 증강 현실에 기반한 디스플레이 방법 및 장치, 및 저장 매체 | |
WO2023160167A1 (zh) | 一种图像处理方法、电子设备及存储介质 | |
CN112337091B (zh) | 人机交互方法、装置及电子设备 | |
US20130127849A1 (en) | Common Rendering Framework and Common Event Model for Video, 2D, and 3D Content | |
CN114615513A (zh) | 视频数据生成方法、装置、电子设备及存储介质 | |
CN114419213A (zh) | 图像处理方法、装置、设备和存储介质 | |
CN114570020A (zh) | 数据处理方法以及系统 | |
CN115390957A (zh) | 一种应用程序动效衔接的方法及装置 | |
CN115018692A (zh) | 一种图像渲染方法及电子设备 | |
CN114222185B (zh) | 视频播放方法、终端设备及存储介质 | |
CN114452645B (zh) | 生成场景图像的方法、设备和存储介质 | |
CN115311397A (zh) | 用于图像渲染的方法、装置、设备和存储介质 | |
CN114780012A (zh) | 电子设备的锁屏壁纸的显示方法和相关装置 | |
WO2024051471A1 (zh) | 一种图像处理方法和电子设备 | |
KR20150083475A (ko) | 터치입력을 이용한 미디어 편집 방법 및 장치 | |
EP4187905A1 (en) | Method and system for live multicasting performances to devices | |
CN117557701A (zh) | 一种图像渲染方法和电子设备 | |
CN117710548A (zh) | 图像渲染方法及其相关设备 | |
KR20180075222A (ko) | 전자 장치 및 그 동작 방법 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |