CN114708369B - 一种图像渲染方法和电子设备 - Google Patents

一种图像渲染方法和电子设备 Download PDF

Info

Publication number
CN114708369B
CN114708369B CN202210255562.5A CN202210255562A CN114708369B CN 114708369 B CN114708369 B CN 114708369B CN 202210255562 A CN202210255562 A CN 202210255562A CN 114708369 B CN114708369 B CN 114708369B
Authority
CN
China
Prior art keywords
rendering
instruction
electronic device
semi
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
Application number
CN202210255562.5A
Other languages
English (en)
Other versions
CN114708369A (zh
Inventor
高巍伟
刘智超
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Honor Device Co Ltd
Original Assignee
Honor Device Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Honor Device Co Ltd filed Critical Honor Device Co Ltd
Priority to CN202210255562.5A priority Critical patent/CN114708369B/zh
Publication of CN114708369A publication Critical patent/CN114708369A/zh
Application granted granted Critical
Publication of CN114708369B publication Critical patent/CN114708369B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T15/003D [Three Dimensional] image rendering
    • G06T15/005General purpose rendering architectures
    • AHUMAN NECESSITIES
    • A63SPORTS; GAMES; AMUSEMENTS
    • A63FCARD, BOARD, OR ROULETTE GAMES; INDOOR GAMES USING SMALL MOVING PLAYING BODIES; VIDEO GAMES; GAMES NOT OTHERWISE PROVIDED FOR
    • A63F13/00Video games, i.e. games using an electronically generated display having two or more dimensions
    • A63F13/50Controlling the output signals based on the game progress
    • A63F13/52Controlling the output signals based on the game progress involving aspects of the displayed game scene
    • AHUMAN NECESSITIES
    • A63SPORTS; GAMES; AMUSEMENTS
    • A63FCARD, BOARD, OR ROULETTE GAMES; INDOOR GAMES USING SMALL MOVING PLAYING BODIES; VIDEO GAMES; GAMES NOT OTHERWISE PROVIDED FOR
    • A63F13/00Video games, i.e. games using an electronically generated display having two or more dimensions
    • A63F13/80Special adaptations for executing a specific game genre or game mode
    • A63F13/837Shooting of targets
    • AHUMAN NECESSITIES
    • A63SPORTS; GAMES; AMUSEMENTS
    • A63FCARD, BOARD, OR ROULETTE GAMES; INDOOR GAMES USING SMALL MOVING PLAYING BODIES; VIDEO GAMES; GAMES NOT OTHERWISE PROVIDED FOR
    • A63F2300/00Features of games using an electronically generated display having two or more dimensions, e.g. on a television screen, showing representations related to the game
    • A63F2300/60Methods for processing data by generating or executing the game program
    • A63F2300/66Methods for processing data by generating or executing the game program for rendering three dimensional images
    • A63F2300/663Methods for processing data by generating or executing the game program for rendering three dimensional images for simulating liquid objects, e.g. water, gas, fog, snow, clouds
    • AHUMAN NECESSITIES
    • A63SPORTS; GAMES; AMUSEMENTS
    • A63FCARD, BOARD, OR ROULETTE GAMES; INDOOR GAMES USING SMALL MOVING PLAYING BODIES; VIDEO GAMES; GAMES NOT OTHERWISE PROVIDED FOR
    • A63F2300/00Features of games using an electronically generated display having two or more dimensions, e.g. on a television screen, showing representations related to the game
    • A63F2300/80Features of games using an electronically generated display having two or more dimensions, e.g. on a television screen, showing representations related to the game specially adapted for executing a specific type of game
    • A63F2300/8076Shooting
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T2200/00Indexing scheme for image data processing or generation, in general
    • G06T2200/04Indexing scheme for image data processing or generation, in general involving 3D image data
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T2210/00Indexing scheme for image generation or computer graphics
    • G06T2210/56Particle system, point based geometry or rendering

Landscapes

  • Engineering & Computer Science (AREA)
  • Multimedia (AREA)
  • Computer Graphics (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Theoretical Computer Science (AREA)
  • Image Generation (AREA)
  • Controls And Circuits For Display Device (AREA)

Abstract

本申请实施例公开了一种图像渲染方法和电子设备,涉及图像处理领域,能够实现对半透明粒子渲染结果的合理复用,从而降低多帧图像渲染过程中的重复渲染开销,同时保证渲染结果的准确性。具体方案为:应用程序下发第一指令流,第一指令流用于指示电子设备执行第一帧图像的渲染操作,第一帧图像中包括第一主场景,第一半透明粒子以及第二半透明粒子,第一半透明粒子的渲染过程与第一主场景无关,第二半透明粒子的渲染过程与第一主场景相关。电子设备合成第一渲染结果以及第二渲染结果,获取第一帧图像。第一渲染结果包括第一主场景以及第二半透明粒子,第二渲染结果包括第一半透明粒子的渲染结果。第二渲染结果存储在电子设备的第一帧缓冲中。

Description

一种图像渲染方法和电子设备
技术领域
本申请实施例涉及图像处理领域,尤其涉及一种图像渲染方法和电子设备。
背景技术
随着电子设备的发展,显示图像的内容也越来越丰富。在一些图像中,可以包括半透明粒子。而对于连续多个帧图像中半透明粒子的渲染,会对电子设备产生较大的渲染开销,表现为电子设备算力消耗大、发热严重等,影响用户体验。
发明内容
本申请实施例提供一种图像渲染方法和电子设备,能够实现对半透明粒子渲染结果的合理复用,从而有效降低多帧图像渲染过程中,针对半透明粒子渲染的重复开销,进而减少由此导致的功耗、算力的浪费。示例性的,基于本申请实施例提供的方案,能够实现对与主场景无关的半透明粒子的复用,而对于需要结合主场景进行渲染的半透明粒子则不进行复用,由此避免所有半透明粒子复用导致的渲染结果不准确的问题。
为了达到上述目的,本申请实施例采用如下技术方案:
第一方面,提供一种图像渲染方法,应用于电子设备,该电子设备中安装有应用程序,该方法包括:应用程序下发第一指令流,该第一指令流用于指示该电子设备执行第一帧图像的渲染操作,该第一帧图像中包括第一主场景,第一半透明粒子以及第二半透明粒子,该第一半透明粒子的渲染过程与该第一主场景无关,该第二半透明粒子的渲染过程与该第一主场景相关。该电子设备合成第一渲染结果以及第二渲染结果,获取该第一帧图像。该第一渲染结果包括该第一主场景以及该第二半透明粒子,该第二渲染结果包括该第一半透明粒子的渲染结果。该第二渲染结果存储在该电子设备的第一帧缓冲中。
其中,与主场景相关可以是指,在对应半透明粒子渲染时,需要从主场景中读取相应位置的颜色等数据,从而据此进行该半透明粒子(如第二半透明粒子)的渲染。对应的,与主场景无关可以是指,在对应半透明渲染时,不需要从主场景中读取任何数据,即可完成该半透明粒子(如第一半透明粒子)的渲染。基于该方案,在进行当前图像的渲染过程中,可以不需要对第一半透明粒子进行渲染,而是直接调取已经存储在第一帧缓冲中的渲染结果,通过将该第一半透明粒子的第二渲染结果与当前帧图像中其他渲染结果(如主场景以及第二半透明粒子)进行合并,就可以在不进行第一半透明粒子的渲染的情况下获取当前帧图像的渲染结果。
在一些可能的设计中,该第一指令流中包括第一指令段和第二指令段,该第一指令段用于指示该电子设备对该第一主场景进行渲染,该第二指令段包括第三指令段和第四指令段,该第三指令段用于指示该电子设备对该第一半透明粒子进行渲染。该第四指令段用于指示该电子设备对该第二半透明粒子进行渲染。在该电子设备合成第一渲染结果以及第二渲染结果之前,该方法还包括:该电子设备根据该第一指令段进行渲染获取该第一主场景。该电子设备根据该第三指令段和该第一主场景,渲染获取该第一渲染结果。该电子设备从该第一帧缓冲中获取该第二渲染结果。基于该方案,电子设备根据指令流能够区分主场景、第一半透明粒子以及第二半透明粒子的渲染。
在一些可能的设计中,该第二渲染结果是该电子设备对第二帧图像进行渲染后,存储在该第一帧缓冲中的,该第二帧图像的渲染早于该第一帧图像的渲染。基于该方案,说明了第一半透明粒子的渲染结果的来源,比如可以是从较早渲染的帧图像的渲染过程获取的。在该第二帧图像渲染后可以将第一半透明粒子的渲染结果存储在第一帧缓冲里。
在一些可能的设计中,在该应用程序下发该第一指令流之前,该方法还包括:该应用程序下发第二指令流,该第二指令流用于指示该电子设备执行第二帧图像的渲染操作,该第二帧图像中包括第二主场景,该第一半透明粒子以及第二半透明粒子。基于该方案,通过第二指令流的下发以及执行就能够实现对之前帧图像的渲染。基于半透明粒子的渲染的连续性,在该第二帧图像的渲染过程依然可以包括第一半透明粒子以及第二半透明粒子。
在一些可能的设计中,该第二指令流中包括第五指令段和第六指令段,该第五指令段用于指示该电子设备对该第二主场景进行渲染,该第六指令段包括第七指令段和第八指令段,该第七指令段用于指示该电子设备对该第一半透明粒子进行渲染。该第八指令段用于指示该电子设备对该第二半透明粒子进行渲染。该方法还包括:该电子设备根据该第五指令段进行渲染获取该第二主场景。该电子设备根据该第八指令段和该第二主场景,渲染获取第三渲染结果。该第三渲染结果包括该第二主场景以及该第二帧图像中的第二半透明粒子。该电子设备根据该第七指令段,渲染获取该第二渲染结果。基于该方案,在第二指令流中包括用于指示进行第二主场景以及第二半透明粒子渲染的指令段,就可以使得电子设备据此进行第二帧图像中对应内容的渲染。需要说明的是,不同帧图像中的第二半透明粒子所绘制的对象可以不完全相同。即使第二半透明粒子不同,也不会影响第一半透明粒子的复用。
在一些可能的设计中,在该电子设备根据该第七指令段,渲染获取该第二渲染结果之前,该方法还包括:该电子设备创建该第一帧缓冲。该电子设备根据该第七指令段,渲染获取该第二渲染结果,包括:该电子设备将该第七指令段指示的帧缓冲替换为该第一帧缓冲,以获取第九指令段。该电子设备执行该第九指令段的渲染操作,以获取该第一半透明粒子对应的第二渲染结果,并将该第二渲染结果存储在该第一帧缓冲中。基于该方案,通过将第七指令段指示的帧缓冲替换为第一帧缓冲,使得第一半透明粒子能够被存储在预设位置。由此使得后续帧图像能够直接从该预设位置调取第一半透明粒子的渲染结果实现复用。
在一些可能的设计中,该电子设备根据该第一指令流中,预设的开头指令以及结尾指令,确定该第二指令段。基于该方案,不同实现中第一指令流的特征可能不同。但是,对于固定的游戏以及渲染环境,该用于指示进行半透明粒子渲染的第二指令段可以具有共同的特征。将该共同的特征,开头指令以及结尾指令存储在电子设备中,就能够使得电子设备据此确定指令流中与半透明粒子对应的部分。
在一些可能的设计中,该电子设备根据第一标识,识别该第二指令段中的第三指令段。该电子设备根据第二标识,识别该第二指令段中的第四指令段。基于该方案,基于半透明粒子渲染指令段中,是否与主场景相关的标识,来确定第一半透明粒子的指令段以及第二半透明粒子的指令段。
在一些可能的设计中,该电子设备根据该第二指令流中,预设的开头指令以及结尾指令,确定该第六指令段。基于该方案,在其他帧图像中也可以据此确定半透明粒子的渲染指令段。
在一些可能的设计中,该电子设备根据第一标识,识别该第六指令段中的第七指令段。该电子设备根据第二标识,识别该第六指令段中的第八指令段。基于该方案,在其他帧图像中也可以据此确定第一半透明粒子以及第二半透明粒子的渲染指令段。
在一些可能的设计中,该预设的开头指令包括以下中的至少一项:glEnable指令,glEnablei指令。该预设的结尾指令包括以下中的至少一项:glDisable指令,glDisablei指令,glDiscardFramebufferEXT()指令。基于该方案,提供了一种具体的开头指令以及结尾指令的示例。据此即可实现对半透明粒子渲染指令段的判断。
在一些可能的设计中,该第一标识包括在混合方程中,该第一标识用于指示srcRGB为GL_ONE和/或srcRGB为GL_SRC_ALPHA。该第二标识用于指示srcRGB为GL_DST_COLOR。基于该方案,提供了一种具体的第一标识以及第二标识的示例。据此即可实现对第一半透明粒子和第二半透明粒子的区分。
在一些可能的设计中,该电子设备中设置有拦截模块、创建模块以及替换模块,在该电子设备根据第二指令流进行第二帧图像的渲染时,该还方法包括:该拦截模块根据预设的开头指令以及结尾指令拦截该第六指令段,该第六指令段用于指示该电子设备进行半透明粒子的渲染。该拦截模块根据第一标识,将该第六指令段中的第七指令段传输给创建模块,该第七指令段用于指示进行该第一半透明粒子的渲染,该创建模块创建第一帧缓冲,该第一帧缓冲用于存储该第一半透明粒子的渲染结果,该创建模块将该第一帧缓冲的标识发送给该替换模块,该替换模块从该拦截模块或该创建模块获取该第七指令段,该替换模块将该第七指令段指向的帧缓冲替换为该第一帧缓冲,以获取第九指令段,该替换模块将该第九指令段通过图形库传输给该电子设备的图形处理器GPU,以便该GPU根据该第九指令段执行该第一半透明粒子的渲染,该第一半透明粒子的渲染结果存储在该第一帧缓冲中。基于该方案,通过对电子设备进行模块化划分,使得各个虚拟模块能够通过具体的功能实现本申请实施例提供的方案。
在一些可能的设计中,该方法还包括:该拦截模块将该第二指令流中的不同于该第六指令段的指令通过图形库传输给该GPU,以便该GPU执行该第二帧图像中的第二主场景以及第二半透明粒子的渲染。基于该方案,通过将第二主场景、第二半透明粒子的渲染指令段传输给GPU实现对第二帧图像中,不包括第一半透明粒子的渲染。
在一些可能的设计中,该方法还包括:该创建模块创建第二帧缓冲,该第二帧缓冲用于存储该第二帧图像的渲染结果。基于该方案,由于原始逻辑中半透明粒子可以直接渲染到主场景的帧缓冲里,因此不需要额外的帧缓冲存储合成的结果。在本示例中,为了便于第一半透明粒子的复用,需要对第一半透明粒子进行单独渲染。这样,为了获取当前帧图像的渲染那结果,就需要在完成主场景和第二半透明粒子的渲染,以及第一半透明粒子的渲染之后,再对两个渲染结果进行合成。那么就可以为该合成过程创建新的帧缓冲,用于存储合成结果。当然,在一些实现中,该合成过程也可以是基于存储有主场景和第二半透明粒子的帧缓冲进行的,或者,该合成过程也可以是基于存储有第一半透明粒子的帧缓冲进行的。
在一些可能的设计中,该电子设备还包括合成模块,方法还包括:该合成模块向该GPU发送合成指令,该合成指令用于指示该GPU在该第二帧缓冲上合成该第一帧缓冲中的第二渲染结果以及该第二主场景以及第二半透明粒子的渲染结果。该GPU根据该合成指令执行合成操作,以便在该第二帧缓冲上获取该第二帧图像的渲染结果。基于该方案,该合成过程可以是由CPU中的合成模块直接发送给GPU的。由此触发GPU对两个渲染结果的合成。在不同示例中,该合成指令的发送机制可以是不同的。比如,在完成所有渲染指令的下发后,可以下发合成指令。又如,在完成渲染操作之后,GPU可以向CPU返回渲染完成指示,根据该渲染完成指示,CPU就可以下发该合成指示。在一些实施例中,合成操作也可以不依托与合成指令,即GPU可以不下发该合成指令。那么,GPU可以根于预设的机制,在完成当前帧图像、第一半透明粒子以及第二半透明粒子的渲染之后就可以直接触发合成操作。
在一些可能的设计中,在该电子设备根据第一指令流进行第一帧图像的渲染时,该方法还包括:该拦截模块根据预设的开头指令以及结尾指令拦截该第二指令段,该第二指令段用于指示该电子设备进行半透明粒子的渲染。该拦截模块根据第一标识,拦截该第二指令段中的第三指令段。该第三指令段用于指示该电子设备进行第一半透明粒子的渲染。该拦截模块将该第二指令流中不同于该第三指令段的指令通过图形库传输给该电子设备的GPU,以便该GPU执行该第一帧图像中第一主场景以及第二半透明粒子的渲染。基于该方案,拦截模块可以实现对不同功能指令段的识别,从而将第一半透明粒子的渲染结果存储到预设位置,并指示其他模块完成主场景和第二半透明粒子的渲染。
在一些可能的设计中,该电子设备还包括合成模块,方法还包括:该合成模块向该GPU发送合成指令,该合成指令用于指示该GPU在该第二帧缓冲上合成该第一帧缓冲中的第二渲染结果以及该第一主场景以及第二半透明粒子的渲染结果。该GPU根据该合成指令执行合成操作,以便在该第二帧缓冲上获取该第一帧图像的渲染结果。基于该方案,能够实现渲染结果的合成,从而顺利获取对应帧图像的渲染结果。
在一些可能的设计中,该方法还包括:根据第三帧图像的过程确定该主场景的帧缓冲ID,该主场景的帧缓冲是该第三帧图像的处理过程中,绘制命令Drawcall数量最大的帧缓冲,该第三帧图像的渲染早于该第一帧图像的渲染。基于该方案,主场景可以是提前确定的。该主场景的Drawcall由于数量多,因此按照原生逻辑进行渲染的各项开销就较大。在确定主场景后,就可以对于该场景下的其他渲染过程进行复用简化,从而降低开销。
在一些可能的设计中,在该电子设备中设置有计数器,该电子设备每执行一次帧图像的渲染,该计数器加1。在该电子设备开始该第一帧图像的渲染,合成第一渲染结果以及第二渲染结果之前,该方法还包括:该电子设备确定该计数器的值符合预设规则。基于该方案,在多个帧图像渲染过程中,可以对于部分帧图像进行第一半透明粒子的复用,由此实现连续帧图像显示时,不会由于半透明粒子的复用机制导致显示问题。该确定是否对当前帧图像进行半透明粒子复用的判断机制可以是基于当前帧图像对应计数器的值确定的。
在一些可能的设计中,在该计数器的值不符合预设规则的情况下,该方法还包括:该电子设备创建该第一帧缓冲,将该第一指令流中用于指示进行第一半透明粒子渲染的指令段指向的帧缓冲替换为该第一帧缓冲,该电子设备执行该第一半透明粒子的渲染,并将渲染结果存储在该第一帧缓冲中。基于该方案,在不需要对当前帧图像进行第一半透明粒子的复用时,可以基于应用下发的指令流对第一半透明粒子进行渲染,并将渲染结果更新到预设的第一帧缓冲中,以便于后续帧图像的复用。
在一些可能的设计中,该预设规则为:该计数器的值为偶数。基于该方案,在偶数帧进行复用,奇数帧进行第一半透明粒子的更新。比如,第1帧图像渲染第一半透明粒子,并将结果存储在第一帧缓冲中。第2帧图像复用第一帧缓冲中的渲染结果。第3帧图像渲染第一半透明粒子,并将结果更新在第一帧缓冲中,以此类推。
在一些可能的设计中,在该电子设备合成第一渲染结果以及第二渲染结果之前,该方法还包括:该电子设备确定该第一帧图像渲染时的视角变化小于预设的视角阈值。基于该方案,在复用半透明粒子之前,还可以判断视角是否发生剧烈变化。当视角发生剧烈变化时,那么之前帧图像的半透明粒子的位置色彩等数据就不能对应到当前帧图像的半透明粒子。此时可以不进行半透明粒子的复用。由此提高半透明粒子复用的准确度。
在一些可能的设计中,该电子设备根据该第一帧图像的模型-观察-投影MVP矩阵以及第二帧图像的MVP矩阵,确定该视角变化,该第二帧图像的渲染早于该第一帧图像的渲染。基于该方案,根据MVP矩阵即可确定视角变化情况。
在一些可能的设计中,在该第一帧图像渲染时的视角变化大于预设的视角阈值的情况下,该方法还包括:该电子设备创建该第一帧缓冲,将该第一指令流中用于指示进行第一半透明粒子渲染的指令段指向的帧缓冲替换为该第一帧缓冲,该电子设备执行该第一半透明粒子的渲染,并将渲染结果存储在该第一帧缓冲中。基于该方案,在视角变化过大时可以执行第一半透明粒子的渲染以及结果的更新,以便后续复用的准确性。
第二方面,提供一种电子设备,电子设备包括一个或多个处理器和一个或多个存储器;一个或多个存储器与一个或多个处理器耦合,一个或多个存储器存储有计算机指令;当一个或多个处理器执行计算机指令时,使得电子设备执行如上述第一方面以及各种可能的设计中任一种的图像渲染方法。
第三方面,提供一种芯片系统,芯片系统包括接口电路和处理器;接口电路和处理器通过线路互联;接口电路用于从存储器接收信号,并向处理器发送信号,信号包括存储器中存储的计算机指令;当处理器执行计算机指令时,芯片系统执行如上述第一方面以及各种可能的设计中任一种的图像渲染方法。
第四方面,提供一种计算机可读存储介质,计算机可读存储介质包括计算机指令,当计算机指令运行时,执行如上述第一方面以及各种可能的设计中任一种的图像渲染方法。
第五方面,提供一种计算机程序产品,计算机程序产品中包括指令,当计算机程序产品在计算机上运行时,使得计算机可以根据指令执行如上述第一方面以及各种可能的设计中任一种的图像渲染方法。
应当理解的是,上述第二方面,第三方面,第四方面,以及第五方面提供的技术方案,其技术特征均可对应到第一方面及其可能的设计中提供的图像渲染方法,因此能够达到的有益效果类似,此处不再赘述。
附图说明
图1为一种半透明粒子的示意图;
图2为一种渲染过程的示意图;
图3为一种半透明粒子的划分示意图;
图4为一种半透明粒子的渲染示意图;
图5为一种半透明粒子的渲染示意图;
图6为一种基于指令流进行半透明粒子的渲染过程示意图;
图7为本申请实施例提供的一种基于指令流进行半透明粒子的渲染过程示意图;
图8为本申请实施例提供的一种电子设备的组成示意图;
图9为本申请实施例提供的一种图像渲染方法的模块交互示意图;
图10为本申请实施例提供的一种图像渲染方法的模块交互示意图;
图11为本申请实施例提供的一种图像渲染方法的模块交互示意图;
图12为本申请实施例提供的一种图像渲染方法的模块交互示意图;
图13为本申请实施例提供的一种图像渲染方法的模块交互示意图;
图14为本申请实施例提供的一种图像渲染方法的模块交互示意图;
图15为本申请实施例提供的一种图像渲染方法的模块交互示意图;
图16为本申请实施例提供的一种图像渲染方法的模块交互示意图;
图17为本申请实施例提供的一种图像渲染方法的流程示意图;
图18为本申请实施例提供的一种图像渲染方法的流程示意图;
图19为本申请实施例提供的一种MVP变化的示意图;
图20为本申请实施例提供的一种视角变化的示意图;
图21为本申请实施例提供的一种图像渲染方法的流程示意图;
图22为本申请实施例提供的一种电子设备的组成示意图;
图23为本申请实施例提供的一种芯片系统的组成示意图。
具体实施方式
电子设备可以通过其上设置的显示屏,向用户展示图像。在一些场景下,图像中可以包括半透明粒子。其中,半透明粒子可以在图像中表现为半透明状态。比如,以电子设备显示的图像为游戏场景下的图像为例。在射击类游戏中,图像中可能包括烟雾、枪火、浪花等半透明粒子。电子设备可以通过在图像中增加半透明粒子的渲染特效,增加场景显示的真实感,提升用户体验。例如,如图1所示,在区域A中可以包括浪花对应的半透明粒子的渲染特效。可以看到,区域A中的浪花可以表现为半透明状态。由此,在该帧图像中,用户可以看到半透明的浪花,还可以透过浪花看到其后的景物,从而达到模拟真实视觉体验的效果。又如,在区域B中可以包括烟雾对应的半透明粒子的渲染特效。可以看到,区域B中的烟雾可以表现为半透明状态。相比于区域A中的浪花,该烟雾的透明度可以更低。通过该透明度更低的烟雾,则几乎看不到后面的景物。
对于电子设备而言,为了获取用于显示的图像数据,电子设备可以根据应用程序(如游戏应用)下发的渲染指令流,进行图像的渲染,进而获取包括半透明粒子在内的图像数据进行显示。
示例性的,结合图2,在进行某一帧图像的渲染时,游戏应用可以下发渲染指令流。中央处理器(Central Processing Unit,CPU)可以根据该渲染指令流,调用图像库中的接口,以便于指示图形处理器(Graphic Processing Unit,GPU)执行对应的渲染操作。GPU执行渲染操作的渲染结果可以存储在电子设备中,通过后续渲染指令流对应的渲染之后,就可以获取送显数据。电子设备可以根据该送显数据,在显示屏上显示该帧图像。
在图像中可以包括半透明粒子,那么,游戏应用下发的渲染指令流中可以包括用于进行主场景渲染的指令段A以及用于进行半透明粒子渲染的指令段B等。
其中,主场景可以对应到当前帧图像的渲染渲染过程中,电子设备执行对应渲染负载最高的场景。示例性的,在一些实施例中,该主场景可以对应绘制命令(drawcall)数量最多的渲染管线(renderpass)。在对一帧图像的渲染过程中,可以包括多个renderpass。每个renderpass的渲染结果都可以存储在帧缓冲中。每个renderpass的渲染都可以包括多个drawcall。执行drawcall数量越多,则对应的renderpass执行完成后获取的贴图的内容就越丰富。在另一些实施例中,主场景还可以是绘制命令大于预设的阈值的场景。
需要说明的是,在本示例中,如图3所示,半透明粒子可以根据渲染过程中是否与其他景物有关划分为第一半透明粒子以及第二半透明粒子。第一半透明粒子可以指渲染过程中,与图像中其他景物对应的模型(如主场景中的模型)无关的半透明粒子。在该第一半透明粒子在帧图像中对应的像素位置,只需要进行该半透明粒子的显示,则电子设备在渲染过程中,该像素位置的显示情况就可以根据第一半透明粒子确定。例如,第一半透明粒子可以包括GL_ONE以及GL_SRC_ALPHA对应的半透明粒子。示例性的,结合图4,以主场景中包括模型1,半透明粒子包括模型2,该模型2包括在第一半透明粒子中。那么,在完成主场景的渲染,获取包括模型1的贴图之后,电子设备可以将模型2绘制在该贴图上,从而获取包括模型1与模型2的贴图。可以看到,在该示例中,模型2包括在第一半透明粒子中,与模型1在图像中的位置不同,因此对应帧图像的显示可以仅基于模型1或模型2进行显示即可。
对应的,第二半透明粒子可以指渲染过程中,与图像中其他景物对应的模型(如主场景中的模型)有关的半透明粒子。在该第二半透明粒子在帧图像中对应的像素位置,需要同时进行半透明粒子以及其他模型的显示。例如,结合图1,区域A中的像素位置,需要同时显示半透明粒子(如浪花)以及浪花后的模型(如对应位置的植物等)。也就是说,该像素位置的显示情况,需要根据半透明粒子以及主场景模型共同确定。例如,第二半透明粒子可以包括GL_DST_COLOR对应的半透明粒子。示例性的,结合图5,以主场景中包括模型1,半透明粒子包括模型3,该模型3包括在第一半透明粒子中。那么,在完成主场景的渲染,获取包括模型1的贴图之后,电子设备可以将模型3绘制在该贴图上,从而获取包括模型1与模型3的贴图。可以看到,在该示例中,模型3包括在第二半透明粒子中,与模型1在图像中的位置有至少部分重叠,因此在图像中重叠部分的显示,需要根据模型1以及模型2同时决定。
为了便于说明,指示进行半透明粒子渲染的指令段B中,用于进行第一半透明粒子的渲染的指令段可以为指令段B1,用于进行第二半透明粒子的渲染的指令段可以为指令段B2。
应当理解的是,半透明粒子不会孤立地存在某一帧图像中,而是在相邻的多帧图像中都会存在相同或相似的半透明粒子,从而实现半透明粒子显示的连续性。比如,结合图1,区域A对应的帧图像中包括有半透明粒子(如浪花)。在相邻的多个帧图像中,该浪花不会突然消失,那么在其他帧图像中相近的位置也会包括该浪花对应的模型。对于区域B中的烟雾对应的半透明粒子也是类似的。
为了实现上述连续多个帧图像中相同或相近位置的相同或相近半透明粒子的渲染,游戏应用在各个帧图像对应的渲染指令流中都会携带类似的渲染指令流。比如,以当前帧图像的渲染指令流中包括用于指示进行半透明粒子渲染的指令段B为例。那么在与当前帧图像相邻的多个帧图像中,都可以包括该指令段B。
示例性的,图6给出了图2所示流程中渲染指令流的传递示意。如图6所示,在第N帧图像的渲染过程中,游戏应用下发的渲染指令中可以包括指令段A1用于指示进行当前帧图像的主场景渲染,还可以包括指令段B1以及指令段B2指示进行半透明粒子的渲染。对应的,CPU、图形库可以将该包括指令段A1、指令段B1以及指令段B2的渲染指令流传输给GPU进行第N帧图像的渲染,由此输出第N帧图像的渲染结果。类似的,在第N+1帧图像的渲染过程中,游戏应用下发的渲染指令中可以包括指令段A2用于指示进行当前帧图像的主场景渲染,还可以包括指令段B1以及指令段B2指示进行半透明粒子的渲染。类似于第N帧图像,在第N+1帧图像的渲染过程中,电子设备还可以对指令段B1以及指令段B2进行渲染处理。
可以看到,指令段B1以及指令段B2对应的半透明粒子的渲染过程,在多个帧图像中被CPU、图形库以及GPU重复执行了多次,而获取的结果基本相同。加上对于半透明粒子的渲染过程又较为复杂。因此,会造成多帧图像渲染过程中针对半透明粒子的渲染的重复开销。造成了电子设备进行图像渲染过程中的功耗、算力的浪费,同时导致电子设备的发热、卡顿、显示丢帧等问题。
为了解决上述问题,本申请实施例提供一种针对图像中半透明粒子的渲染方法,能够实现对半透明粒子渲染结果的合理复用。从而有效降低多帧图像渲染过程中,针对半透明粒子渲染的重复开销,进而减少由此导致的功耗、算力的浪费。
需要说明的是,不同帧图像的主场景不同。对于不同帧图像中第二半透明粒子的渲染,即使半透明粒子本身相同或类似,但是由于需要结合当前帧图像中主场景对应位置的渲染情况,因此在不同帧图像中第二半透明粒子的渲染结果一般不同。在本示例中,电子设备在复用半透明粒子的渲染结果时,可以是针对第一半透明粒子执行的。示例性的,在本申请实施例中,电子设备可以将第一半透明粒子的渲染结果存储在预设位置,以便后续帧图像的复用。对于其他渲染,如第二半透明粒子或者主场景的渲染,电子设备可以按照游戏应用下发的渲染指令流正常执行图像的渲染。由此实现半透明粒子渲染结果的合理复用。在降低半透明粒子的渲染开销的同时,保证渲染结果的准确性。
示例性的,参考图7,结合图6的示意,第N帧图像的渲染过程类似。对于第N+1帧图像渲染过程中,游戏应用下发指令段A2,以及包括指令段B1和指令段B2的指令段B。CPU可以将指令段A2和指令段B2向下传递,通过图形库指示GPU进行主场景以及基于该主场景的第二半透明粒子的渲染。在该第N+1帧图像中,电子设备可以不需要执行对指令段B1的渲染,而是复用第一半透明粒子渲染结果。这样,通过合并第一半透明粒子渲染结果以及对指令段A2和指令段B2进行渲染获取的结果,即可获得第N+1帧图像的渲染结果。可以看到,在图7所示的本方案中,对第N+1帧图像的渲染过程,复用的指令段B1指示的对第一半透明粒子的渲染结果,由此节省了对应的渲染开销。
以下结合附图对本申请实施例提供的方案进行详细说明。
需要说明的是,本申请实施例提供的图像渲染方法,可以应用在用户的电子设备中。比如,该电子设备可以是手机、平板电脑、个人数字助理(personal digitalassistant,PDA)、增强现实(augmented reality,AR)\虚拟现实(virtual reality,VR)设备、媒体播放器等便携式移动设备,该电子设备也可以是智能手表等能够提供显示能力的可穿戴电子设备。本申请实施例对该设备的具体形态不作特殊限制。
示例性的,在一些实施例中,从硬件组成的角度,本申请实施例涉及的电子设备可以包括处理器,外部存储器接口,内部存储器,通用串行总线(universal serial bus,USB)接口,充电管理模块,电源管理模块,电池,天线1,天线2,移动通信模块,无线通信模块,音频模块,扬声器,受话器,麦克风,耳机接口,传感器模块,按键,马达,指示器,摄像头,显示屏,以及用户标识模块(subscriber identification module,SIM)卡接口等。其中,传感器模块可以包括压力传感器,陀螺仪传感器,气压传感器,磁传感器,加速度传感器,距离传感器,接近光传感器,指纹传感器,温度传感器,触摸传感器,环境光传感器,骨传导传感器等。
需要说明的是,上述硬件组成并不构成对电子设备的具体限定。在另一些实施例中,电子设备可以包括更多或更少的部件,或者组合某些部件,或者拆分某些部件,或者不同的部件布置。
在另一些实施例中,本申请实施例涉及的电子设备还可以具有软件划分。以电子设备中运行有安卓操作系统为例。在该安卓操作系统中,可以具有分层的软件划分。
示例性的,图8为本申请实施例提供的一种电子设备的软件组成的示意图。如图8所示,该电子设备可以包括应用(application,APP)层,框架(Framework)层,系统库,以及硬件(HardWare)层等。
其中,应用层也可以称为应用程序层。在一些实现中,应用程序层可以包括一系列应用程序包。应用程序包可以包括相机,图库,日历,通话,地图,导航,WLAN,蓝牙,音乐,视频,短信息等应用程序。在本申请实施例中,应用程序包还可以包括需要通过渲染图像向用户展示图像或者视频的应用程序。其中,视频可以理解为多帧图像的连续播放。其中可以包括具有半透明粒子的帧图像。示例性的,该应用程序可以包括游戏类应用程序,例如
Figure BDA0003548483210000081
Figure BDA0003548483210000082
等。
框架层也可以称为应用程序框架层。该框架层可以为应用层的应用程序提供应用编程接口(application programming interface,API)和编程框架。框架层包括一些预先定义的函数。示例性的,框架层可以包括窗口管理器,内容提供器,视图系统,资源管理器,通知管理器,活动管理器,输入管理器等。窗口管理器提供窗口管理服务(Window ManagerService,WMS),WMS可以用于窗口管理、窗口动画管理、surface管理以及作为输入系统的中转站。内容提供器用来存放和获取数据,并使这些数据可以被应用程序访问。该数据可以包括视频,图像,音频,拨打和接听的电话,浏览历史和书签,电话簿等。视图系统包括可视控件,例如显示文字的控件,显示图片的控件等。视图系统可用于构建应用程序。显示界面可以由一个或多个视图组成的。例如,包括短信通知图标的显示界面,可以包括显示文字的视图以及显示图片的视图。资源管理器为应用程序提供各种资源,比如本地化字符串,图标,图片,布局文件,视频文件等等。通知管理器使应用程序可以在状态栏中显示通知信息,可以用于传达告知类型的消息,可以短暂停留后自动消失,无需用户交互。比如通知管理器被用于告知下载完成,消息提醒等。通知管理器还可以是以图表或者滚动条文本形式出现在系统顶部状态栏的通知,例如后台运行的应用程序的通知,还可以是以对话窗口形式出现在屏幕上的通知。例如在状态栏提示文本信息,发出提示音,电子设备振动,指示灯闪烁等。活动管理器可以提供活动管理服务(Activity Manager Service,AMS),AMS可以用于系统组件(例如活动、服务、内容提供者、广播接收器)的启动、切换、调度以及应用进程的管理和调度工作。输入管理器可以提供输入管理服务(Input Manager Service,IMS),IMS可以用于管理系统的输入,例如触摸屏输入、按键输入、传感器输入等。IMS从输入设备节点取出事件,通过和WMS的交互,将事件分配至合适的窗口。
在本申请实施例中,在框架层中可以设置有一个或多个功能模块,用于实现本申请实施例提供的方案。
示例性的,框架层中可以设置有拦截模块、创建模块、替换模块以及合成模块等。其中,拦截模块可以用于进行相关指令的拦截。例如,该相关指令可以指应用程序下发的用于指示进行第一半透明粒子的渲染指令。
创建模块可以用于进行新的存储空间的创建。比如,创建新的帧缓冲(FrameBuffer,FB),该帧缓冲对应的贴图(Texture)等。该新创建的存储空间即可对应到前述说明中的预设位置。
替换模块可以用于将第一半透明粒子的渲染指令指向的帧缓冲替换到新建的帧缓冲上,从而使得该第一半透明粒子的渲染结果可以存储在新建的帧缓冲上,以便于后续复用。
合成模块可以用于指示电子设备将存储在新建的帧缓冲中的第一半透明粒子的渲染结果以及其他渲染结果的合成,从而获取该帧图像对应渲染结果。其中,该其他渲染结果可以包括主场景渲染基础上进行的第二半透明粒子的渲染结果。
系统库可以包括图形库。在不同实现中,图形库可以包括如下中的至少一种:开放图形库(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的应用程序提供轻量级关系型数据库。
在如图8的示例中,电子设备中还可以包括硬件层。该硬件层中可以包括CPU,GPU,以及具有存储功能的存储器。在一些实现中,CPU可以用于控制框架层中的各个模块实现其各自的功能,GPU可以用于根据框架层中各个模块处理后的指令所调用的图形库(如OpenGLES)中的API执行相应的渲染处理。
以下说明中,将结合如图8所示的软件划分,对本申请实施例提供的方案进行详细说明。
本申请实施例提供的渲染方案,可以在第N帧图像渲染过程中,将第一半透明粒子预先存储在新建的帧缓冲中。在后面帧图像的渲染过程中,电子设备可以直接将应用程序(如游戏应用)下发的对第一半透明粒子的渲染指令流返回,不再重复执行,而是直接复用新建的帧缓冲中的第一半透明粒子的渲染结果。
以下说明中,以第N+1帧图像复用第N帧图像中渲染的半透明粒子为例。
为了便于理解,以下首先以应用程序为游戏应用,对本申请实施例提供方案中涉及的游戏运行过程中指令流的组成,以及相关概念(如主场景等)进行简要说明。
可以理解的是,在游戏应用运行之后,会在需要进行第N帧图像的显示时,向电子设备下发包括多个指令的指令流。其中可以包括用于指示电子设备进行主场景渲染的指令流11;用于指示电子设备进行半透明粒子的渲染的指令流12;用于指示电子设备将半透明粒子与第N帧的主场景合并到同一张贴图上的指令流13等。结合前述对于第一半透明粒子以及第二半透明粒子的说明,在本示例中该指令流12中也可以包括用于指示进行第一半透明粒子渲染的指令段12A,以及用于指示进行第二半透明粒子渲染的指令段12B。
对应到图6或图7的说明,指令流11可以对应到第N帧图像的指令段A1,指令流12可以对应到第N帧图像的指令段B。指令段12A可以对应到指令段B1,指令段12B可以对应到指令段B2。
作为一种具体的实现,该第一半透明粒子可以包括混合方程中srcRGB为GL_ONE以及srcRGB为GL_SRC_ALPHA对应的半透明粒子。第二半透明粒子可以包括混合方程中srcRGB为GL_DST_COLOR对应的半透明粒子。
其中,混合方程可以是游戏应用下发的,携带在指令流12中的用于指示电子设备进行各个渲染结果混合的指令。示例性的,混合方程可以通过glBlendFuncSeparate指令下发。
电子设备可以根据混合方程中指示的srcRGB的不同值,以及各自对应的混合参数,执行对应的渲染。比如,电子设备可以直接对srcRGB为GL_ONE、GL_SRC_ALPHA的两种半透明粒子进行渲染。又如,电子设备可以对srcRGB为GL_DST_COLOR的半透明粒子,结合主场景的渲染结果进行该半透明粒子的渲染。在一些实施例中,电子设备可以基于多目标渲染(Multiple Render Targets,MRT)技术,根据各个半透明粒子以及主场景的渲染结果获取当前帧图像最终的渲染结果。
在本申请实施例中,与第N帧图像类似的,在其他图像的渲染中,游戏应用下发的指令流也可以包括多个。以第N+1帧图像为例。游戏应用下发的指令流可以包括:用于指示电子设备进行主场景渲染的指令流21,用于指示电子设备进行半透明粒子的渲染的指令流22,以及用于指示电子设备将半透明粒子与第N+1帧的主场景(如主场景21)合并到同一张贴图上的指令流23等。结合前述对于第一半透明粒子以及第二半透明粒子的说明,在本示例中该指令流22中也可以包括用于指示进行第一半透明粒子渲染的指令段22A,以及用于指示进行第二半透明粒子渲染的指令段22B。
对应到图6或图7的说明,指令流21可以对应到第N+1帧图像的指令段A2。由于相邻帧图像的半透明粒子基本一致,因此在第N帧图像和第N+1帧图像中的半透明粒子相应的渲染指令可以相同或相近。例如,与指令流21类似的,指令流22可以对应到第N+1帧图像的指令段B,指令段22A可以对应到指令段B1,指令段22B可以对应到指令段B2。
在本申请实施例中,电子设备可以在执行第N帧图像的渲染之前,确定主场景的帧缓冲ID。一般而言,不同帧图像的主场景可以不同。比如,第N帧图像的主场景可以为主场景11,第N帧图像中的主场景也可以称为第二主场景。第N+1帧图像的主场景可以为主场景21。第N+1帧图像中的主场景也可以称为第一主场景。而不同的帧图像的主场景都可以存储在相同的帧缓冲中。比如,第N帧图像渲染过程中,可以将主场景11存储在FB0中。在完成第N帧图像的渲染之后,执行第N+1帧图像的渲染时,电子设备可以将主场景21存储在该FB0。第N+1帧的主场景21可以在FB0中覆盖主场景11,从而据此获取第N+1帧图像的渲染结果。在本申请中,FB0也可以称为帧缓冲11。
关于主场景的确定时机以及确定实现,在不同实施例中可以是不同的。
在一些实施例中,电子设备可以在游戏开始运行并完成加载后,根据游戏应用下发的首帧图像的渲染指令确定后续帧图像渲染过程中的主场景。在另一些实施例中,电子设备可以根据预设的第M帧图像的渲染指令确定后续帧图像渲染过程中的主场景。其中,第M帧图像可以是第N帧图像之前的帧图像。在一些实现中,M可以大于1,这样可以确保游戏稳定运行后在确定主场景。
此外,该确定主场景的步骤,可以是在游戏运行过程中只执行一次,后续帧图像均以该确定结果为准确定帧图像的。在另一些实施例中,该确定主场景的步骤,也可以是按照预设周期循环执行,以更新主场景的帧缓冲信息(如帧缓冲ID等)。在另一些实施例中,该确定主场景的步骤,也可以是根据电子设备的实时负载情况触发执行的。比如,对于游戏应用而言,在切换主场景时,电子设备的负载可能发生显著的变化。那么,在电子设备的负载变化超过预设的负载阈值时,可以触发该主场景的确定步骤,更新主场景的缓冲信息。在后续的帧图像渲染过程中,可以根据该更新后的主场景的缓冲信息进行主场景的渲染。
以下将结合前述说明,以及如下图9-图11,对本申请实施例提供的方案进行详细的说明。
请参考图9,为本申请实施例提供的一种图像渲染方案的模块交互示意图。基于该图9的方案,电子设备能够在执行第N帧图像的渲染过程中,实现对主场景的渲染。
如图9所示,游戏应用可以下发指令流11,用于指示电子设备进行主场景的渲染。
在第N帧图像渲染的过程中,拦截模块可以接收游戏应用下发的指令流。在该指令流中可以包括指令流11等。拦截模块可以被设置为,拦截与第一半透明粒子相关的渲染指令流。对于其他指令流,拦截模块可以直接回调给图形库,以便图形库根据接收到的指令流调用对应的API,实现该对应的渲染功能。其中,拦截模块对于确定第一半透明粒子的渲染指令流的方式,会在后续说明中详细解释。
在本示例中,拦截模块接收到指令流11后,确定该指令流11并非针对第一半透明粒子的渲染指令流。因此,拦截模块可以将该指令流11回调给图形库。图形库可以在接收到该指令流11之后,调用对应的API,指示GPU进行第N帧主场景的渲染。对应的,GPU可以进行渲染,并在帧缓冲11(即FB0)上渲染获取主场景11。
由此即可实现对第N帧图像主场景的渲染。
游戏应用在下发指令流11之后,还可以下发其他指令流,比如下发指令流12,用于指示电子设备进行半透明粒子的渲染。
请参考图10。游戏应用可以继续下发第N帧图像的指令流,其中可以包括用于指示电子设备进行第一半透明粒子以及第二半透明粒子渲染的指令流12。
在本申请中,该指令流12可以是游戏应用下发的指令流中,以特定的开头指令(如glEnable指令)开始,以特定的结尾指令(如glDisable指令)结束的指令段。在一些实施例中,结尾指令也可以指glDiscardFramebufferEXT()指令。
应当理解的是,在进行第N图像的渲染过程中,以渲染环境为OpenGL为例。由于OpenGL是一个状态机,因此,在渲染半透明粒子时需要改变相应的渲染状态。此外,为了渲染出不同的透明度级别,需要通过会使能(enable)颜色混合状态。在本示例中,游戏应用可以通过glEnable指令使能(enable)颜色混合状态,即通过glEnable指令指示电子设备开始进行半透明粒子的渲染。因此,指令流12的开头指令可以为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指令进行使能。相对的,在游戏应用下发的指令没有采用索引的方式进行数据寻址时,就不需要携带索引参数。那么,就会使用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指令,指示电子设备彻底关闭当前针对半透明粒子的颜色混合操作。因此,glDiscardFramebufferEXT()指令和/或glDisable指令可以作为指令流12的结尾指令。
示例性的,如下表3示出了本示例中指令流12的结束部分的一种示意。
表3
指令ID(EID) 指令内容(Event)
>6167 glBindBuffer(GL_UNIFORM_BUFFER,Buffer 15245)
>6168 glBufferSubData(Buffer 15254,(96bytes))
>6169 glBindBuffer(GL_UNIFORM_BUFFER,Buffer 21484)
>6170 glBufferSubData(Buffer 21484,(48bytes))
>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()指令关闭颜色混合为例。
通过上述表1-表3的相关说明,该指令流12可以是以glEnable指令作为开头指令,glDisable()指令为结尾指令的指令段。通过下发该指令流12,游戏应用可以指示电子设备进行包括第一半透明粒子以及第二半透明粒子的半透明粒子的渲染。
示例性的,在指令流12中,可以包括用于指示混合方程的glBlendFuncSeparate指令。作为一种示例,glBlendFuncSeparate指令可以为glBlendFuncSeparate(GLenumsrcRGB,GLenum dstRGB,GLenum srcAlpha,GLenum dstAlpha)。可以看到,该指令中携带有多个参数,srcRGB指定如何计算红色,绿色和蓝色混合因子,初始值为GL_ONE;dstRGB指定如何计算红色,绿色和蓝色目标混合因子,初始值为GL_ZERO;srcAlpha指定如何计算alpha源混合因子,初始值为GL_ONE;dstAlpha指定如何计算alpha目标混合因子,初始值为GL_ZERO。
上述glBlendFuncSeparate指令可以指示电子设备按照如下公式(1)进行混合处理。
Cˉresult=Cˉsource×Fsource+Cˉdestination×Fdestination……公式(1)。
其中,Cˉsource为源颜色向量。这是来自纹理的本来的颜色向量。Cˉdestination为目标颜色向量。这是储存在颜色缓冲中当前位置的颜色向量。Fsource为源因子。设置了对源颜色的alpha值影响。Fdestination为目标因子。设置了对目标颜色的alpha影响。alpha值则用于指示对应元素的透明度。
游戏应用可以通过glBlendFuncSeparate指令中srcRGB的不同值,指示电子设备进行第一半透明粒子以及第二半透明粒子的渲染。
示例性的,srcRGB的不同值可以包括GL_ONE,GL_SRC_ALPHA以及GL_DST_COLOR。其中,srcRGB为GL_ONE的glBlendFuncSeparate()指令以及srcRGB为GL_SRC_ALPHA的glBlendFuncSeparate()指令可以用于指示电子设备进行第一半透明粒子的渲染。也就是说,srcRGB为GL_ONE的glBlendFuncSeparate()指令以及srcRGB为GL_SRC_ALPHA的glBlendFuncSeparate()指令指示电子设备进行的半透明粒子渲染,与主场景无关。对应的,srcRGB为GL_DST_COLOR的glBlendFuncSeparate()指令可以用于指示电子设备进行第二半透明粒子的渲染。也就是说,srcRGB为GL_DST_COLOR的glBlendFuncSeparate()指令指示电子设备进行的半透明粒子渲染需要结合对应像素位置的主场景的渲染情况进行。
结合前述说明,该在指令流12中,srcRGB为GL_ONE的glBlendFuncSeparate()指令以及srcRGB为GL_SRC_ALPHA的glBlendFuncSeparate()指令对应的指令段可以对应到指令段12A。该在指令流12中,srcRGB为GL_DST_COLOR的glBlendFuncSeparate()指令对应的指令段可以对应到指令流12中的指令段12B。
在本申请实施例中,拦截模块可以拦截该指令流12中的指令段12A,并将该指令段12A传输给其他模块(如创建模块)进行后续处理。
示例性的,拦截模块可以监控渲染指令流,在监控到游戏应用下发glEnable指令时,则表明游戏应用下发了指令流12。拦截模块可以开始拦截游戏应用下发的指令,直至监测到glDisable()指令或者glDiscardFramebufferEXT()指令。由此即可实现对指令流12的拦截。
拦截模块可以将指令流12中srcRGB为GL_ONE的glBlendFuncSeparate()指令以及srcRGB为GL_SRC_ALPHA的glBlendFuncSeparate()指令对应的指令段(即指令段12A)传输给创建模块,以便于创建模块进行响应。拦截模块还可以将指令流12中的指令段12B回调给图形库,以便于图形库执行第二半透明粒子的渲染。
作为一种可能的实现,拦截模块将指令段12B传输给图形库后,图形库可以调用对应的API,指示GPU进行第二半透明粒子的渲染。GPU可以根据该指令段12B,从主场景的贴图中对应位置进行颜色采样,从而根据采样结果以及指令段12B中指示的颜色等参数,进行该位置的渲染。由此即可将第二半透明粒子渲染到主场景中。例如,以主场景11存储在帧缓冲11(如FB0)中,那么该基于主场景11的第二半透明粒子的渲染结果也可以存储在FB0上。作为一种示例,通过如下代码逻辑,即可实现度第二半透明粒子的渲染。
glBlendFuncSeparate(srcRGB,dstRGB,GL_ONE,GL_ONE);
srcRGB==GL_DST_COLOR//将此属性粒子依旧渲染到原始目标纹理中,即主场景上;
glBindFramebuffer(GL_FRAMEBUFFER,FB0);
glReadBuffer(GL_COLOR_ATTACHMENT0);
glBlendFuncSeparate(srcRGB,dstRGB,srcAlpha,dstAlpha);
这样,在完成第二半透明粒子的渲染操作之后,帧缓冲11上就可以存储有主场景以及第二半透明粒子的渲染结果。
在本示例中,创建模块可以用于创建新的存储空间,以便于进行第一半透明粒子的渲染。
可以理解的是,在已有方案中,游戏应用下发的对第一半透明粒子的渲染指令流会被CPU通过图形库下发给GPU进行对应操作。而GPU对于该半透明粒子的渲染结果可以存储在指定的存储空间中。一般而言,CPU无法知晓该半透明粒子渲染结果的存储位置,因此也就无法实现对该渲染结果的复用。
对应的,在本申请实施例中,通过创建模块新创建的存储空间可以用于存储第一半透明粒子的渲染结果。该过程可以是CPU控制进行的。那么,CPU就能够知晓第一半透明粒子的渲染结果的存储位置,从而实现后续帧图像对该渲染结果的复用。
作为一种示例,以第一半透明粒子包括GL_ONE以及GL_SRC_ALPHA的渲染为例。创建模块可以根据拦截模块传输的指令段12A,分别为GL_ONE以及GL_SRC_ALPHA的渲染创建新的存储空间。例如,创建模块可以创建一个新的帧缓冲,如帧缓冲12。该帧缓冲12的ID可以设置为alpha_A,那么该帧缓冲12也可以称为FB(alpha_A)。创建模块还可以创建两个新的贴图,如Texture_A_1以及Texture_A_2。这两个贴图可以分别用于存储GL_ONE以及GL_SRC_ALPHA的渲染结果。在一些实施例中,创建模块可以将Texture_A_1以及Texture_A_2绑定到FB(alpha_A)上。该Texture_A_1以及Texture_A_2可以用于存储对应半透明粒子的color数据,因此,可以将该Texture_A_1以及Texture_A_2的attachment属性设置为0。这样,GL_ONE以及GL_SRC_ALPHA的渲染结果就可以分别被存储在FB(alpha_A)中。
示例性的,创建模块可以通过glGenTextures(1,&(Texture_A_1))创建Texture_A_1,通过glGenTextures(1,&(Texture_A_2))创建Texture_A_2,通过glGenFramebuffers(1,&(alpha_A))创建FB(alpha_A),通过glBindFramebuffer(GL_FRAMEBUFF,alpha_A)绑定到FB(alpha_A)。以便于后续操作都可以在FB(alpha_A)上执行。例如,通过glFramebufferTexture2D(GL_FRAMEBUFFER,GL_COLOR_ATTACHMENT0,GL_TEXTURE_2D,Texture_A_1,0)将Texture_A_1绑定到FB(alpha_A)上,其中,GL_COLOR_ATTACHMENT0参数用于指示该Texture_A_1对应贴图中存储有color数据。类似的,创建模块可以通过glFramebufferTexture2D(GL_FRAMEBUFFER,GL_COLOR_ATTACHMENT0,GL_TEXTURE_2D,Texture_A_2,0)将Texture_A_2绑定到FB(alpha_A)上。其中,GL_COLOR_ATTACHMENT0参数用于指示该Texture_A_2对应贴图中存储有color数据。
在本申请的一些实施例中,创建模块还可以创建其他帧缓冲。比如,创建模块可以创建帧缓冲13以及对应的贴图。该帧缓冲13可以用于执行其他的渲染操作。比如,在GPU完成FB0(即帧缓冲11)以及FB(alpha_A)(即帧缓冲12)上的渲染操作之后,将FB0以及FB(alpha_A)上的贴图合成到帧缓冲13上,从而在帧缓冲13上获取当前帧图像的渲染结果。
示例性的,以帧缓冲13的ID为alpha_B,即帧缓冲13也可称为FB(alpha_B)为例。创建模块可以通过glGenTextures(1,&(Texture_B))创建Texture_B,通过glGenFramebuffers(1,&(alpha_B))创建FB(alpha_B),通过glBindFramebuffer(GL_FRAMEBUFF,alpha_B)绑定FB(alpha_B),以便后续操作可以在FB(alpha_B)上执行。比如,创建模块可以通过glFramebufferTexture2D(GL_FRAMEBUFFER,GL_COLOR_ATTACHMENT0,GL_TEXTURE_2D,Texture_B,0)将Texture_B绑定到FB(alpha_B)上。
需要说明的是,在如图10所示的示例中,是以创建模块在接收到拦截模块发送的指令段12A后创建帧缓冲12和帧缓冲13为例进行说明的。在本申请的另一些实施例中,创建帧缓冲12和/或帧缓冲13的时机也可不同。例如,创建模块可以在当前帧图像(如第N帧图像)开始渲染时,就预先创建帧缓冲12和/或帧缓冲13。创建模块可以记录预先创建帧缓冲12和/或帧缓冲13的ID,以便后续直接使用。又如,创建模块可以在拦截模块拦截到指令流12(如拦截到glEnable()指令)后创建帧缓冲12和/或帧缓冲13。
可以看到,创建模块创建帧缓冲12以及帧缓冲13是用于执行后续渲染过程中的数据存储的。不直接使用原始帧缓冲的目的是为了便于后续重复调用。因此,在本申请的另一些实施例中,如果存在可以被CPU调用的可用帧缓冲或空闲帧缓冲,创建模块也可以不再创建新的帧缓冲,而是直接使用该已经被创建的帧缓冲即可。
作为一种示例,以第N帧图像为游戏加载完成后第1帧图像为例。由于当前帧图像为第1帧图像,一般不存在已经创建的可被CPU调用的空闲帧缓冲,那么创建模块可以根据如图10所示的机制,在接收到拦截模块发送的指令段12A后创建帧缓冲12和帧缓冲13。在另一些实现中,以第N帧图像之前已经创建了帧缓冲12以及帧缓冲13为例。那么在该第N帧图像中,创建模块可以在接收到来自拦截模块的指令段12A时,不再创建新的帧缓冲,而是将该已经创建的空闲帧缓冲(如帧缓冲12以及帧缓冲13)作为新创建的帧缓冲进行处理。
在完成新的存储空间的创建之后,在本申请实施例中,创建模块还可以将指令段12A以及新建帧缓冲ID发送给替换模块。以便于替换模块执行后续操作。
在本申请实施例中,替换模块可以用于将指令段12A指向的帧缓冲替换到新建的帧缓冲(如帧缓冲12等)。
示例性的,针对指令段12A中srcRGB为GL_ONE的指令流,替换模块可以通过如下指令实现帧缓冲的替换:
glBindFramebuffer(GL_FRAMEBUFFER,alpha_A);//绑定FB(alpha_A);
glFramebufferTexture2D(GL_FRAMEBUFFER,GL_COLOR_ATTACHMENT0,GL_TEXTURE_2D,Texture_A_1,0);//绑定Texture_A_1到当前帧缓冲的ATTACHMENT0;
glBlendFuncSeparate(srcRGB,dstRGB,GL_ONE,GL_ONE);//下发替换帧缓冲之后的混合方程。
需要说明的是,在前述创建模块的处理机制中,在创建新的帧缓冲以及贴图之后,可以直接将新的贴图绑定到该新的帧缓冲中。那么,在替换模块进行帧缓冲替换时,则可以直接绑定新的帧缓冲,而不需要再次进行贴图的绑定。
对应的,如果在创建模块中未进行贴图向帧缓冲的绑定,那么替换模块则可以在绑定新的帧缓冲之后,将贴图绑定在帧缓冲里,以便后续在该贴图上保存渲染结果。在该示例中,将贴图绑定在帧缓冲里的操作在替换模块中执行,那么创建模块可以在向替换模块发送指令段12A以及新建帧缓冲ID的同时,将新的贴图(如Texture_A_1)的相关信息(如ID)发送给替换模块,以便于替换模块据此进行贴图向帧缓冲的绑定操作。
类似的,针对指令段12A中srcRGB为GL_SRC_ALPHA的指令流,替换模块可以通过如下指令实现帧缓冲的替换:
glBindFramebuffer(GL_FRAMEBUFFER,alpha_A);//绑定FB(alpha_A);
glFramebufferTexture2D(GL_FRAMEBUFFER,GL_COLOR_ATTACHMENT0,GL_TEXTURE_2D,Texture_A_2,0);//绑定Texture_A_2到当前帧缓冲的ATTACHMENT0;
glBlendFuncSeparate(srcRGB,dstRGB,GL_ONE,GL_ONE);//下发替换帧缓冲之后的混合方程。
在本示例中,上述替换帧缓冲之后获取的混合方程对应指令流(包括srcRGB为GL_ONE以及GL_SRC_ALPHA对应的指令流)可以称为指令段12C。
这样,根据指令段12C进行的渲染,就可以在完成第一半透明粒子的渲染的同时,将第一半透明粒子的渲染结果存储在帧缓冲12(如FB(alpha_A))中。
替换模块可以将指令段12C发送给图形库。对应的,图形库可以调用指令段12C指示的API,指示GPU执行第一半透明粒子的渲染。可以理解的是,又如指令段12C绑定有帧缓冲11,那么,GPU就可以将第一半透明粒子的渲染结果存储在帧缓冲12中。
示例性的,GPU可以根据指令段12C对应的API,将srcRGB为GL_ONE的第一半透明粒子的渲染结果存储在FB(alpha_A)的ATTACHMENT0上的Texture_A_1,将srcRGB为GL_SRC_ALPHA的第一半透明粒子的渲染结果存储在FB(alpha_A)的ATTACHMENT0上的Texture_A_2。
为了获取第N帧图像的渲染结果,结合图11,电子设备可以在完成主场景以及各个半透明粒子的渲染之后,将各个渲染结果进行合成,以便将所有渲染结果合成到一个贴图上。
示例性的,完成主场景渲染以及半透明粒子渲染之后,第一半透明粒子的渲染结果可以存储在帧缓冲12中,第二半透明粒子以及主场景的渲染结果可以存储在帧缓冲11中。如图11所示,在本申请实施例中,电子设备可以将帧缓冲12以及帧缓冲11中的贴图作为输入,在新建的帧缓冲13上执行对应的合成操作,从而在帧缓冲13上获取包括所有半透明粒子以及主场景的渲染结果。
结合图10,在替换模块向图形库发出了指令段12C之后,则GPU就可以顺序完成半透明粒子的渲染。
在一些实施例中,替换模块可以在向图形库发出指令流13之后,向合成模块发送半透明粒子渲染完成指示。由此使得合成模块知晓半透明粒子渲染完成。接着,合成模块可以向GPU发送指令流13,用于指示GPU执行主场景渲染结果与半透明粒子渲染结果的合成。
可以理解的是,在合成模块发送指令流13时,即使GPU还没有完全完成半透明粒子的渲染操作,而由于该指令流13到达GPU的时间晚于指令段12C,因此在GPU的指令队列中,指令流13的执行也会在指令段12C之后。那么可以保证在执行合成操作时,主场景渲染结果与半透明粒子渲染结果均已经存储在对应的帧缓冲中。
在另一些实施例中,合成模块发出指令流13的触发机制也可以不同。例如,GPU可以在完成指令段12C的执行之后,向合成模块返回半透明粒子渲染完成指示。那么,响应于该半透明粒子渲染完成指示,合成模块就可以发出指令流14,以指示GPU执行主场景渲染结果与半透明粒子渲染结果的合成。
如图11所示,响应于合成模块发出的指令流13,GPU可以从帧缓冲11中读取存储的数据,以及从帧缓冲12中读取存储的数据。例如,GPU可以从帧缓冲11中读取主场景11以及第二半透明粒子的渲染结果,GPU可以从帧缓冲12中读取第一半透明粒子的渲染结果。GPU可以根据预设的混合方程,在帧缓冲13上获取该第N帧图像中,与游戏应用下发的渲染指令流对应的完整渲染结果。
示例性的,以下给出本申请提供的一种混合方程的示例。该混合方程可以携带在合成命令中,以便指示GPU据此进行合成操作。
"highp vec4 color1=texture(Texture_A_1,TexCoord);\n"
"highp vec4 color2=texture(Texture_A_2,TexCoord);\n"
"highp vec4 color3=texture(FB0_main,blendTexCoord);\n"
"outColor.rgb=color2.a*color2.rgb+(1.0f-color2.a)*(color3.rgb+color1.rgb);\n"
由此,即可在帧缓冲13上得到包括主场景以及所有半透明粒子的渲染结果。接着,电子设备可以根据游戏应用下发的第N帧图像中的其他指令,对该帧缓冲13上的数据继续进行处理。比如,在帧缓冲13的贴图上执行用户界面(User Interface,UI)渲染,之后获取送显数据。根据该送显数据,即可在显示屏上显示第N帧图像。
通过上述方案示例,即可完成第N帧图像的渲染过程。可以看到,本申请实施例中,对第N帧图像的渲染过程中,可以将第一半透明粒子的渲染结果存储在新建的帧缓冲(如帧缓冲12)上,由此实现后续帧图像的复用功能。同时,与主场景相关的第二半透明粒子的渲染可以结合已经完成的主场景贴图进行,结果可以被存储在帧缓冲11上。通过合成可以正常获取对应的渲染结果。
为了能够对本申请实施例提供的方案在第N帧图像进行的渲染过程进行更加清楚的说明,以下结合如图12所示的交互流程图,继续对第N帧图像的渲染过程进行说明。如图12所示,该方案可以包括:
S1201、在游戏应用下发指令流11后,拦截模块将指令流11回调给图形库。
其中,指令流11用于指示电子设备执行主场景的渲染。结合前述说明,拦截模块可以根据预设的开头指令以及结尾指令,执行对应指令流的拦截。对于其他指令流可以直接回调给图形库。比如,对于指令流11可以直接回调给图形库,即执行S1201。
S1202、图形库指示GPU执行对应的渲染操作。
示例性的,图形库根据指令流11调用对应的API,指示GPU执行主场景相关的渲染操作。渲染结果(如主场景11)可以存储在指令流11指示的帧缓冲11中。
S1203、GPU渲染获取主场景11。
S1204、GPU将主场景11存储在帧缓冲11中。
由此完成主场景的渲染,获取主场景对应的贴图存储在帧缓冲11中。
上述S1201-S1204的具体执行过程,可以参考如图9的说明,此处不再赘述。
S1205、在游戏应用下发指令流12后,拦截模块拦截指令流12。
其中,指令流12可以是指示电子设备执行半透明粒子的渲染的指令。指令段12A可以是指令流12中包括的用于指示电子设备进行第一半透明粒子的渲染的指令段。
示例性的,拦截模块可以监测游戏应用下发指令流中是否出现预设的开头指令。比如,该开头指令可以为glEnable()指令。拦截模块可以在监测到该glEnable()指令后,开始指令的拦截。拦截模块可以监测游戏应用下发指令流中是否出现预设的结尾指令。比如,该结尾指令可以为glDisable()指令。拦截模块可以在监测到该glDisable()指令后,停止指令的拦截。由此拦截到的指令就可以为指令流12。
拦截模块可以基于指令流12中,srcRGB为GL_ONE或者GL_SRC_ALPHA的glBlendFuncSeparate()指令确定指令段12A。指令流12中不同于指令段12A的部分,如srcRGB为GL_DST_COLOR的glBlendFuncSeparate()指令对应的指令段可以对应到指令流12中的指令段12B。对于指令段12A,拦截模块可以执行以下S1205-S1213。对应的,对于指令段12B,拦截模块可以将其回调给图形库,实现第二半透明粒子与主场景的渲染。该过程可以参考以下S1214-S1218。
S1206、拦截模块向创建模块发送指令段12A。
S1207、创建模块创建帧缓冲12和帧缓冲13。
S1208、创建模块将指令段12A以及新建帧缓冲ID发送给替换模块。
S1209、替换模块将指令段12A中绑定的帧缓冲替换为帧缓冲12,以获取指令段12C。
其中,指令段12A用于指示第一半透明粒子的渲染,那么指令段12A中绑定的帧缓冲即用于存储第一半透明粒子的渲染结果。在本示例中,替换模块可以将指令段12A中绑定的帧缓冲替换为新建的帧缓冲12,以在帧缓冲12中存储第一半透明粒子的渲染结果。
在替换模块完成S1209的操作之后,就可以获取对应的指令段12C。该指令段12C与指令段12A同样用于指示电子设备进行与主场景无关的第一半透明粒子的渲染,其区别在于保存第一半透明粒子的帧缓冲被替换为帧缓冲12。
S1210、替换模块向图形库发送指令段12C。
S1211、图形库指示GPU执行对应的渲染操作。
示例性的,图形库根据指令段12C调用对应的API,指示GPU执行第一半透明粒子相关的渲染操作。这样第一半透明粒子的渲染结果可以存储在指令段12C指示的帧缓冲12中。
S1212、GPU渲染获取第一半透明粒子的渲染结果。
S1213、GPU将第一半透明粒子的渲染结果存储在帧缓冲12中。
S1214、拦截模块将指令段12B发送给图形库。
S1215、图形库根据指令段12B指示GPU执行对应的渲染操作。
S1216、GPU从存储器获取主场景11。其中,GPU可以从帧缓冲11中获取主场景11。
S1217、GPU在主场景11基础上进行第二半透明粒子的渲染。
S1218、GPU将包括主场景以及第二半透明粒子的渲染结果存储在帧缓冲11中。
这样,在更新的帧缓冲11的贴图中就可以包括主场景11以及第二半透明粒子的渲染结果。上述S1205-S1218的具体执行过程,可以参考如图10的说明,此处不再赘述。
S1219、替换模块向合成模块发送半透明粒子渲染完成指示。
示例性的,替换模块可以在发送指令段12C之后执行该S1219。在一些实施例中,替换模块可以在执行该S1219时,向合成模块发送帧缓冲13的ID,以便于后续在帧缓冲13上执行合成操作。
S1220、合成模块向GPU发送指令流13。其中,该指令流13用于指示GPU在帧缓冲13上执行合成操作。
S1221、GPU从帧缓冲11中读取数据。该数据可以包括主场景11以及基于主场景进行的第二半透明粒子的渲染结果。
S1222、GPU从帧缓冲12中读取数据。该数据可以包括第一半透明粒子的渲染结果。
在一些实施例中,由于GPU已经完成主场景、第二半透明粒子的渲染以及第一半透明粒子的渲染,因此GPU能够知晓各个渲染结果的存储位置。那么GPU就可以在接收到指令流13后,执行S1221以及S1222。在另一些实施例中,在执行S1220时,合成模块向GPU发送的指令流13中也可以携带有需要合成的帧缓冲的ID,比如,在指令流13中可以携带有帧缓冲11和帧缓冲12的ID,以便于GPU根据指令流13指示的帧缓冲执行后续S1221和S1222。作为一种可能的实现,合成模块携带在指令流13中的需要合成的帧缓冲ID可以是在S1219中,由替换模块发送给合成模块的。
S1223、GPU合成主场景11以及第一半透明粒子的渲染结果。
S1224、GPU将合成结果存储在帧缓冲13中。
上述S1219-S1224的具体执行过程,可以参考如图8的说明,此处不再赘述。
这样,通过前述图9-图12的说明,即可完成第N帧图像的渲染。在帧缓冲12中可以存储有与主场景无关的第一半透明粒子的渲染结果。该渲染结果可以用于执行后续帧图像的复用。
以下对第N+1帧图像复用第N帧图像中的半透明粒子的渲染结果的方案进行说明。
示例性的,请参考图13。在第N+1帧图像的渲染过程中,游戏应用可以下发指令流21用于指示电子设备进行第N+1帧图像的主场景的渲染。
类似于第N帧图像中的拦截机制,拦截模块可以将指令流21直接回调给图形库。对应的,图形库可以调用与指令流21对应的API指示GPU执行渲染操作。GPU可以根据指令流21的指示,实现对第N+1帧主场景的渲染操作。在主场景不变的情况下,指令流21会指示GPU将第N+1帧图像的主场景的渲染结果(如主场景21)存储在帧缓冲11中。对应的,GPU就可以在帧缓冲11(如FB0)的贴图上执行主场景21的渲染操作。
这样,在完成如图13所示的渲染流程之后,在帧缓冲11中就可以更新为第N+1帧图像的主场景的渲染结果。比如,在FB0的贴图上可以保存有主场景21对应的数据。
在本示例中,如图13所示的第N+1帧图像的主场景渲染过程,与如图9示出的第N帧图像的主场景渲染过程类似,其具体执行过程可以互相参考,此处不再赘述。
在本示例中,对第N+1帧图像的渲染中,还可以包括对半透明粒子的渲染过程。
示例性的,请参考图14。游戏应用可以下发指令流22,用于指示电子设备进行半透明粒子的渲染。与第N帧图像的指令流12类似,该指令流22的开头指令和结尾指令可以相对固定。比如,指令流22的开头指令可以为glEnsable()指令。又如,指令流22的结尾指令可以为glDisable()指令或者glDiscardFramebufferEXT()指令。在glEnsable()指令以及glDisable()指令之间下发的指令即为第N+1帧图像中游戏应用指示电子设备执行的半透明粒子的渲染指令。
应当理解的是,在指令流22中,也可以包括用于指示进行第一半透明粒子的渲染的指令段22A,以及进行第二半透明粒子的渲染的指令段22B。
在该第N+1帧图像的渲染过程中,如图14所示,拦截模块可以拦截指令段22A,将该指令段22A返回给游戏应用,而不进行下发。此外,拦截模块可以将指令流22中的指令段22B,下发给图形库,以便执行对应的第二半透明粒子的渲染。
示例性的,结合前述说明,拦截模块可以在拦截的指令流22中,根据srcRGB为GL_ONE的glBlendFuncSeparate()指令以及srcRGB为GL_SRC_ALPHA的glBlendFuncSeparate()指令确定指令段22A。对于该指令段22A,拦截模块进行丢弃或者返回给游戏应用。类似的,拦截模块可以在拦截的指令流22中,根据srcRGB为GL_DST_COLOR的glBlendFuncSeparate()指令对应的指令段确定指令段22B。该指令段22B可以是用于指示电子设备进行第二半透明粒子的渲染的指令段。由于该部分渲染与主场景21相关,因此,在本示例中,拦截模块可以将该指令段22B下发给图形库。对应的,图形库可以调用响应的API,指示GPU进行对应的渲染过程。GPU可以根据该指令段22B进行对应的第二半透明粒子的渲染。
应当说明的是,类似于第N帧图像渲染过程中的指令段12B,电子设备并不需要替换该指令段22B所指向的帧缓冲。因此,GPU根据接收到的指令段22B,可以调用帧缓冲11中的主场景21,并根据该主场景21中的颜色等数据,进行第二半透明粒子的渲染。该渲染结果可以被存储在帧缓冲11中。由此,在完成指令段12B的渲染后,帧缓冲11中就可以存储有第二半透明粒子以及主场景21的渲染结果。
在该第N+1帧图像的渲染过程中,由于不需要进行第一半透明粒子的渲染,因此对应的帧缓冲12中的数据不会被更新。也就是说,在帧缓冲12中可以存储有第N帧图像渲染过程中,第一半透明粒子的渲染结果。
在本示例中,电子设备可以将该帧缓冲11以及帧缓冲12中的数据进行合并,由此获取第N+1帧图像中,主场景21、第一半透明粒子以及第二半透明粒子的渲染结果。
示例性的,如图15所示,合成模块可以向GPU下发指令流23,用于指示电子设备进行合成操作。结合图14,在一些示例中,拦截模块可以在下发指令段22B后,向合成模块下发合成指令触发指示,以便触发如图15所示的合成模块向GPU下发指令流23。该指令流23与第N帧图像渲染过程中的指令流13类似。在一些实施例中,该指令流23可以携带有需要合成的帧缓冲的ID,如帧缓冲11以及帧缓冲12的ID。该指令流23中还可以携带有用于存储合成结果的帧缓冲的ID,如帧缓冲13的ID。由此使得GPU可以根据该指令流23进行对应的合成操作。在本申请的另一些实施例中,GPU还可以通过其他途径获取执行合成操作对应的读取数据的帧缓冲以及存储结果的帧缓冲。本申请对此不作限制。
在本申请实施例中,前述方案中,第N+1帧图像可以对应到第一帧图像,第N帧图像可以对应到第二帧图像。对于第一帧图像(即第N+1帧图像)的渲染中,游戏应用下发的指令流可以包括第一指令流,也就是说,该第一指令流可以包括用于指示进行主场景渲染的指令流21(也可称为第一指令段)。该第一指令流还可以包括用于指示进行半透明粒子渲染的指令流22(也可称为第二指令段)。在第二指令段中,可以包括指示进行第一半透明粒子渲染的指令段22A(也可称为第三指令段)以及指示进行第二半透明粒子渲染的指令段22B(也可称为第四指令段)。
对应的,在第N帧(即第二帧图像中)的渲染中,游戏应用下发的指令流可以包括第二指令流,也就是说,该第二指令流可以包括用于指示进行主场景渲染的指令流11(也可称为第五指令段)。该第二指令流还可以包括用于指示进行半透明粒子渲染的指令流12(也可称为第六指令段)。在第六指令段中,可以包括指示进行第一半透明粒子渲染的指令段12A(也可称为第七指令段)以及指示进行第二半透明粒子渲染的指令段12B(也可称为第八指令段)。在进行指令替换后,指令段12C可以对应到第九指令段。
需要说明的是,在该第N+1帧图像的渲染过程中,指令流23的下发时机,可以是在GPU完成第二半透明粒子的渲染之后进行的。例如,GPU可以在完成第二半透明粒子的渲染之后,向合成模块发送已完成渲染指示,基于此,合成模块可以下发该指令流23。在另一些实施例中,该指令流23可以是提前下发给GPU的。在该指令流23中可以携带有执行触发机制,如在完成第二半透明粒子的渲染之后执行该指令流23。这样,GPU可以在执行完第二半透明粒子的渲染,即将第二半透明粒子以及主场景21的渲染结果存储到帧缓冲11后,执行该指令流23。
对应的,GPU可以从帧缓冲11以及帧缓冲12中读取数据执行合成操作。示例性的,GPU可以从帧缓冲11中读取主场景21以及第二半透明粒子的渲染结果。GPU可以从帧缓冲12中读取第一半透明粒子的渲染结果。GPU可以在帧缓冲13上执行获取数据的合成。例如,GPU可以根据前述示例中执行指令流13过程中的混合方程,进行合成操作。
这样,在不需要进行第一半透明粒子的渲染的情况下,就能够在帧缓冲13中获取第N+1帧图像的渲染结果。
为了能够对本申请实施例提供的方案进行更加清楚的说明,以下结合如图16所示的交互流程图,继续对第N+1帧图像的渲染过程进行说明。如图16所示,该方案可以包括:
S1601、在游戏应用下发指令流21后,拦截模块将指令流21回调给图形库。
其中,该指令流21可以用于指示电子设备执行第N+1帧图像的主场景的渲染。
S1602、图形库指示GPU执行对应的渲染操作。
S1603、GPU渲染获取主场景21。
S1604、GPU将主场景21存储在帧缓冲11中。
在本示例中,对第N+1帧图像中主场景的渲染过程与第N帧图像的渲染过程类似,在一些实施例中,该S1601-S1604的执行过程可以参考如图12所示的S1201-S1204,具体实施过程可以互相参考,此处不再赘述。通过该S1601-S1604即可在帧缓冲11中获取第N+1帧图像的主场景的渲染结果,如主场景21。
S1605、在游戏应用下发指令流22后,拦截模块拦截指令流22。
S1606、拦截模块将指令流22中的指令段22B发送给图形库。该指令段22B可以用于指示电子设备进行第二半透明粒子的渲染。
S1607、图形库指示GPU执行对应的渲染操作。
S1608、GPU从存储器获取主场景21。
S1609、GPU在主场景21基础上进行第二半透明粒子的渲染。
S1610、GPU将渲染结果存储在帧缓冲11中。
这样,就可以将第二半透明粒子渲染到主场景21上。
S1611、合成模块向GPU发送指令流23。
如图16所示,在一些实施例中,拦截模块可以向合成模块发送合成指令触发指示,以便于指示合成模块发送该指令流23。
S1612、GPU从帧缓冲11读取数据。该数据可以包括主场景21以及第二半透明粒子的渲染结果。
S1613、GPU从帧缓冲12读取数据。该数据可以包括第N帧图像渲染过程中,存储在帧缓冲12中的第一半透明粒子的渲染结果。
S1614、GPU合成主场景21以及第一半透明粒子的渲染结果。
S1615、GPU将合成结果存储在帧缓冲13中。
可以理解的是,本示例中各个步骤的操作方式,可以参考如图13-图15中各个步骤的具体说明,此处不再赘述。
应当理解的是,上述如图13-图16的说明,均是以第N+1帧图像复用第N帧图像的第一半透明粒子渲染结果为例进行说明的。其中,第N帧图像可以为游戏开始运行之后的任意一帧图像。而对于第N帧图像后的不同于第N+1帧图像,在一些实施例中也可以继续复用第N帧图像的第一半透明粒子渲染结果,在另一些实施例则可以复用其他帧图像的第一半透明粒子渲染结果,或者重新执行当前帧图像的第一半透明粒子的渲染,以便更新第一半透明粒子的渲染结果,获取更加准确的渲染结果。
从电子设备的角度,如图17所示,为本申请实施例提供的又一种渲染方法的流程示意图。
S1701、确定主场景对应的帧缓冲11。
S1702、在帧缓冲11上进行第N帧图像的主场景渲染获取主场景11,并在主场景11基础上进行第二半透明粒子的渲染。
S1703、在新创建的帧缓冲12上进行第N帧图像的第一半透明粒子的渲染结果。
S1704、根据主场景11、第二半透明粒子以及第一半透明粒子的渲染结果确定第N帧图像的渲染结果。
S1705、在帧缓冲11上进行第N+1帧图像的主场景渲染获取主场景21,并在主场景21基础上进行第二半透明粒子的渲染。
S1706、根据主场景21以及第N帧的第一半透明粒子的渲染结果确定第N+1帧图像的渲染结果。其中,主场景21上可以包括已经渲染的第二半透明粒子。
上述示例中,均以第N+1帧图像复用第N帧图像的第一半透明粒子渲染结果为例。在本申请实施例中,在电子设备中可以预设有相应的策略,用于确定需要执行第一半透明粒子渲染的帧图像,以及用于复用第一半透明粒子的帧图像。
示例性的,电子设备可以根据当前正在渲染的帧图像的特征(如当前执行渲染的帧图像是游戏开始运行后第几帧图像等),确定是否执行半透明粒子的复用。
作为一种示例,在电子设备中可以设置有计数器,每个帧图像开始渲染时,计数器执行++1。例如,游戏开始运行后,第1帧图像开始渲染时,计数器++1,结果为1,用于标识当前帧图像为第1帧图像。又如,第N帧图像开始渲染时,计数器++1,结果为N,用于标识当前帧图像为第N帧图像。这样,电子设备就可以根据计数器的值,结合预设规则,确定对当前帧图像是否执行第一半透明粒子的渲染或者复用。
需要说明的是,在游戏开始运行之后,执行第1帧图像的渲染时,由于没有进行过半透明粒子的渲染,因此不会执行第一半透明粒子渲染结果的复用。那么,在预设规则中,可以覆盖该情况,比如,在电子设备中预设规则可以为:计数器的值是否为偶数,如果是,则执行第一半透明粒子的复用,如果不是(即计数器的值为奇数),则执行第一半透明粒子的渲染。那么,在第1帧图像执行渲染时,由于计数器的值为1,即为奇数,因此可以在新创建的帧缓冲上执行第一半透明粒子的渲染。对应的,在执行第2帧图像的渲染时,计数器++1,结果为2,即偶数。因此可以执行第一半透明粒子的复用。
示例性的,请参考图18,为本申请实施例提供的又一种图像渲染的流程示意图。如图17所示,该方案可以包括:
S1801、确定主场景对应的帧缓冲11。
结合前述说明,该确定主场景的过程可以是在开始当前帧图像的渲染之前执行的。
S1802、在开始当前帧图像的渲染时,计数器加1。
在本示例中,通过计数器加1,使得计数器的值可以用于标识当前帧图像的特征。这样,不同帧图像就可以具有不同特征,对应的,通过计数器的值就能够区分不同的帧图像。
S1803、在帧缓冲11上进行当前帧图像的主场景渲染获取主场景11。
示例性,该过程可以参考前述示例中对第N帧图像或者第N+1帧图像的主场景渲染过程。
S1804、在主场景11上进行第二半透明粒子的渲染,并将渲染结果存储在帧缓冲11上。
S1805、判断计数器的值是否为偶数。本示例中,以预设规则为:计数器的值是否为偶数为例。如果计数器的值是偶数,则执行第一半透明粒子的复用,即执行S1808。反之,如果计数器的值为不是偶数,即为奇数,则执行第一半透明粒子的渲染,即执行以下S1806-S1807。
S1806、在新创建的帧缓冲12上存储当前帧图像中的第一半透明粒子的渲染结果。
S1807、根据帧缓冲11以及帧缓冲12中的数据,确定当前帧图像的渲染结果。
该过程可以参考前述示例中的第N帧图像的渲染过程。由此在实现当前帧图像的渲染结果的同时,在帧缓冲12上保存对应的第一半透明粒子的渲染结果。以便其他帧图像复用该第一半透明粒子的渲染结果。
S1808、根据帧缓冲11中的数据以及帧缓冲12中存储的之前帧图像的第一半透明粒子渲染结果,确定当前帧图像的渲染结果。
该过程可以参考前述示例中的第N+1帧图像的渲染过程。由此实现当前帧图对于半透明粒子渲染结果的复用。
可以理解的是,图18所示的流程示意作为本申请的一种可能实现,可以应用到包括第N帧以及第N+1帧图像的渲染过程中,从而支持如图9-图17中所示的方案实现。
上述示例中,在执行当前帧图像的渲染过程中,可以根据预设规则判断是否触发对已有半透明粒子的渲染结果的复用。在本申请的另一些实施例中,电子设备还可以结合其他判断条件,确定是否触发对半透明粒子的渲染结果的复用,从而使得半透明粒子的渲染结果的复用更加严格,由此获取更加准确的渲染结果。
示例性的,电子设备可以结合当前帧图像中半透明粒子与之前帧图像中半透明粒子在图像中位置的变化情况,确定两个帧图像中半透明粒子的渲染结果是否可以复用。
应当理解的是,半透明粒子属于高频信号(即对应着图像变化剧烈的细节部分)。人眼对于高频信号较为敏感,因此当游戏人物视角大幅晃动时,半透明粒子需要实时更新。
在本示例中,可以通过模型-观察-投影(Model-View-Projection,MVP)矩阵的变化情况,确定人物视角是否出现大幅晃动。
以下结合图19对MVP矩阵进行简要说明。在进行图像渲染的过程,电子设备需要确定当前帧图像中包括的一个或多个对象的顶点位置。示例性的,应用程序下发的渲染命令中,可以包括对象的顶点坐标。在一些实现中,该渲染命令中包括的顶点坐标可以是基于对象自身的局部坐标系的坐标。在本申请中,对象基于局部坐标系的分布空间可以称为局部空间(Local Space)。电子设备为了能够确定对象在显示屏上各个顶点的坐标,可以基于局部空间中对象的坐标进行矩阵变换。由此获取对象在基于显示屏的空间(如称为屏幕空间(Screen Space))坐标系下的坐标。
作为一种示例,电子设备可以通过局部空间向世界空间(World Space)向观察空间(View Space)向裁剪空间(Clip Space)向屏幕空间(Screen Space)的矩阵变换处理,将对象的各个顶点在局部空间下的局部坐标转换为屏幕空间下的坐标。
示例性的,如图19所示,示出了一种坐标由局部空间向世界空间向观察空间向裁剪空间的矩阵变换的逻辑过程示意。在本示例中,游戏应用下发的渲染命令中,可以包括对物体1的渲染。如图19所示,在局部空间中,坐标系可以是基于物体1的。比如,局部空间中的坐标系原点可以是设置在物体1的中心,或者一个顶点所在的位置等。游戏应用可以在下发对物体1的渲染命令中,携带该局部空间的坐标系下,物体1的各个顶点的坐标,即局部坐标。电子设备可以通过游戏应用下发的M矩阵,将局部空间中的坐标转换为世界空间中的坐标。其中,世界空间可以是相对于局部空间更大的区域。比如,以游戏应用下发的渲染命令用于进行游戏图像的渲染为例。局部空间可以对应能够覆盖某一个对象(如物体1)的较小区域。而世界空间可以对应游戏中,包括物体1以及其他物体(如物体2)的一张地图的区域。电子设备可以将局部空间中的局部坐标,结合M矩阵进行M矩阵变换,从而获取物体1在世界空间中的坐标。类似的,在游戏应用下发了在该帧图像中的对物体2的渲染命令的情况下,通过上述M矩阵变换,电子设备还可以获取物体2在世界空间中的坐标。
在获取当前帧图像中,各个物体的顶点在世界空间中的坐标之后,电子设备可以根据游戏应用下发的V矩阵,将世界空间中的坐标,转换为观察空间中的坐标。可以理解的是,世界空间中的坐标可以是三维空间中的坐标。而电子设备在向用户展示帧图像时,各个对象(如物体1,物体2等)则是在二维的显示屏上进行显示的。在使用不同的观察角度观察世界空间中的对象时,则会看到不同的二维画面。该观察角度可以是与在世界空间中设置的摄像机(或者观察者)的位置相关的。在本示例中,与摄像机位置对应的坐标空间可以称为观察空间。示例性的,以摄像机设置在世界空间中的y轴正方向为例。那么基于V矩阵的变换,就可以获取在该摄像机位置对应的观察空间中,物体1和物体2的各个顶点的坐标。如图1所示,由于摄像机位于y轴正方向,向下进行拍摄,因此对应在观察空间中的物体1和物体2可以呈现为俯视效果。
在电子设备获取观察空间中的各个对象的坐标后,可以将其投影到裁剪坐标。该裁剪坐标对应的坐标空间可以称为裁剪空间。可以理解的是,在进行V矩阵变换过程中,可以是对世界空间中的较大区域的变换,因此获取的图像范围可能是比较大的。而由于电子设备显示屏的尺寸有限,因此可能无法将该观察空间中的所有对象同时进行显示。在本示例中,电子设备就可以将观察空间中的各个对象的坐标,投影到裁剪空间中。在投影到裁剪空间中后,能够显示在显示屏上的对象的坐标可以在-1.0到1.0的范围内。而对于无法显示在显示屏上的部分对象的坐标,则可以在-1.0到1.0的范围之外。这样,电子设备就可以根据坐标在-1.0到1.0范围内的顶点坐标进行对应的显示。示例性的,电子设备可以根据游戏应用下发的P矩阵,对观察空间中的各个坐标进行P矩阵变换,从而获取各个坐标对应的在裁剪空间中的裁剪坐标。
因此,MVP矩阵在发生显著变化时,则标识游戏中人物的视角出现了显著的偏转。这样,之前的半透明粒子的位置在当前帧图像中显然不在适用。在本示例中,电子设备还可以根据视角变化是否在预设的视角阈值之内,确定是否执行半透明粒子的复用。在一些实施例中,为例能够确定不同帧图像中的视角变化,如图20所示,可以构建基于观察空间的参考相机。基于当前帧图像的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大于预设的角度阈值时,则表明两帧图像之间差异较大,不能复用半透明粒子的渲染结果。
基于此,请参考图21,为本申请实施例提供的又一种图像渲染方法的流程示意图。该方案在图18的基础上增加了对于视角变化的判断步骤,从而获取更加准确的渲染结果。如图21所示,本示例中的方案区别与图18的方案,在执行S1805之后,如果判断符合预设规则(如计数器为偶数),则执行S2101继续进行判断。即判断视角变化是否小于视角阈值。在该S2101的判断之前,可以执行S2102,即根据当前帧图像的MVP矩阵,以及备份MVP矩阵,确定视角变化。具体执行方式可以参考以上示例中视角变化的确定方案。在该S2101的判断中,在视角变化小于视角阈值时,则表明可以进行半透明粒子的复用,即执行S1808。对应的,在视角变化大于视角阈值时,则表明不能进行半透明粒子的复用,返回执行S1806。
这样,在执行复用之前,可以进一步根据视角变化确定是否可以进行第一半透明粒子的复用,从而提升半透明粒子的复用准确性,提升最终获取图像的质量。
上述主要从各个服务模块的角度对本申请实施例提供的方案进行了介绍。为了实现上述功能,其包含了执行各个功能相应的硬件结构和/或软件模块。本领域技术人员应该很容易意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,本申请能够以硬件或硬件和计算机软件的结合形式来实现。某个功能究竟以硬件还是计算机软件驱动硬件的方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本申请的范围。需要说明的是,本申请实施例中对模块的划分是示意性的,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式。
图22示出了的一种电子设备2200的组成示意图。如图22所示,该电子设备2200可以包括:处理器2201和存储器2202。该存储器2202用于存储计算机执行指令。示例性的,在一些实施例中,当该处理器2201执行该存储器2202存储的指令时,可以使得该电子设备2200执行上述实施例中任一种所示的图像渲染方法。
需要说明的是,上述方法实施例涉及的各步骤的所有相关内容均可以援引到对应功能模块的功能描述,在此不再赘述。
图23示出了的一种芯片系统2300的组成示意图。该芯片系统2300可以包括:处理器2301和通信接口2302,用于支持相关设备实现上述实施例中所涉及的功能。在一种可能的设计中,芯片系统还包括存储器,用于保存终端必要的程序指令和数据。该芯片系统,可以由芯片构成,也可以包含芯片和其他分立器件。需要说明的是,在本申请的一些实现方式中,该通信接口2302也可称为接口电路。
需要说明的是,上述方法实施例涉及的各步骤的所有相关内容均可以援引到对应功能模块的功能描述,在此不再赘述。
在上述实施例中的功能或动作或操作或步骤等,可以全部或部分地通过软件、硬件、固件或者其任意组合来实现。当使用软件程序实现时,可以全部或部分地以计算机程序产品的形式来实现。该计算机程序产品包括一个或多个计算机指令。在计算机上加载和执行计算机程序指令时,全部或部分地产生按照本申请实施例所述的流程或功能。所述计算机可以是通用计算机、专用计算机、计算机网络、或者其他可编程装置。所述计算机指令可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一个计算机可读存储介质传输,例如,所述计算机指令可以从一个网站站点、计算机、服务器或者数据中心通过有线(例如同轴电缆、光纤、数字用户线(digital subscriber line,DSL))或无线(例如红外、无线、微波等)方式向另一个网站站点、计算机、服务器或数据中心进行传输。所述计算机可读存储介质可以是计算机能够存取的任何可用介质或者是包括一个或多个可以用介质集成的服务器、数据中心等数据存储设备。所述可用介质可以是磁性介质(例如,软盘、硬盘、磁带),光介质(例如,DVD)、或者半导体介质(例如固态硬盘(solid state disk,SSD))等。
尽管结合具体特征及其实施例对本申请进行了描述,显而易见的,在不脱离本申请的精神和范围的情况下,可对其进行各种修改和组合。相应地,本说明书和附图仅仅是所附权利要求所界定的本申请的示例性说明,且视为已覆盖本申请范围内的任意和所有修改、变化、组合或等同物。显然,本领域的技术人员可以对本申请进行各种改动和变型而不脱离本申请的精神和范围。这样,倘若本申请的这些修改和变型属于本申请权利要求及其等同技术的范围之内,则本申请也意图包括这些改动和变型在内。

Claims (19)

1.一种图像渲染方法,其特征在于,应用于电子设备,所述电子设备中安装有应用程序,所述方法包括:
应用程序下发第一指令流,所述第一指令流用于指示所述电子设备执行第一帧图像的渲染操作,所述第一帧图像中包括第一主场景,第一半透明粒子以及第二半透明粒子,所述第一半透明粒子的渲染过程与所述第一主场景无关,所述第二半透明粒子的渲染过程与所述第一主场景相关;
所述电子设备合成第一渲染结果以及第二渲染结果以得到所述第一帧图像;所述第一渲染结果包括所述第一主场景以及所述第二半透明粒子的渲染结果,所述第二渲染结果包括所述第一半透明粒子的渲染结果;所述第二渲染结果存储在所述电子设备的第一帧缓冲中;
其中,所述第二渲染结果是所述电子设备对第二帧图像进行渲染后,存储在所述第一帧缓冲中的;所述第二帧图像的渲染早于所述第一帧图像的渲染。
2.根据权利要求1所述的方法,其特征在于,所述第一指令流中包括第一指令段和第二指令段,所述第一指令段用于指示所述电子设备对所述第一主场景进行渲染,所述第二指令段包括第三指令段和第四指令段,所述第三指令段用于指示所述电子设备对所述第一半透明粒子进行渲染;所述第四指令段用于指示所述电子设备对所述第二半透明粒子进行渲染;
在所述电子设备合成第一渲染结果以及第二渲染结果之前,所述方法还包括:
所述电子设备根据所述第一指令段进行渲染获取所述第一主场景;
所述电子设备根据所述第三指令段和所述第一主场景,渲染获取所述第一渲染结果;
所述电子设备从所述第一帧缓冲中获取所述第二渲染结果。
3.根据权利要求1所述的方法,其特征在于,在所述应用程序下发所述第一指令流之前,所述方法还包括:
所述应用程序下发第二指令流,所述第二指令流用于指示所述电子设备执行第二帧图像的渲染操作,所述第二帧图像中包括第二主场景,所述第一半透明粒子以及第二半透明粒子。
4.根据权利要求3所述的方法,其特征在于,所述第二指令流中包括第五指令段和第六指令段,所述第五指令段用于指示所述电子设备对所述第二主场景进行渲染,所述第六指令段包括第七指令段和第八指令段,所述第七指令段用于指示所述电子设备对所述第一半透明粒子进行渲染;所述第八指令段用于指示所述电子设备对所述第二半透明粒子进行渲染;所述方法还包括:
所述电子设备根据所述第五指令段进行渲染获取所述第二主场景;
所述电子设备根据所述第八指令段和所述第二主场景,渲染获取第三渲染结果;所述第三渲染结果包括所述第二主场景以及所述第二帧图像中的第二半透明粒子;
所述电子设备根据所述第七指令段,渲染获取所述第二渲染结果。
5.根据权利要求4所述的方法,其特征在于,在所述电子设备根据所述第七指令段,渲染获取所述第二渲染结果之前,所述方法还包括:
所述电子设备创建所述第一帧缓冲;
所述电子设备根据所述第七指令段,渲染获取所述第二渲染结果,包括:
所述电子设备将所述第七指令段指示的帧缓冲替换为所述第一帧缓冲,以获取第九指令段;
所述电子设备执行所述第九指令段的渲染操作,以获取所述第一半透明粒子对应的第二渲染结果,并将所述第二渲染结果存储在所述第一帧缓冲中。
6.根据权利要求2所述的方法,其特征在于,
所述电子设备根据所述第一指令流中,预设的开头指令以及结尾指令,确定所述第二指令段。
7.根据权利要求6所述的方法,其特征在于,
所述电子设备根据第一标识,识别所述第二指令段中的第三指令段;
所述电子设备根据第二标识,识别所述第二指令段中的第四指令段。
8.根据权利要求4所述的方法,其特征在于,
所述电子设备根据所述第二指令流中,预设的开头指令以及结尾指令,确定所述第六指令段。
9.根据权利要求8所述的方法,其特征在于,
所述电子设备根据第一标识,识别所述第六指令段中的第七指令段;
所述电子设备根据第二标识,识别所述第六指令段中的第八指令段。
10.根据权利要求6或8所述的方法,其特征在于,
所述预设的开头指令包括以下中的至少一项:glEnable指令,glEnablei指令;
所述预设的结尾指令包括以下中的至少一项:glDisable指令,glDisablei指令,glDiscardFramebufferEXT()指令。
11.根据权利要求7或9所述的方法,其特征在于,
所述第一标识包括在混合方程中,所述第一标识用于指示srcRGB为GL_ONE和/或srcRGB为GL_SRC_ALPHA;所述第二标识用于指示srcRGB为GL_DST_COLOR。
12.根据权利要求4所述的方法,其特征在于,所述电子设备中设置有拦截模块、创建模块以及替换模块,在所述电子设备根据第二指令流进行第二帧图像的渲染时,所述方法还包括:
所述拦截模块根据预设的开头指令以及结尾指令拦截所述第六指令段,所述第六指令段用于指示所述电子设备进行半透明粒子的渲染;
所述拦截模块根据第一标识,将所述第六指令段中的第七指令段传输给创建模块,所述第七指令段用于指示进行所述第一半透明粒子的渲染,
所述创建模块创建第一帧缓冲,所述第一帧缓冲用于存储所述第一半透明粒子的渲染结果,所述创建模块将所述第一帧缓冲的标识发送给所述替换模块,
所述替换模块从所述拦截模块或所述创建模块获取所述第七指令段,所述替换模块将所述第七指令段指向的帧缓冲替换为所述第一帧缓冲,以获取第九指令段,
所述替换模块将所述第九指令段通过图形库传输给所述电子设备的图形处理器GPU,以便所述GPU根据所述第九指令段执行所述第一半透明粒子的渲染,所述第一半透明粒子的渲染结果存储在所述第一帧缓冲中;
所述拦截模块将所述第二指令流中的不同于所述第六指令段的指令通过图形库传输给所述GPU,以便所述GPU执行所述第二帧图像中的第二主场景以及第二半透明粒子的渲染;
所述创建模块创建第二帧缓冲,所述第二帧缓冲用于存储所述第二帧图像的渲染结果;
所述电子设备还包括合成模块,所述合成模块向所述GPU发送合成指令,所述合成指令用于指示所述GPU在所述第二帧缓冲上合成所述第一帧缓冲中的第二渲染结果以及所述第二主场景以及第二半透明粒子的渲染结果;
所述GPU根据所述合成指令执行合成操作,以便在所述第二帧缓冲上获取所述第二帧图像的渲染结果;
在所述电子设备根据第一指令流进行第一帧图像的渲染时,所述拦截模块根据预设的开头指令以及结尾指令拦截所述第一指令流中的第二指令段,所述第二指令段用于指示所述电子设备进行半透明粒子的渲染;
所述拦截模块根据第一标识,拦截所述第二指令段中的第三指令段;所述第三指令段用于指示所述电子设备进行第一半透明粒子的渲染;
所述拦截模块将所述第二指令流中不同于所述第三指令段的指令通过图形库传输给所述电子设备的GPU,以便所述GPU执行所述第一帧图像中第一主场景以及第二半透明粒子的渲染;
所述合成模块向所述GPU发送合成指令,所述合成指令用于指示所述GPU在所述第二帧缓冲上合成所述第一帧缓冲中的第二渲染结果以及所述第一主场景以及第二半透明粒子的渲染结果;
所述GPU根据所述合成指令执行合成操作,以便在所述第二帧缓冲上获取所述第一帧图像的渲染结果。
13.根据权利要求1或2或3-9中任一项所述的方法,其特征在于,在所述电子设备中设置有计数器,所述电子设备每执行一次帧图像的渲染,所述计数器加1;
在所述电子设备开始所述第一帧图像的渲染,合成第一渲染结果以及第二渲染结果之前,所述方法还包括:
所述电子设备确定所述计数器的值符合预设规则;
在所述计数器的值不符合预设规则的情况下,所述方法还包括:
所述电子设备创建所述第一帧缓冲,将所述第一指令流中用于指示进行第一半透明粒子渲染的指令段指向的帧缓冲替换为所述第一帧缓冲,
所述电子设备执行所述第一半透明粒子的渲染,并将渲染结果存储在所述第一帧缓冲中。
14.根据权利要求13所述的方法,其特征在于,所述预设规则为:所述计数器的值为偶数。
15.根据权利要求1或14所述的方法,其特征在于,
在所述电子设备合成第一渲染结果以及第二渲染结果之前,所述方法还包括:
所述电子设备确定所述第一帧图像渲染时的视角变化小于预设的视角阈值。
16.根据权利要求15所述的方法,其特征在于,所述电子设备根据所述第一帧图像的模型-观察-投影MVP矩阵以及第二帧图像的MVP矩阵,确定所述视角变化,所述第二帧图像的渲染早于所述第一帧图像的渲染。
17.根据权利要求16所述的方法,其特征在于,在所述第一帧图像渲染时的视角变化大于预设的视角阈值的情况下,所述方法还包括:
所述电子设备创建所述第一帧缓冲,将所述第一指令流中用于指示进行第一半透明粒子渲染的指令段指向的帧缓冲替换为所述第一帧缓冲,
所述电子设备执行所述第一半透明粒子的渲染,并将渲染结果存储在所述第一帧缓冲中。
18.一种电子设备,其特征在于,所述电子设备包括一个或多个处理器和一个或多个存储器;所述一个或多个存储器与所述一个或多个处理器耦合,所述一个或多个存储器存储有计算机指令;
当所述一个或多个处理器执行所述计算机指令时,使得所述电子设备执行如权利要求1-17中任一项所述的图像渲染方法。
19.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质包括计算机指令,当所述计算机指令运行时,执行如权利要求1-17中任一项所述的图像渲染方法。
CN202210255562.5A 2022-03-15 2022-03-15 一种图像渲染方法和电子设备 Active CN114708369B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202210255562.5A CN114708369B (zh) 2022-03-15 2022-03-15 一种图像渲染方法和电子设备

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202210255562.5A CN114708369B (zh) 2022-03-15 2022-03-15 一种图像渲染方法和电子设备

Publications (2)

Publication Number Publication Date
CN114708369A CN114708369A (zh) 2022-07-05
CN114708369B true CN114708369B (zh) 2023-06-13

Family

ID=82169323

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202210255562.5A Active CN114708369B (zh) 2022-03-15 2022-03-15 一种图像渲染方法和电子设备

Country Status (1)

Country Link
CN (1) CN114708369B (zh)

Families Citing this family (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN116051351B (zh) * 2022-08-22 2023-10-13 荣耀终端有限公司 一种特效处理方法和电子设备
CN116681811B (zh) * 2022-09-19 2024-04-19 荣耀终端有限公司 图像渲染方法、电子设备及可读介质
CN117745604A (zh) * 2023-05-26 2024-03-22 荣耀终端有限公司 一种图像处理方法和电子设备
CN117883789B (zh) * 2024-03-15 2024-05-28 腾讯科技(深圳)有限公司 数据获取方法、装置、设备、可读存储介质及程序产品

Family Cites Families (12)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7450129B2 (en) * 2005-04-29 2008-11-11 Nvidia Corporation Compression of streams of rendering commands
US7692647B2 (en) * 2006-09-14 2010-04-06 Microsoft Corporation Real-time rendering of realistic rain
US9665968B2 (en) * 2008-08-22 2017-05-30 Autodesk, Inc. Computerized image rendering with per-frame buffer scene segmentation
US9679346B2 (en) * 2015-06-07 2017-06-13 Apple Inc. Graphics engine and environment for efficient real time rendering of graphics that are not pre-known
CN106570926B (zh) * 2016-11-04 2019-09-10 北京大学(天津滨海)新一代信息技术研究院 一种飞行视景仿真中高效的粒子云层绘制方法
US10445926B2 (en) * 2017-01-11 2019-10-15 Adobe Inc. Light path correlation in digital image rendering of a digital scene
US10580106B2 (en) * 2018-02-28 2020-03-03 Basemark Oy Graphics processing method utilizing predefined render chunks
US11270496B2 (en) * 2019-05-24 2022-03-08 Nvidia Corporation Fine grained interleaved rendering applications in path tracing
CN111179394A (zh) * 2019-11-25 2020-05-19 苏州智加科技有限公司 点云场景渲染方法、装置和设备
CN113368492B (zh) * 2020-02-25 2023-06-27 华为技术有限公司 渲染的方法、装置
CN112837402A (zh) * 2021-03-01 2021-05-25 腾讯科技(深圳)有限公司 场景渲染方法、装置、计算机设备和存储介质
CN115473957B (zh) * 2021-06-10 2023-11-14 荣耀终端有限公司 一种图像处理方法和电子设备

Also Published As

Publication number Publication date
CN114708369A (zh) 2022-07-05

Similar Documents

Publication Publication Date Title
CN114708369B (zh) 一种图像渲染方法和电子设备
CN114210055B (zh) 一种图像渲染方法和电子设备
US20230360337A1 (en) Virtual image displaying method and apparatus, electronic device and storage medium
JP3177221B2 (ja) 興味深いシーンのイメージを表示するための方法及び装置
CN112933599B (zh) 三维模型渲染方法、装置、设备及存储介质
US8624892B2 (en) Integration of graphical application content into the graphical scene of another application
US20140152869A1 (en) Methods and Systems for Social Overlay Visualization
CN111491174A (zh) 虚拟礼物获取及展示方法、装置、设备及存储介质
KR20160108158A (ko) 3차원 배경 콘텐트를 합성하는 방법 및 디바이스
JP2012128779A (ja) 仮想物体表示装置
EP4412227A1 (en) Immersive-media data processing method, apparatus, device, storage medium and program product
WO2023138548A1 (zh) 图像处理方法、装置、设备和存储介质
CN114615513A (zh) 视频数据生成方法、装置、电子设备及存储介质
CN114669047A (zh) 一种图像处理方法、电子设备及存储介质
CN115018692B (zh) 一种图像渲染方法及电子设备
WO2019118028A1 (en) Methods, systems, and media for generating and rendering immersive video content
US20190114823A1 (en) Image generating apparatus, image generating method, and program
CN117557701B (zh) 一种图像渲染方法和电子设备
US20220165032A1 (en) Content distribution system, content distribution method, and content distribution program
CN115734001A (zh) 特效显示方法、装置、电子设备及存储介质
CN115311397A (zh) 用于图像渲染的方法、装置、设备和存储介质
US10542309B2 (en) Electronic device and operation method thereof
CN114004953A (zh) 现实增强画面的实现方法、系统及云端服务器
WO2024051471A1 (zh) 一种图像处理方法和电子设备
US20230252733A1 (en) Displaying blockchain data associated with a three-dimensional digital object

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