重投影帧的运动平滑的制作方法

文档序号:26013133发布日期:2021-07-23 21:34阅读:89来源:国知局
重投影帧的运动平滑的制作方法

相关申请的交叉引用

这是一项pct申请,要求2018年10月9日提交的题为“重投影帧的运动平滑(motionsmoothingforre-projectedframes)”的美国专利申请序列号16/155,686的优先权,其全部内容通过引用的方式并入本文中。



背景技术:

在视频游戏行业内外都在使用虚拟现实(vr)系统。用于vr系统的显示器(诸如嵌入在vr耳机中的显示器)通常以适合vr应用程序的最低刷新率操作。例如,90赫兹(hz)是vr显示器的常用刷新率。在“实时渲染”情形中,基于图形的应用程序(诸如视频游戏)以匹配显示器刷新率的帧速率输出用于渲染的帧,这意味着在每次屏幕刷新时都显示从应用程序接收的新帧(本文称作“实际帧”)。此类实时渲染情形通常称作应用程序“达到帧速率”。

实际上,由于各种原因,应用程序并不总是能达到帧速率。例如,应用程序可能间歇地丢弃帧,和/或应用程序可能会暂时以较慢的速率输出帧(例如,当理想的帧速率是每秒90帧时,每秒45帧)。在应用程序没有达到帧速率的情况下,可以使用一种称为“仅旋转重投影”的技术,以考虑用户头部旋转的方式,用重投影帧来替换丢失的帧,从而让用户觉得应用程序达到了帧速率。例如,如果没有重投影,应用程序的帧速率不足可能会导致游戏中的卡顿或停滞。在vr应用程序中,当用户完全沉浸在虚拟环境中,如果应用程序无法达到帧速率并且没有重投影来补偿丢失的帧,用户可能会感到恶心。因此,当应用程序没有达到帧速率时,重投影是一种允许更好的用户体验的技术。考虑一个示例,其中应用程序以理想帧速率的一半输出帧(例如,每秒45帧,其中每秒90帧是理想帧速率)。在此示例中,可以使用来自最近渲染的实际帧的像素数据来重投影每隔一帧,以创建对场景进行变换(例如,通过旋转和重投影计算)的重投影帧,从而将重投影的场景与用户的当前头部定向相匹配。这使得在给定用户头部旋转的情况下,即使当重投影帧被用于补偿应用程序未能达到帧速率时,在用户看来,场景也好像以预期的方式移动。

尽管仅旋转重投影防止了游戏中的卡顿或停滞,但它在头部旋转期间会产生自己不想要的视觉假影,至少在使用低持久性显示器的vr系统中是这样(例如,显示器在一小部分帧时间内被照亮)。例如,虽然仅旋转重投影技术考虑了头部旋转,但它不考虑在帧之间的场景中移动或动画的虚拟对象。这可能导致在移动或动画对象时出现不需要的视觉假影,称为“抖动”。抖动使用户感觉到“双重重影效应”,其中移动的对象(例如,在屏幕上移动的弹丸或球)似乎在两个位置之间(或与自身分离)逐帧弹跳。因此,当用户在使用重投影时旋转他/她的头部时,场景中的任何移动或动画的对象都将抖动。

本文提供了改进和增强这些和其他系统的技术解决方案。

附图说明

参考附图描述具体实施方式。在图中,附图标记的最左边的数字表示附图标记第一次出现的图。不同的图中使用相同的附图标记指示类似或相同的组件或特征。

图1是示出了示例性运动平滑技术的图,该技术用于在重投影被用于在诸如头戴式显示器(hmd)的显示器上渲染帧时考虑场景中的移动或动画对象。

图2是示出示例性渲染网格以及该渲染网格可如何用于对重投影帧进行运动平滑的图。

图3是根据本文公开的实施方案的使用图形处理单元(gpu)所产生的运动向量来产生重投影帧作为运动平滑技术的一部分的示例性过程的流程图。

图4是根据本文公开的实施方案的用于在像素数据被输入到gpu用于运动向量估计之前对齐先前渲染的帧的像素数据的示例性过程的流程图。

图5是根据本文公开的实施方案的示例性过程的流程图,该示例性过程用于排除先前渲染的帧的一些像素数据,并将像素数据的剩余部分作为输入提供给gpu用于运动向量估计。

图6是根据本文公开的实施方案的示例性过程的流程图,该示例性过程用于对齐先前渲染的帧的像素数据,排除先前渲染的帧的像素数据的面板掩模部分并且将像素数据的剩余部分作为输入提供给gpu用于运动向量估计。

图7是根据本文公开的实施方案,在从gpu输出的运动向量被用于产生重投影帧作为运动平滑技术的一部分之前,对该等运动向量进行阈值处理的示例性过程的流程图。

图8是根据本文公开的实施方案,在从gpu输出的运动向量被用于产生重投影帧作为运动平滑技术的一部分之前,对该等运动向量进行衰减的示例性过程的流程图。

图9是根据本文公开的实施方案的用于产生衰减纹理的示例性过程的流程图,该衰减纹理可以用于在从gpu输出的运动向量被用于产生重投影帧作为运动平滑技术的一部分之前对该等运动向量进行衰减。

图10是根据本文公开的实施方案的示例性过程的流程图,该过程用于在对应于几乎没有颜色变化的区域的运动向量被用于产生重投影帧作为运动平滑技术的一部分之前,将所得运动向量集清零。

图11是根据本文公开的实施方案的示例性过程1100的流程图,该示例性过程用于在所得运动向量集被用于产生重投影帧作为运动平滑技术的一部分之前,使用一个或多个滤波器来“清理”运动向量场。

图12是根据本文公开的实施方案的用于在像素数据被输入到gpu用于运动向量估计之前旋转先前渲染的帧的示例性过程的流程图。

图13是根据本文公开的实施方案的用于在基于先前渲染的帧的亮度数据和色度数据产生的运动向量阵列之间进行选择的示例性过程的流程图。

图14是根据本文公开的实施方案的用于获得多个运动向量阵列、确定阵列之间的差异并且基于所确定的差异产生运动向量的最终阵列以进行运动平滑的示例性过程的流程图。

图15是根据本文公开的实施方案的用于获得图像区域的不同部分的不同分辨率的多个运动向量阵列的示例性过程的流程图。

图16示出其中可以实现本文公开的技术的可穿戴装置的示例性组件,诸如vr耳机。

具体实施方式

本文尤其描述了运动平滑技术,这些技术用于在重投影被用于在诸如头戴式显示器(hmd)的显示器上渲染帧时考虑场景中的移动或动画对象。本文所述的运动平滑技术减轻了关于移动或动画对象的不想要的视觉假影,诸如移动或动画对象的前述抖动假影。hmd是示例性类型的显示器,当在显示器上渲染图像时可以实现所公开的运动平滑技术。为了使用户沉浸在虚拟现实(vr)环境或增强现实(ar)环境中,用户可以穿戴hmd。hmd的一个或多个显示面板基于由应用程序(例如,视频游戏)输出的帧来渲染图像,并且用户通过包括在hmd中的光学器件来查看这些图像,使得用户感觉到图像就像用户沉浸在vr或ar环境中一样。

如所提及,hmd可以利用一种称为“重投影”的技术来补偿未能达到帧速率的应用程序。例如,可以在实际帧之间渲染重投影帧以实现理想的帧速率,并且可以使用来自从应用程序接收的最近渲染的实际帧(例如,最近渲染的实际帧)的像素数据来产生每一重投影帧。在重投影帧中,在前一个实际帧中渲染的场景以考虑用户头部旋转的方式被变换(例如,通过旋转和重投影计算)。

本文描述的是用于产生重投影帧的运动平滑技术,该重投影帧进一步考虑了逐帧移动或动画的对象的运动。本文描述的运动平滑技术使用计算机视觉算法来以运动向量的形式估计多个帧上的对象的运动(例如,方向和幅度)。可以使用图形处理单元(gpu)的视频编码器(例如,视频编码芯片)来获得运动向量。例如,gpu的视频编码器可以分析多个先前渲染的帧的像素数据以产生运动向量阵列,并且这些运动向量可以用于以考虑移动或动画对象的方式修改重投影帧的像素数据。换句话说,从gpu接收的运动向量可以用于外推(从先前渲染的帧中的对象运动)对象应位于要渲染的重投影帧中的何处,从而减轻移动对象的抖动。

在示例性运动平滑过程中,可以将分别与第一帧和第二帧相关联的第一像素数据和第二像素数据作为输入提供给图形处理单元(gpu)。第一帧和第二帧可能已从应用程序接收,并且先前被渲染过(例如,来自应用程序的两个最近渲染的实际帧)。gpu的视频编码器可以处理输入像素数据以产生运动向量阵列。可以至少部分基于与第二帧相关联的第二像素数据来产生用于重投影帧(是未来要渲染的帧)的第三像素数据,并且可以至少部分基于从gpu接收的运动向量阵列来进一步修改该第三像素数据。重投影帧的这种修改的第三像素数据是“运动平滑的”,以便减轻(如果未消除)关于场景中的移动或动画对象的任何抖动。运动平滑的重投影帧然后可以至少部分基于修改的第三像素数据在显示器上渲染,以提供更逼真的观看体验,其中即使应用程序没有达到帧速率,对象仍以期望的方式在场景内移动或动画。因此,从gpu接收的运动向量阵列被用于外推到未来帧(重投影帧),因为在将第一像素数据和第二像素数据输出到帧缓冲器之后,修改的第三像素数据被输出到帧缓冲器。以此方式,在第二帧之前渲染第一帧,并且在重投影帧之前渲染第二帧。这种外推技术可以与帧之间的内插形成对比,并且应了解,本文描述的技术和系统涉及使用从gpu接收的运动向量来外推到未来帧,而不是使用运动向量来在帧之间进行内插。

本文还公开了系统,例如,包括被配置成实现本文公开的技术和过程的显示系统(例如,hmd)以及存储计算机可执行指令以实现本文公开的技术和过程的非暂时性计算机可读介质的系统。尽管本文公开的技术和系统是在视频游戏应用程序、并且特别是vr游戏应用程序的上下文中通过示例来讨论的,但应了解,本文描述的技术和系统可以为其他应用程序提供益处,包括但不限于非vr应用程序(例如,ar应用程序)和/或非游戏应用程序,诸如工业机器应用程序、国防应用程序、机器人应用程序等。

图1是示出了示例性运动平滑技术的图,该技术用于在重投影被用于在诸如头戴式显示器(hmd)100的显示器上渲染帧时考虑场景中的移动或动画对象。尽管hmd100在本文被呈现为可以实现所公开的运动平滑技术的示例性“显示系统”,但应了解,“显示系统”的其他类型和/或实现方式可以实现本文描述的运动平滑技术。因此,应理解,本文对“hmd”的任何引用可以用术语“显示器”或“显示系统”来代替,尽管应了解,hmd仅仅是用于实现本文所述的技术的示例性类型的显示器。

图1示例中的hmd100可以包括多个显示面板,诸如一对立体显示面板的左显示面板和右显示面板。这些显示面板可以用于呈现一系列图像帧(本文称作“帧”),这些图像帧可由穿戴hmd100的用户102查看。尽管用双面板hmd100描述了示例,但应了解,hmd100可以包括单个显示面板,或者两个以上的显示面板。因此,本文所用的术语“显示面板”可以指双面板hmd100的一对显示面板中的任一显示面板,或者可以指具有任意数量显示面板的hmd100的单个显示面板(例如,单面板hmd100或多面板hmd100)。在双面板hmd100中,立体帧缓冲器可以在hmd100的两个显示面板上渲染例如2160×1200个像素(例如,每个显示面板1080×1200个像素)。

hmd100可以包括利用任何合适类型的显示技术的显示面板,诸如利用发光元件在hmd100的显示面板上呈现帧期间发光的发射型显示器。作为示例,hmd100的显示面板可以包含液晶显示器(lcd)、有机发光二极管(oled)显示器、无机发光二极管(iled)显示器、或者利用适合hmd应用程序的显示技术的任何其他适合类型的显示器。

hmd100可以表示用于vr系统的vr耳机,诸如用于vr游戏系统。然而,hmd100可以另外地或可替代地被实现为用于ar应用程序的ar耳机。在ar中,用户102看到叠加在真实世界环境上的虚拟对象,而在vr中,用户102没有看到真实世界环境,而是完全沉浸在虚拟环境中,如通过hmd100的显示面板和光学器件(例如,透镜)所感知。本文描述的示例主要涉及基于vr的hmd100,但应了解,hmd100不限于vr应用程序中的实现方式。

通常,在计算装置(诸如hmd100本身)或与hmd100相关联并耦合到hmd100的计算装置(例如,个人计算机(pc)、游戏控制台等)上执行的应用程序可以被配置成输出一系列帧104,这些帧最终被渲染在hmd100的显示面板上。在一些实施方案中,利用屏外渲染,使得帧104可以在hmd100的显示面板上被渲染之前被渲染到目标。因此,如本文所使用“渲染”可以包括渲染到除显示器之外的目标,并且在显示器本身上渲染之前和/或在显示器上渲染之前(例如,没有屏外渲染到不同的目标或在屏外渲染到不同的目标之后)。

图1的示例描绘了三个示例性帧104(1)、104(2)和104(3),它们将被依序渲染为一系列帧104。在图1的示例中,对象106被示为在帧104(1)-104(3)的路线上向左(即,从右向左)移动穿过场景。帧104(2)和帧104(3)中对象106的虚线轮廓表示对象106在先前渲染的帧104中所处的位置。这里,第一渲染帧104(1),然后第二渲染帧104(2),并且然后第三渲染帧104(3)。

一系列帧104中的至少一些帧104可以是“实际”帧,即它们是从诸如视频游戏应用程序或任何其他类型的基于图形的应用程序的应用程序输出的。应用程序可以在图形流水线中执行,该图形流水线向帧缓冲器输出像素数据108用于渲染个别的帧104。在一些实施方案中,像素数据108可以包括每像素值(例如,颜色值)的二维阵列。在一些实施方案中,像素数据108还包括附加数据或元数据,诸如深度值、亮度值等。在一些实施方案中,像素数据108可以包括由单组颜色和阿尔法(alpha)值表示的每一像素的数据(例如,一个颜色值用于红色通道,一个颜色值用于绿色通道,一个颜色值用于蓝色通道,以及一个或多个值用于一个或多个阿尔法通道)。此像素数据108可以被输出到帧缓冲器,以在hmd100的显示面板上以期望的视觉效应呈现图像。

在运行期间,hmd100的头部跟踪模块可以产生关于hmd100的位置和姿势的数据,该数据被提供给应用程序,以便通知应用程序如何根据用户102的头部位置/姿势来渲染一系列帧104中的下一帧104。这允许应用程序输出像素数据108用于在hmd100上渲染图像,以使用户104相信他/她正在查看包括对象(静态和移动对象,诸如移动对象106)的虚拟环境。如果应用程序达到帧速率,则静态和移动对象都被感知为以预期的方式随着用户102的头部移动在场景内移动。本文描述的运动平滑技术是一种补偿未能达到帧速率的应用程序的方式,从而关于移动对象实现类似的视觉感知。

在图1的示例中,第一帧104(1)可以表示从应用程序接收的第一“实际”帧,第二帧104(2)可以表示从应用程序接收并在第一帧104(1)之后渲染的第二“实际”帧,并且第三帧104(3)可以表示从与第二帧104(2)相关联的像素数据108(2)产生的重投影帧。因此,图1中的“第三帧104(3)”在本文有时被称作“重投影帧104(3)”。hmd100可以处理一系列帧104,并且在渲染第一帧104(1)和第二帧104(2)之后的时间,hmd100的逻辑可以被配置成向图形处理单元(gpu)110(例如,hmd100的gpu110)提供与第一帧104(1)相关联的第一像素数据108(1)和与第二帧104(2)相关联的第二像素数据108(2)作为输入。

gpu110的视频编码器(例如,视频编码芯片)可以基于输入到gpu110的第一像素数据108(1)和第二像素数据108(2)来产生运动向量112的阵列。为了产生运动向量112的阵列,gpu110的视频编码器可以比较作为输入提供的每一帧104的像素数据108之间的每像素值(例如,亮度值)。另外或替代地,gpu110的视频编码器可以比较作为输入提供的每一帧104的像素数据108之间的宏块(例如,16个像素的块(即,4×4像素的宏块),64个像素的块(即,8×8像素的宏块))。以此方式,gpu110可以以任何合适的分辨率比较一对帧104之间的部分像素数据108。在一些实施方案中,输入像素数据108(1)和108(2)被下采样到较低的分辨率,以便将下采样的帧输入到gpu110。

从gpu110输出的运动向量112的阵列在本文有时称作“运动向量场112”。该运动向量场112也可以以任何合适的分辨率输出和/或被下采样/上采样到任何合适的分辨率。例如,运动向量112的阵列可以包括每像素的单个运动向量112、每像素组的单个运动向量112(例如,用于4×4宏块、8×8宏块、任意形状的像素补丁等的一个运动向量112),或者甚至是给定帧104的所有像素的单个运动向量112。通常,运动向量112是二维(2d)箭头,其具有方向的x和y分量以及幅度(通常由2d箭头的长度表示)。运动向量112的幅度可以用任何合适的测量单位来指定,诸如在x和y分量方向上的像素数量。

基于gpu110的视频编码器对输入像素数据108的比较,如果第二帧104(2)的一部分类似于第一帧104(1)的一部分(例如,在阈值亮度值内),并且如果每一帧104中的类似部分偏移一个距离(例如,在x和y分量方向上的像素数量),这可以由被包括在运动向量112的阵列中的运动向量112来表示。考虑一个示例,其中由gpu110的视频编码器确定帧104(1)和104(2)中对应于对象106的像素值是相似的(例如,基于像素数据108中的像素值匹配满足某个相似性度量的部分)。该对象106的运动向量112可以具有指向与对象106的移动相同方向的方向,或者运动向量112可以指向与对象106的移动方向相反的方向。换句话说,运动向量112可以指向一个方向,该方向指回到对象106在前一个帧104(1)中的位置,该位置与对象106在后续帧104(2)中的位置偏移。因此,运动向量112提供了从第二帧104(2)中的坐标到第一帧104(1)中的坐标的偏移。该偏移描述了相对于移动或动画对象(诸如对象106),从第一帧104(1)中的图像到第二帧104(2)中的图像的变换。

如所提及,图1中的第三帧104(3)可以表示重投影帧,这意味着第三帧104(3)的像素数据108(3)可以从与先前渲染的实际帧(在此情况下,第二帧104(2))相关联的像素数据108(2)导出。换句话说,重投影帧104(3)的像素数据108(3)不是从应用程序(例如,视频游戏应用程序)接收的,而是由应用程序所产生的帧的像素数据108产生的,并且用于在应用程序未达到帧速率时“填充”丢失帧的间隙。在此情况下,重投影帧104(3)的像素数据108(3)是由与第二帧104(2)相关联的像素数据108(2)产生的,因为在图1的示例中,第二帧104(2)是重投影帧104(3)之前最近渲染的帧104。在一些实施方案中,旋转和重投影变换可以被计算并用于修改与第二帧104(2)相关联的第二像素数据108(2),以便产生用于重投影帧的第三像素数据108(3),这有效地旋转、平移和/或以其他方式移动在第二帧104(2)中渲染的场景,以此方式考虑了自渲染第二帧104(2)以来hmd100的旋转。例如,自渲染第二帧104(2)时起,用户102可以旋转他/她的头部,这在产生用于重投影帧104(3)的第三像素数据108(3)时被考虑,使得根据该头部移动来呈现场景。

图1的运动平滑技术然后至少部分基于运动向量112的阵列来修改第三像素数据108(3),以获得重投影帧104(3)的修改的第三像素数据108(3)'。在一些实施方案中,第三像素数据108(3)到修改的第三像素数据108(3)'的该修改包括基于对应于特定像素或像素组的非零运动向量112将第三像素数据108(3)的像素值移动到不同位置。该移动可以在一个方向上并且移动一定的量(例如,在水平(+/-)和垂直(+/-)方向上移动多个像素)。然后,至少部分基于修改的第三像素数据108(3)',在显示器(例如,在hmd100的显示面板上)上渲染重投影帧104(3)。因此,已基于运动向量112(运动向量112已由先前渲染的实际帧104(1)和104(2)的像素数据108产生)被修改的重投影帧104(3)被“运动平滑”以在预期位置渲染对象106。

图2是示出示例性渲染网格200以及该渲染网格200如何可用于对重投影帧进行运动平滑的图。例如,渲染网格200可以用以基于由gpu110输出的运动向量112的阵列来修改图1的重投影帧104(3)的第三像素数据108(3)。在此示例中,hmd100的逻辑可以产生渲染网格200,并且渲染网格200的顶点202可以根据运动向量112的阵列移动。例如,顶点202可以在非零运动向量112的方向上移动,并且移动量对应于非零运动向量112的幅度。例如,以图1中示出的向左移动的对象106为例,可以在渲染网格200的上下文中应用运动向量112,以在向左(或负x)方向上将顶点202移动特定数量的像素(对应于运动向量112的幅度)。

渲染网格200被示为具有多个顶点202(1)、202(2)、…、202(n)(统称为202)的细分网格。渲染网格200的细分可以是任何合适的几何图案。图2的示例性渲染网格200被示为三角形204的重复图案,尽管任何合适的几何形状都可以用于渲染网格200,包括但不限于正方形(有时称作“四边形”)、六边形(例如,对于蜂窝图案)等。在此示例中,从正方形(或四边形)的左下角到正方形(或四边形)的右上角的对角线用于创建具有特定定向的重复三角形204的渲染网格200。可以通过使用从正方形(或四边形)的左上角到正方形(或四边形)的右下角的对角线将正方形(或四边形)划分成三角形204来创建渲染网格200的不同定向,而不是图2所示的定向。在一些实施方案中,这些不同定向的混合也可以用于单个渲染网格200,诸如通过使用从正方形(或四边形)的左下角到正方形(或四边形)的右上角的对角线来划分每隔一个正方形,并且使用从正方形(或四边形)的左上角到正方形(或四边形)的右下角的对角线来划分两者之间的正方形。在一些实施方案中,hmd100的逻辑可以被配置成基于从gpu110接收的运动向量场112,动态地确定在产生渲染网格200时使用这些多个定向中的哪个定向。这可以被完成来选择用于渲染网格200中的几何形状(例如,三角形204)的最佳定向,从而产生看起来最平滑、运动平滑的图像。

渲染网格200也可以以任何合适的分辨率产生。例如,最高分辨率的渲染网格200可以是每像素两个邻接的三角形204,其中每一正方形(或四边形)被映射到单个像素。较低分辨率可以是每组像素(诸如一组16个像素)两个邻接的三角形204。可替代地,像素可以以任何合适的分辨率映射到渲染网格200的顶点202。例如,每一顶点202可以与最高分辨率的单个像素相关联,或者每一顶点202可以与较低分辨率的一组像素(诸如一组16个像素)相关联。在一些实施方案中,渲染网格200的分辨率与运动向量112的阵列的分辨率相同,使得运动向量112的阵列中的单个运动向量112映射到顶点202或正方形(或四边形)(例如,两个邻接的三角形204)。实现渲染网格200和运动向量112的阵列之间的匹配分辨率可以以各种方式实现,诸如通过向gpu110请求与渲染网格200的分辨率匹配的特定分辨率的运动向量112的阵列,通过对运动向量112的阵列进行下采样或上采样以匹配渲染网格200的分辨率,或者通过以与由gpu110输出的运动向量112的阵列的分辨率匹配的分辨率产生渲染网格200。

图2展示四个非零运动向量112(1)、112(2)、112(3)和112(4)对应于渲染网格200的四个顶点202的示例。这四个运动向量112(1)-(4)可以对应于gpu110基于图1中描绘的移动对象106检测到的运动向量112。因此,示例性运动向量112(1)-(4)可以指向对应于对象106的定向运动的向左方向,尽管如上所述,该方向性可以与对象106的定向运动的方向性相反(例如,向右方向)。在运动平滑算法中可以考虑运动向量112的方向性,以在期望的方向上修改像素数据108。考虑一个基本示例,其中运动向量112的场包括四个示例性运动向量112(1)-(4),并且运动向量112的阵列中的所有剩余运动向量112都是零向量。在此示例中,通过将对应于非零运动向量112(1)-(4)的顶点202移动到渲染网格200内的不同位置作为移动的顶点206(1)、206(2)、206(3)和206(4)(在图2的底部示出),可以基于非零运动向量112(1)-(4)来修改重投影帧104(3)的像素数据108(3)。图2的底部示出了应用运动平滑之后的渲染网格200,其中与运动平滑之前的顶点202的位置相比,移动的顶点206(1)-(4)在渲染网格200内处于不同的位置。当以此方式应用运动向量112时,移动的顶点206(1)-(4)导致渲染网格200的一个或多个部分扭曲,诸如通过拉伸或扭曲渲染网格200中的特定几何形状(例如,三角形204)。在图2的示例中,作为运动平滑的结果,一些三角形204被拉伸以创建拉伸的三角形208,如图2的底部所示。对应于移动顶点206(1)-(4)的像素值(用于重投影帧104(3)的像素数据108(3))被渲染在渲染网格200内对应于移动顶点206(1)-(4)的位置的不同像素位置。可以混合移动顶点206(1)-(4)和未移动顶点202之间的像素位置(例如,通过应用梯度,诸如通过在移动顶点206(1)-(4)和未移动顶点202之间内插像素值)。在一些实施方案中,深度缓冲器可以用于确定输出到重投影帧104(3)的修改的像素数据108(3)'的帧缓冲器的最终像素值集合。也就是说,作为将运动向量112应用于渲染网格200的结果,在图像中对应于移动顶点206(1)-(4)的位置处可能存在多个像素值。在此情况下,可以渲染与“较近”(较小)深度值相关联的任何像素值,而不是在与“较远”(较大)深度值相关联的那个位置渲染另一像素值。

本文描述的过程被示为逻辑流程图中的块的集合,表示可以在硬件、软件、固件或其组合(即,逻辑)中实现的操作序列。在软件的上下文中,块表示在由一个或多个处理器执行时执行所述操作的计算机可执行指令。通常,计算机可执行指令包括执行特定功能或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等。描述操作的顺序并不旨在被理解为限制,并且任何数量的所描述块可以以任何顺序和/或并行地组合来实现该过程。

图3是根据本文公开的实施方案的使用gpu所产生的运动向量来产生重投影帧作为运动平滑技术的一部分的示例性过程300的流程图。为了讨论目的,参考先前的图来描述过程300。

在302,显示系统的逻辑(例如,hmd100的逻辑)可以将与先前渲染的帧104相关联的像素数据108作为输入提供给gpu110。例如,可以将与两个最近渲染的帧104相关联的像素数据108作为输入提供给gpu110(例如,hmd100的gpu110)。这些帧104可以是从应用程序(例如,视频游戏应用程序)接收的实际帧,诸如过去渲染的第一帧104(1),以及过去在第一帧104(1)之后渲染的第二帧104(2)。因此,第二帧104(2)可以表示从应用程序接收的最近渲染的帧,并且第一帧104(1)和第二帧104(2)可能已在一系列帧104中连续渲染,尽管在块302处作为输入提供的像素数据108不需要是连续渲染帧的像素数据108。例如,可以在第一帧104(1)和第二帧104(2)之间渲染中间帧104,并且在块302处作为输入提供的像素数据108可以属于第一帧104(1)和第二帧104(2)。

在304,可以从gpu110接收运动向量112的阵列。在块304接收的运动向量112的阵列可能已由gpu110的视频编码器至少部分基于与第一帧104(1)相关联的第一像素数据108(1)和与第二帧104(2)相关联的第二像素数据108(2)(例如,基于第一像素数据108(1)和第二像素数据108(2)之间的比较)而产生。gpu110的视频编码器可以被配置成使用合适的计算机视觉和/或视频编码算法,该算法诸如通过确定比较的像素值之间的差异是否小于阈值差异来寻找像素值(或像素值组)之间的相似性。此类相似性度量内的任何东西都可以被认为是两个帧104之间的匹配像素数据108。

在306,逻辑可以至少部分基于第二帧104(2)的第二像素数据108(2)来产生重投影帧104(3)的第三像素数据108(3)。在此情况下,第二帧104(2)表示紧挨在重投影帧104(3)之前渲染的帧104。

在308,该逻辑可以至少部分基于运动向量112的阵列来修改第三像素数据108(3),以获得重投影帧104(3)的修改的第三像素数据108(3)'。如子块310和312所示,对重投影帧104(3)的像素数据108(3)的修改可以利用渲染网格200。

因此,在310,逻辑可以产生重投影帧104(3)的渲染网格200。渲染网格200可以包含具有多个顶点202的细分网格。在一些实施方案中,渲染网格200的分辨率可以匹配运动向量112的阵列的分辨率,使得运动向量112和渲染网格200的“元素”(例如,诸如渲染网格200的顶点202、渲染网格200的正方形(或四边形)等元素)之间存在一一对应关系。获得运动向量场112和渲染网格200之间的匹配分辨率可以包括本文描述的任何技术,诸如请求gpu110以特定分辨率输出运动向量场112,对运动向量场112的分辨率进行下采样或上采样,和/或以与gpu110输出的运动向量场112的分辨率匹配的分辨率产生渲染网格200。

在312,该逻辑可以将渲染网格200的顶点202(多个顶点202中的)移动到渲染网格200内的不同位置,作为移动的顶点206。顶点202可以(i)在非零运动向量112的方向上移动,并且(ii)移动量对应于非零运动向量112的幅度。因此,在块308处对第三像素数据108(3)的修改可以根据渲染网格200的移动顶点206,诸如通过根据移动顶点206移动第三像素数据108(3)的像素值以获得重投影帧104(3)的修改的第三像素数据108(3)'。例如,根据渲染网格200内的移动顶点206,第三像素数据108(3)的像素值可以向左移动4个像素,并且向上移动4个像素到修改的第三像素数据108(3)'内的新位置。

在一些实施方案中,基于在块302输入的不同集合的先前渲染的帧104,可以在块304接收多个运动向量场112,并且可以基于多个运动向量场112来确定附加的运动相关参数,以在块308用于重投影帧的运动平滑中使用。例如,除了前两个帧104(1)和104(2)导致在块304接收到运动向量112的阵列之外,在一些实施方案中,图3的算法可以返回一个或多个附加帧,诸如通过提供第一帧104(1)和在第一帧104(1)之前渲染的“第零”帧104(0)作为对gpu110的输入,并基于该不同的输入帧对104接收运动向量112的附加阵列。然后可以比较多个运动向量阵列以确定运动相关参数,例如帧到帧移动的对象的加速度,并且这些运动相关参数可以在块308处被应用,诸如通过修改(例如,增加/减小)应用于第三像素数据108(3)的最终运动向量112的幅度,以在运动平滑调整方面或多或少地移动像素值。

在314,该逻辑可以至少部分基于修改的第三像素数据108(3)',在显示器(例如,在hmd100的显示面板上)上渲染该重投影帧104(3)。根据从gpu110接收的运动向量112,借助于对第三像素数据108(3)的修改,在块314处渲染的所得的重投影帧104(3)被“运动平滑”。应了解,gpu110可以表示一个或多个gpu110。例如,可以利用多个gpu110在hmd100的立体显示面板上渲染给定的帧104,并且输入到这些gpu110的帧104的像素数据108可以被相应地分割(例如,像素数据108的左半部分可以被提供作为对第一gpu110的输入,并且像素数据108的右半部分可以被提供作为对第二gpu110的输入)。

图4是根据本文公开的实施方案的用于在像素数据被输入到gpu用于运动向量估计之前对齐先前渲染的帧的像素数据的示例性过程400的流程图。为了论述目的,参考先前的图来描述过程400。此外,如图3和图4中的离页引用“a”所示,过程400可以表示在图3的块304处的操作之前执行的操作,并且在一些实施方案中,过程400可以继续块304-314的操作。

在402,基于由hmd100的头部跟踪模块提供的旋转数据,hmd100的逻辑可以确定hmd100已在渲染先前渲染的帧104之间从第一定向旋转到第二定向,该先前渲染的帧的像素数据108将作为输入提供给gpu110。这在图1的示例中示出,其中用户102被示为在时间t1和时间t2之间向右旋转了他/她的头部,这意味着对应于渲染第一帧104(1)和第二帧104(2)的时间。为了说明的目的,图1中描绘的连续帧104之间的旋转量被放大了。

在404,先前渲染的帧104可以在那些帧104的像素数据108作为输入被提供给gpu110之前被对齐。这是因为hmd100在帧104之间的移动,这可能导致对象(静止和移动的对象)在渲染两个帧104(1)和104(2)的路线上的位置之间移动。通过将一个帧104(1)与另一帧104(2)对齐,或者反之亦然,表示场景内特定静态对象的像素数据108可以移动到两个帧104(1)和104(2)之间大致相同的位置,使得对应于静态对象的像素数据108不会被gpu110的视频编码器误认为是移动对象。块404处的对齐可以包括修改以下项中的至少一者:(i)第一像素数据108(1)(与第一帧104(1)相关联),以获得在渲染第二帧104(2)时将第一帧104(1)中的场景与hmd100的第二定向对齐的修改的第一像素数据408(1),或者(ii)第二像素数据108(2)(与第二帧104(2)相关联),以获得在渲染第一帧104(1)时将第二帧104(2)中的场景与hmd100的第一定向对齐的修改的第二像素数据。图4底部的图示出了前一种情况,其中第一像素数据108(1)被修改以获得修改的第一像素数据408(1),该修改的第一像素数据将第一帧104(1)中的场景与hmd100的第二定向对齐。然而,应了解,为了对齐目的,可以修改第一像素数据108(1)或第二像素数据108(2)中的任一者。

在406,该逻辑可以将先前渲染的帧104之一的修改的像素数据和另一帧104的原始像素数据108作为输入提供给gpu110。图4的图中所示的示例描绘了将修改的第一像素数据408(1)和原始的第二像素数据108(2)作为输入提供给gpu110。如所提及,过程400可以从块406继续到过程300的块304(如离页引用“a”所示)。因此,可以基于在块406作为输入提供给gpu110的像素数据而在块304从gpu110接收运动向量112的阵列,并且可以执行图3的运动平滑算法的剩余操作,以渲染运动平滑的重投影帧104(3)。

图5是根据本文公开的实施方案的示例性过程500的流程图,该示例性过程用于排除先前渲染的帧的一些像素数据,并将像素数据的剩余部分作为输入提供给gpu用于运动向量估计。为了论述目的,参考先前的图来描述过程500。此外,如图3和图5中的离页引用“a”所示,过程500可以表示在图3的块304处的操作之前执行的操作,并且在一些实施方案中,过程500可以继续块304-314的操作。

在502,基于由hmd100的头部跟踪模块提供的旋转数据,hmd100的逻辑可以确定hmd100已在渲染先前渲染的帧104之间从第一定向旋转到第二定向,该先前渲染的帧将作为输入提供给gpu110。先前渲染的帧104可以是图1中所示的第一帧104(1)和第二帧104(2)。

在504,该逻辑可以将一部分可用像素数据108作为输入提供给gpu110。作为输入提供给gpu110的可用像素数据108的部分可以包括例如第一像素数据108(1)的部分506(1)和第二像素数据108(2)的部分506(2),每一部分对应于除了hmd100的显示面板的一个或多个边缘处的像素子集之外的像素。例如,如图5所示,作为输入提供给gpu110的像素数据108的部分506排除了显示面板的左边缘和右边缘处的像素数据108的剩余部分(在图5中用黑色示出)。换句话说,显示面板的左边缘和右边缘处的像素数据108不被提供给gpu110,使得gpu110将其运动估计努力集中在显示面板的左边缘和右边缘之间的像素数据108的中心部分506上。对于正和/或负垂直方向上的hmd100旋转,像素数据108的排除部分可以是图像的顶部和底部边缘。在任何情况下,排除图像边缘处的像素数据108的一部分,并且专门将像素数据108的剩余部分506提供给gpu110,有效地导致图像边缘处的零运动向量112,这在图像边缘附近出现不希望的视觉假影的情况下可能是有用的,这可能导致不具有移动对象106的特性的异常运动向量112。如所提及,过程500可以从块504继续到过程300的块304,其中基于在块504作为输入提供给gpu110的像素数据而从gpu110接收运动向量112的阵列,并且可以执行图3的运动平滑算法来渲染运动平滑的重投影帧104(3)。

图6是根据本文公开的实施方案的示例性过程600的流程图,该示例性过程用于对齐先前渲染的帧的像素数据,排除先前渲染的帧的像素数据的面板掩模部分并且将像素数据的剩余部分作为输入提供给gpu用于运动向量估计。为了论述目的,参考先前的图来描述过程600。此外,如图3和图6中的离页引用“a”所示,过程600可以表示在图3的块304处的操作之前执行的操作,并且在一些实施方案中,过程600可以继续块304-314的操作。

在602,基于由hmd100的头部跟踪模块提供的旋转数据,hmd100的逻辑可以确定hmd100已在渲染先前渲染的帧104之间从第一定向旋转到第二定向,该先前渲染的帧将作为输入提供给gpu110。先前渲染的帧可以是图1中所示的第一帧104(1)和第二帧104(2)。

在604,该逻辑可以修改与第一帧104(1)相关联的第一像素数据108(1)以获得修改的第一像素数据608(1),该修改的第一像素数据将第一帧104(1)中的场景与hmd100的第二定向对齐。在图6的示例中,第一像素数据108(1)的一部分表示对应于每一帧在hmd100的显示面板的外围渲染的面板掩模(以黑色示出)的数据。因此,修改的第一像素数据608(1)的面板掩模部分614(1)(即,图6中以黑色示出的部分)表示对应于修改的第一像素数据608(1)中的面板掩模的数据。

在606,该逻辑可以修改与第二帧104(2)相关联的第二像素数据108(2)以获得修改的第二像素数据608(2),该修改的第二像素数据将第二帧中的场景与hmd100的第一定向对齐。此外,第二像素数据108(2)的一部分表示对应于每一帧在hmd100的显示面板的外围渲染的面板掩模(以黑色示出)的数据。因此,修改的第二像素数据608(2)的面板掩模部分614(2)(即,图6中以黑色示出的部分)表示对应于修改的第二像素数据608(2)中的面板掩模的数据。

在610,该逻辑可以将修改的第一像素数据608(1)的面板掩模部分614(1)与修改的第二像素数据608(2)的面板掩模部分614(2)组合,以确定具有对应于面板掩模616的公共值的像素子集。这可以被认为是某种维恩图,其中对应于面板掩模616的像素子集是修改的第一像素数据608(1)和修改的第二像素数据608(2)中的修改的面板掩模的组合版本。

在612,该逻辑可以将第一像素数据108(1)的特定部分(例如,中心部分)和第二像素数据108(2)的特定部分(例如,中心部分)作为输入提供给gpu110,每一特定部分都对应于除了对应于面板掩模616的像素子集之外的像素。这允许gpu110忽略由面板掩模616像素覆盖的每一先前渲染的帧中的像素数据108的部分的运动估计,并且gpu110可以将其运动估计努力集中在每一帧104的像素数据108的中心、非面板掩模部分上。如所提及,过程600可以从块612继续到过程300的块304,其中基于在块612作为输入提供给gpu110的像素数据而从gpu110接收运动向量112的阵列,并且可以执行图3的运动平滑算法来渲染运动平滑的重投影帧104(3)。

图7是根据本文公开的实施方案,在从gpu输出的运动向量被用于产生重投影帧作为运动平滑技术的一部分之前,对该等运动向量进行阈值处理的示例性过程700的流程图。为了讨论目的,参考先前的图来描述过程700。

在702,显示系统的逻辑(例如,hmd100的逻辑)可以将与先前渲染的帧104相关联的像素数据108作为输入提供给gpu110。在块702执行的操作可以类似于关于过程300的块302所描述的操作。

在704,该逻辑可以从gpu110接收运动向量112的阵列。在块704执行的操作可以类似于关于过程300的块304所描述的操作。

在706,该逻辑可以将运动向量112的阵列中的个别运动向量的幅度(或长度)与第一阈值幅度进行比较,以确定幅度大于第一阈值幅度的运动向量112的第一子集。第一阈值幅度可以用于减轻高幅度异常运动向量112的此子集的影响,该子集可表示除了虚拟对象106的移动或动画之外的帧之间的变化。由于各种原因可能会出现异常高幅度的运动向量。gpu110可以发现第二帧104(2)的右上角的像素与第一帧104(1)的左下角的像素足够相似,并且可以输出与阵列中的其他运动向量112相比具有相对较高幅度的所得运动向量112,即使该运动向量112不表示帧104之间的虚拟对象106的移动或动画。在一些情况下,视频游戏可以允许用户瞬移到不同的位置,在该位置,帧104之间的场景急剧变化,导致gpu110的视频编码器产生大的运动向量112。在这些和其他情况下,对这些大的运动向量112进行阈值处理可能是有用的。

在707,当多个先前渲染的帧104包括第一帧104(1)和第二帧104(2)时,逻辑可以确定渲染第一帧104(1)时的第一时间和渲染第二帧104(2)时的第二时间之间的时间段(或间隙)。

在709,可以至少部分基于第一时间和第二时间之间的时间段来选择在块706的比较中使用的第一阈值幅度。在说明性示例中,第一阈值幅度(以每单位时间从用户视点的移动度来测量)是两个帧104(1)和104(2)之间每11.1ms移动6度。因此,两个帧104(1)和104(2)相隔的时间越长,第一阈值幅度越大,且因此允许运动向量112越长(幅度上)。这是因为一旦运动超过某一速度,运动平滑可能就不那么有效了,并且可能实际上导致不利的视觉假影(例如,通过使场景的某些部分看起来“眩晕”)。

在708,该逻辑可以减小被确定具有大于第一阈值幅度的幅度的运动向量112的第一子集的幅度,使得幅度被封顶在第一阈值幅度。这创建了运动向量112的第一修改阵列。换句话说,对于超过第一阈值幅度的那些运动向量112,逻辑被配置成将那些运动向量112的幅度封顶(或限制)到第一阈值幅度,使得运动向量112的第一修改阵列包括等于或小于第一阈值幅度的幅度,并且不包括大于第一阈值幅度的任何幅度。在一些实施方案中,并非将运动向量112的幅度封顶在第一阈值幅度并使用所有非零运动向量用于运动平滑,该逻辑可以丢弃具有满足或超过第一阈值幅度的幅度的运动向量112的第一子集,使得它们根本不用于运动平滑。

在710,该逻辑可以将运动向量112的阵列中的个别运动向量的幅度(或长度)与第二阈值幅度进行比较,以确定幅度小于第二阈值幅度的运动向量112的第二子集。第二阈值幅度可用于减轻低幅度异常运动向量112的子集的影响,该子集可以表示帧之间的变化,该变化通常由用户的不断头部移动和/或头部跟踪引起,尽管精确,但不精确到绝对零运动的程度。因此,gpu110的输出很少提供零长度运动向量112。相反,更常见的是,由于周围头部运动和/或跟踪抖动,gpu110的输出具有大量噪声,如上所述。换句话说,两个连续帧之间的像素很少100%匹配。在说明性示例中,以运动像素测量的第二阈值幅度是2个运动像素的阈值。在此示例中,任何幅度(或长度)小于2个运动像素的运动向量都被视为低幅度异常向量。

在712,该逻辑可以将被确定具有小于第二阈值幅度的幅度的运动向量112的第二子集(例如,长度小于2个运动像素的低幅度异常运动向量)的幅度减小到长度/幅度为零。这创建了运动向量112的第二修改阵列,该阵列不包括幅度小于第二阈值幅度的任何运动向量。这在本文有时称作对运动向量112应用小死区。

在714,该逻辑可以基于运动向量112的第二修改阵列来修改重投影帧的像素数据108(3),该运动向量的第二修改阵列的幅度被封顶在第一阈值幅度,并且没有幅度小于第二阈值的任何运动向量112。在一些实施方案中,诸如当运动向量的第一子集被丢弃而不是被封顶在第一阈值幅度时,在块714,除了被丢弃的运动向量112的第一子集之外的运动向量112的剩余子集被用于修改重投影帧的像素数据108(3)。像素数据108(3)的修改可以包括本文描述的任何技术(例如,参考过程300的块308-312描述的那些技术)。

在716,该逻辑可以至少部分基于重投影帧104(3)的修改的像素数据108(3),在显示器(例如,在hmd100的显示面板上)上渲染该重投影帧104(3)。在块716执行的操作可以类似于关于过程300的块314所描述的操作。

图8是根据本文公开的实施方案,在从gpu输出的运动向量被用于产生重投影帧作为运动平滑技术的一部分之前,对该等运动向量进行衰减的示例性过程800的流程图。为了讨论目的,参考先前的图来描述过程800。

在802,显示系统的逻辑(例如,hmd100的逻辑)可以将与先前渲染的帧104相关联的像素数据108作为输入提供给gpu110。在块802执行的操作可以类似于关于过程300的块302所描述的操作。

在804,该逻辑可以从gpu110接收运动向量112的阵列。在块804执行的操作可以类似于关于过程300的块304所描述的操作。

在806,该逻辑可以产生叠加在运动向量112的阵列上的衰减纹理,用于衰减(例如,缩短、减小等)运动向量112的个别运动向量的幅度(例如,如果那些运动向量112的质量置信度低)。衰减纹理可以以任何合适的分辨率产生,使得衰减纹理包括多个纹理元素(例如,纹理元素的网格)。衰减纹理的分辨率可以是比运动向量112的阵列的分辨率更低的分辨率,使得多个运动向量在衰减纹理的单个纹理元素内。在示例中,衰减纹理可以具有这样的分辨率,使得用户视野(fov)中心的纹理元素大约为6度乘6度(水平和垂直)。每个纹理元素的分辨率(水平和垂直)可能是近似的,因为每个纹理元素的度数在整个衰减纹理中可能不是恒定的。例如,hmd100的fov可以在面积上跨越大致100度乘100度(例如,正负大约10度)。衰减纹理可以基于非线性投影矩阵来产生,使得分辨率根据衰减纹理的每个纹理元素而变化,但分辨率提供大致6-10度×6-10度的纹理元素。此外,衰减纹理的每一纹理元素可以被指派一个衰减值(例如,在0.0和1.0的范围内)。指派给给定纹理元素的衰减值控制该纹理元素中的运动向量112的幅度减小(缩短)的量。例如,1.0的衰减值可以对应于没有衰减,且因此,将1.0的衰减值应用于运动向量112意味着运动向量112在其幅度方面保持原样(例如,没有减小、缩短等)。然而,0.0的衰减值可以对应于完全衰减,且因此,将0.0的衰减值应用于运动向量112意味着运动向量112在其幅度方面减小到零。0.0和1.0之间的衰减值可以对应于部分衰减,且因此,将如0.5的衰减值应用于运动向量112意味着运动向量在其原始长度(幅度)方面减小到50%(一半)。因此,衰减纹理可以减小(缩短)运动向量112的幅度,但它不能增加(延长)运动向量112的幅度。

图8示出了示例性衰减纹理807,该衰减纹理可能是基于两个连续渲染的帧104之间屏幕底部的亮度(或颜色)的突然变化而在块808产生的。例如,在玩视频游戏时,hmd100的用户可以选择手持式控制器上的按钮,这使得大的蓝色网格出现在下一渲染帧104上的屏幕的下半部分。在该示例性情形中,当处理该帧104和先前渲染的帧104作为输入时,gpu110可以找到在场景顶部渲染的天空中的像素,其亮度值与屏幕下半部分的大蓝色网格中的像素的亮度值最匹配。这导致gpu110输出运动向量场112,其中场景底部的运动向量112突然变得幅度非常大,并且不表示场景中的实际运动。在示例性衰减纹理807中,白色纹理元素可以表示1.0的衰减值,而黑色纹理元素可以表示0.0的衰减值,并且灰色纹理元素的阴影表示0.0和1.0之间的衰减值(不包括0.0和1.0)。

在808,该逻辑可以使用在块806产生的衰减纹理来减小(例如,缩小)运动向量112的阵列中的个别运动向量的幅度(例如,使用衰减纹理的衰减值来将运动向量112的幅度减小对应于衰减值的量)。假设衰减纹理中至少有一个衰减值小于1.0,这就创建了运动向量112的修改阵列。目标是缩小在帧104之间变化超过阈值量的运动向量112,这很可能指示这些运动向量112不表示场景内的实际运动,并且不应被误认为表示运动。衰减纹理用于找到屏幕上那些区域中的运动向量在单个帧中是极端的区域(就它们的幅度而言),这表明要么不能相信运动向量表示实际运动,或者要么如果它们表示场景内的实际运动,则此类运动对于运动平滑来说太快,无论如何都不会有显著的影响,并且优选具有零运动向量,而不是尝试使用这些运动向量进行运动平滑。实际上,每当您有帧到帧的运动时,运动通常与前一帧没有太大不同,因为显示器的刷新率通常是大约90hz,并且很难在帧之间的短时间内移动很远。因此,通常,被衰减纹理衰减的这些极端运动向量112不表示实际运动。

如子块809所示,在一些实施方案中,在块808使用衰减纹理来减小运动向量的幅度可以包括在使用衰减纹理来减小运动向量的幅度之前,对衰减纹理应用最小n×n滤波器。此处,n可以是任何适合的数。n=3使用最小3×3的滤波器(即,3×3的纹理元素块)。使用n=3的示例,在块809将最小3×3滤波器应用到衰减纹理时,该逻辑可以基于每个纹理元素从衰减纹理807中提取以相应纹理元素为中心的每一3×3纹理元素块(例如,包括相应纹理元素及其8个相邻纹理元素的纹理元素块)中的9个衰减值中的最小值。在块809应用该最小n×n滤波器通常导致将更多的运动向量112清零,因为衰减纹理中被指派非零衰减值的任何对应纹理元素,但该对应纹理元素具有被指派零衰减值的相邻纹理元素,这将使零衰减值应用到该对应纹理元素的对应运动向量,从而将对应纹理元素中的运动向量减小到零,尽管对应纹理元素在衰减纹理807中被指派了非零衰减值。换句话说,如果相邻纹理元素被指派零衰减值,则衰减纹理的给定纹理元素中的运动向量112被清零,这意味着相邻纹理元素具有大量高幅度运动向量。图8示出了示例性衰减纹理811,其是对衰减纹理807应用最小n×n滤波器的结果。所得衰减纹理811包括比衰减纹理807更多的黑色纹理元素,这意味着使用所得衰减纹理811将更多的运动向量清零。

在810,该逻辑可以基于运动向量112的修改阵列来修改重投影帧的像素数据108(3),其中对于衰减纹理中小于1.0的衰减值,可能衰减了一些幅度。像素数据108(3)的修改可以包括本文描述的任何技术(例如,参考过程300的块308-312描述的那些技术)。

在812,该逻辑可以至少部分基于重投影帧104(3)的修改的像素数据108(3),在显示器(例如,在hmd100的显示面板上)上渲染该重投影帧104(3)。在块812执行的操作可以类似于关于过程300的块314所描述的操作。

图9是根据本文公开的实施方案的用于产生衰减纹理(诸如参考图8的过程800描述的衰减纹理)的示例性过程900的流程图。因此,过程900可以表示可以被执行以在过程800的块806产生衰减纹理的操作的子过程。为了讨论目的,参考先前的图来描述过程900。

在902,在接收到由gpu110的视频编码器产生的运动向量112的阵列之后,显示系统的逻辑(例如,hmd100的逻辑)可以至少部分基于运动向量112的多个先前获得的阵列来确定衰减纹理的每一纹理元素的一组增量向量。例如,在处理一系列帧时,可以维持运动向量112的阵列的历史,并且运动向量112的最后两个阵列(例如,运动向量112的两个最近阵列)可以进行比较以在块902确定增量向量集(例如,指示两个阵列中的一对对应运动向量之间的差异(例如,在幅度方面)的差异向量)。

在904,该逻辑可以计算衰减纹理的每一纹理元素中具有大于阈值幅度的幅度的增量向量的百分比。例如,在块904,逻辑可以评估衰减纹理的给定纹理元素中的增量向量,将纹理元素中的“异常”向量识别为那些具有大于阈值幅度的增量(例如,幅度)的增量向量,并计算纹理元素中异常向量的百分比。为了在块904识别“异常”向量,可以使用任何合适的阈值,诸如每帧(或每11.1ms的时间)大约3度的移动/运动(从用户的角度来看)的阈值。换句话说,在块904使用的阈值可以基于在渲染第一帧104(1)时的第一时间和在渲染第二帧104(2)时的第二时间之间的时间段(或间隙),如上文参考图7的过程700的块707和709所描述。

在906,该逻辑可以为衰减纹理的每一纹理元素确定纹理元素中作为“异常”增量向量的增量向量的百分比是否满足或超过阈值百分比,诸如25%。如果在块906,纹理元素中作为“异常”增量向量的增量向量百分比满足或超过阈值百分比,则过程900可以遵循从块906到块908的“是”路线。

在908,对于具有满足或超过阈值百分比的多个“异常”增量向量的纹理元素,逻辑可以将衰减值计算为零。换句话说,如果给定纹理元素的特定量(例如,25%或更多)的增量向量大于最大长度,则该逻辑可以将该纹理元素的衰减值计算为零。如过程800中所述,将零衰减值应用到给定纹理元素内的运动向量112将那些运动向量112的幅度减小到零(例如,完全衰减该纹理元素内的运动向量)。

在906,对于具有小于阈值百分比的“异常”增量向量的纹理元素,过程900可以遵循从块906到块910的“否”路线,其中逻辑可以将这些纹理元素的衰减值计算为至少部分基于在块904计算的百分比的衰减值。例如,如果具有大于给定纹理元素的阈值幅度的幅度的增量向量百分比小于阈值百分比(例如,25%),则衰减值可以被设为线性映射到在小于阈值百分比的值的范围内(例如,在0%-25%的范围内)计算的百分比的值。在块910处计算的衰减值有效地(当衰减纹理被应用于运动向量场112时)降低了未清零的剩余向量中的噪声。

在912,基于先前渲染的帧104,可以将计算的衰减值与该纹理元素的现有衰减值进行比较。如果在块912处衰减值小于现有值,则过程900可以遵循从块912到块914的“是”路线,其中纹理元素的衰减值被设为在块908或910处计算的衰减值。例如,如果在前一帧中衰减纹理的纹理元素没有衰减,则现有的衰减值可能等于1.0,且如果在块908或910计算的新的衰减值小于1.0,则在此示例中,衰减值被设为新计算的衰减值,以衰减给定纹理元素中的运动向量。

在912,如果所计算的衰减值不小于所讨论的纹理元素的现有值,则过程900可以遵循从块912到块916的“否”路线,其中现有衰减值随着时间朝着对应于无衰减的最大衰减值(例如,1.0)增加。例如,因为一些情况可能导致不稳定的运动向量在帧与帧之间变化,所以新的衰减值可以在衰减纹理的纹理元素的先前(旧的)衰减值上“混合”,这意味着衰减值在一段时间内(例如,在1秒的时段内)递增到没有衰减,假设计算的衰减值在该段时间内从未小于纹理元素的现有衰减值。

图10是根据本文公开的实施方案的示例性过程1000的流程图,该过程用于在对应于几乎没有颜色变化的区域的运动向量被用于产生重投影帧作为运动平滑技术的一部分之前,将所得运动向量集清零。为了讨论目的,参考先前的图来描述过程1000。

在1002,显示系统的逻辑(例如,hmd100的逻辑)可以将与先前渲染的帧104相关联的像素数据108作为输入提供给gpu110。在块1002执行的操作可以类似于关于过程300的块302所描述的操作。

在1004,该逻辑可以从gpu110接收运动向量112的阵列。在块1004执行的操作可以类似于关于过程300的块304所描述的操作。

在1006,该逻辑可以比较输入到gpu110的多个先前渲染的帧104之间的颜色像素值(在rgb向量方面),以确定运动向量112的阵列中每个运动向量的色差值。这些色差值可以与阈值色差进行比较,以确定与帧之间几乎没有颜色变化相关联的运动向量112的子集,因为它们的色差值小于阈值色差。在一些实施方案中,该逻辑将rgb像素值视为向量。然后比较先前渲染的帧104之间的对应的rgb向量,以便确定颜色的差异(例如,增量向量)。因为运动向量112的阵列中的每一运动向量112可以对应于像素块(例如,8×8像素块),所以可以通过比较帧104之间的8×8像素块中的一些或所有rgb像素值,在每个运动向量的基础上执行此类颜色比较。在一些实施方案中,该逻辑比较对应于单个运动向量112的每一8×8像素块中每隔一行像素和每隔一列像素的颜色值,以便确定帧104之间的颜色变化量(例如,色差值),颜色变化量与特定运动向量112相关联。因此,关于对应于给定运动向量112的像素块,帧之间的颜色比较可以涉及比较对应像素块中的一部分像素(例如,25%)以节省处理资源。

在1008,该逻辑可以将色差值小于阈值色差的运动向量子集112的幅度减小到长度/幅度为零。这创建了运动向量112的修改阵列,该阵列不包括在先前渲染的帧之间几乎没有颜色变化(有时称作零运动色差)的场景区域中的任何运动向量。例如,这可以有助于防止当文本在纯色背景下时文本边缘看起来模糊或扭曲。每当场景中的灯光或其他用户界面元素逐渐变亮或变暗时,它还可以帮助防止视觉上分散注意力的假影出现。

在1010,该逻辑可以基于运动向量112的修改阵列来修改重投影帧的像素数据108(3),该阵列不再包括在先前渲染的帧104之间颜色实际上相同的区域中的任何运动向量112。像素数据108(3)的修改可以包括本文描述的任何技术(例如,参考过程300的块308-312描述的那些技术)。

在1012,该逻辑可以至少部分基于重投影帧104(3)的修改的像素数据108(3),在显示器(例如,在hmd100的显示面板上)上渲染该重投影帧104(3)。在块1012执行的操作可以类似于关于过程300的块314所描述的操作。

图11是根据本文公开的实施方案的示例性过程1100的流程图,该示例性过程用于在所得运动向量集被用于产生重投影帧作为运动平滑技术的一部分之前,使用一个或多个滤波器来“清理”运动向量场。为了讨论目的,参考先前的图来描述过程1100。

在1102,显示系统的逻辑(例如,hmd100的逻辑)可以将与先前渲染的帧104相关联的像素数据108作为输入提供给gpu110。在块1102执行的操作可以类似于关于过程300的块302所描述的操作。

在1104,该逻辑可以从gpu110接收运动向量112的阵列。在块1104执行的操作可以类似于关于过程300的块304所描述的操作。

在1106,该逻辑可以将n×n标量中值滤波器应用于运动向量112的阵列,以获得运动向量112的第一修改阵列。此处,n可以是任何合适的数,诸如n=5,这将应用5×5标量中值滤波器。在n=5的示例中,通过观察围绕所选运动向量的5×5组运动向量112,将5×5标量中值滤波器应用于运动向量112的阵列中的每一运动向量。对于所选的运动向量,围绕所选向量的5×5区域有25个运动向量。应用于所选运动向量的标量中值滤波器计算中值x分量值(在25个x分量值中)和中值y分量值(在25个y分量值中),并且然后组合中值x分量值和中值y分量值以获得标量中值向量,并且所选运动向量可以用标量中值向量来替换。该过程针对运动向量112的阵列中的每一向量进行迭代。此外,可以使用任何合适的n值,并且n=5只是示例。在块1106应用标量中值滤波器降低了运动向量场112中的噪声,并有助于去除异常运动向量。在块1106使用标量中值滤波器在计算上也比应用更复杂的滤波器(诸如向量中值滤波器)更快,向量中值滤波器将依赖于计算更密集的更复杂的距离算法。

在1108,该逻辑可以将m×m平均-最大模糊滤波器应用于运动向量112的第一修改阵列,以获得运动向量112的第二修改阵列。此处,m可以是任何合适的数,诸如m=3,这将应用3×3平均-最大模糊滤波器。平均-最大模糊滤波器独立地应用两个单独的滤波器(平均向量滤波器和最大长度向量滤波器),并且然后从这两个独立应用的滤波器获取所得向量的向量平均值。在使用n=3的示例中,通过观察围绕所选运动向量的3×3组运动向量112,将3×3平均-最大模糊滤波器应用于运动向量112的阵列中的每一运动向量。对于所选的运动向量,围绕所选向量的3×3区域有9个运动向量。首先,对所选的运动向量应用平均向量滤波器,其计算平均x分量值(在9个x分量值中)和平均y分量值(在9个y分量值中),并且然后组合平均x分量值和平均y分量值以获得平均向量。接下来,将最大长度向量滤波器独立地应用于所选运动向量,其确定最长的向量(在9个运动向量中)。然后,通过取平均向量和最长向量的向量平均值来确定所得向量,并且所选运动向量可以用所得向量来替代。该过程针对运动向量112的阵列中的每一向量进行迭代。此外,可以使用任何合适的m值,并且m=3只是示例。在块1108应用平均-最大模糊滤波器提供了消除运动向量组的子区域中的不连续性的平滑运动向量场。在一些实施方案中,在块1108应用平均-最大模糊滤波器是在运动向量场112用于运动平滑之前对运动向量场112的最终“清除”步骤,如本文所述。例如,如果与本文所述的其他技术结合使用,诸如对运动向量进行阈值处理、使用衰减纹理、在几乎没有色差的区域将向量清零等,这些不同的操作可以在应用平均-最大模糊滤波器之前执行。

在1110,该逻辑可以基于具有滤波后的运动向量的运动向量112的修改阵列来修改重投影帧的像素数据108(3)。像素数据108(3)的修改可以包括本文描述的任何技术(例如,参考过程300的块308-312描述的那些技术)。

在1112,该逻辑可以至少部分基于重投影帧104(3)的修改的像素数据108(3),在显示器(例如,在hmd100的显示面板上)上渲染该重投影帧104(3)。在块1112执行的操作可以类似于关于过程300的块314所描述的操作。

应了解,在图7至图11的过程中描述的各种技术(修改由gpu110输出的运动向量场的各种技术)可以以任何组合和/或任何顺序使用。例如,参考图7描述的技术可以与参考图8和图9描述的技术结合使用,并且这些技术中的一些或全部可以与参考图10描述的技术结合使用,并且这些技术中的一些或全部可以与参考图11描述的技术结合使用。也就是说,获得优化运动向量场的稳健技术可以在运动向量场的稳健修改中一起利用参考图7至图11描述的所有技术。

图12是根据本文公开的实施方案的用于在像素数据被输入到gpu用于运动向量估计之前旋转先前渲染的帧的示例性过程1200的流程图。为了讨论目的,参考先前的图来描述过程1200。

在1202,显示系统的逻辑(例如,hmd100的逻辑)可以将多个先前渲染的帧104中的第一帧104(1)旋转一定的旋转量,以获得第一旋转帧1204(1),所述多个先前渲染的帧的像素数据108将作为输入被提供给gpu110。

在1206,逻辑可以将多个先前渲染的帧104中的第二帧104(2)旋转一定的旋转量,以获得第二旋转帧1204(2)。

在1208,逻辑可以将旋转帧1204(1)和1204(2)的像素数据作为输入提供给gpu110。过程1200可以从块1208继续到过程300的块304(如离页引用“a”所示)。因此,可以基于在块1208作为输入提供给gpu110的像素数据而在块304从gpu110接收运动向量112的阵列,并且可以执行图3的运动平滑算法的剩余操作,以渲染运动平滑的重投影帧104(3)。

过程1200可以减轻场景中的水平和/或垂直建筑边缘的效应,以免引起“奇怪的”运动向量,这些运动向量并不真正代表移动或动画对象。多个先前渲染的帧104(1)和104(2)可以在块1202和1206旋转相同的旋转量,或者,每一帧104(1)和104(2)可以分别在块1202和1206旋转不同的旋转量。在一些实施方案中,块1202和1206处的每一帧的旋转量是预定义的(例如,将输入帧104(1)和104(2)旋转45度)。将帧104(1)和104(2)旋转45度可以导致场景中的水平和垂直边缘被对角定向,并且因此,这些对角边缘可能不会导致由gpu110的视频编码器产生那么多“奇怪的”运动向量。在一些实施方案中,在块1202和1206处的每一帧的旋转量可以是每一帧104的随机旋转量。这可能会暂时隐藏任何可能与45度对齐的边缘。

图13是根据本文公开的实施方案的用于在基于先前渲染的帧的亮度数据和色度数据产生的运动向量阵列之间进行选择的示例性过程1300的流程图。为了论述目的,参考先前的图来描述过程1300。此外,如图3和图13中的离页引用“b”所示,过程1300可以表示在图3的块306处的操作之前执行的操作,并且在一些实施方案中,过程1300可以继续块306-314的操作。

在1302,显示系统的逻辑(例如,hmd100的逻辑)可以将与先前渲染的帧104相关联的亮度数据作为输入提供给gpu110。例如,与第一帧104(1)相关联的第一像素数据108(1)可以包括第一亮度数据、第一色度数据和/或附加类型的数据。类似地,与第二帧104(2)相关联的第二像素数据108(2)可以包括类似类型的数据,诸如第二亮度数据、第二色度数据等等。因此,在块1302,第一亮度数据和第二亮度数据可以作为输入提供给gpu110。

在1304,逻辑可以从gpu110接收由gpu110的视频编码器至少部分基于第一亮度数据和第二亮度数据产生的运动向量112的第一阵列。

在1306,逻辑可以将与第一帧104(1)相关联的第一色度数据和与第二帧104(2)相关联的第二色度数据作为输入提供给gpu110。

在1308,逻辑可以从gpu110接收由gpu110的视频编码器至少部分基于第一色度数据和第二色度数据产生的运动向量112的第二阵列。

在1310,该逻辑可以基于对运动向量112的第一阵列和运动向量112的第二阵列的分析,选择运动向量112的第一阵列或运动向量112的第二阵列中的一者作为运动向量的选定阵列。例如,选择算法可以基于运动向量112的每一场中的运动向量112的幅度和/或方向来选择最不稳定的一个(作为示例)。例如,当在第二帧104(2)中出现明亮的闪光(例如,虚拟爆炸)时,亮度数据可以导致gpu110输出幅度超过某个阈值幅度的运动向量112,而相同的先前渲染的帧104的色度数据可以导致gpu110输出不包括这种幅度非常大的运动向量的运动向量112。在此情况下,可以在块1310选择由色度数据产生的运动向量112的阵列。这仅仅是选择算法的一个示例,并且也可以采用其他算法。如所提及,过程1300可以从块1310继续到过程300的块306,其中基于来自块1310的运动向量112的选定阵列来修改重投影帧104(3)的像素数据108(3)。

图14是根据本文公开的实施方案的用于获得多个运动向量阵列、确定阵列之间的差异并且基于所确定的差异产生运动向量的最终阵列以进行运动平滑的示例性过程1400的流程图。为了论述目的,参考先前的图来描述过程1400。此外,如图3和图14中的离页引用“b”所示,过程1400可以表示在图3的块306处的操作之前执行的操作,并且在一些实施方案中,过程1400可以继续块306-314的操作。

在1402,显示系统的逻辑(例如,hmd100的逻辑)可以将与先前渲染的帧104相关联的第一像素数据108(1)作为输入提供给gpu110。在块1402执行的操作可以类似于关于过程300的块302所描述的操作。

在1404,该逻辑可以基于在块1402作为输入提供的第一像素数据108(1)从gpu110接收运动向量的第一阵列112(1)。

在1406,该逻辑可以将与先前渲染的帧104相关联的第二像素数据108作为输入提供给gpu110。

在1408,逻辑可以从gpu110并且至少部分基于第二像素数据108(2)来接收运动向量的第二阵列112(2)。

在1410,该逻辑可以确定第一阵列112(1)和第二阵列112(2)之间的运动向量112的方向和/或幅度的差异。例如,可以在第一阵列112(1)中的运动向量112和第二阵列112(2)中的相应运动向量112之间进行比较,以确定运动向量在运动向量的方向或幅度中的任一者或两者方面是否不同,并且如果不同,则确定它们不同的量。

在1412,逻辑可以至少部分基于如在块1410所确定的运动向量的第一阵列112(1)或运动向量的第二阵列112(2)之间的差异来产生运动向量112的最终阵列。例如,运动向量112的最终阵列可以表示一组运动向量,该组运动向量是通过衰减第一阵列112(1)或第二阵列112(2)中的运动向量中的个别运动向量,或者通过衰减表示每一阵列112(1)和112(2)中相应运动向量的平均值的平均运动向量而产生的。如所提及,过程1400可以从块1412继续到过程300的块306,其中基于在块1412产生的运动向量112的最终阵列来修改重投影帧104(3)的像素数据108(3)。

作为如何使用过程1400的说明性示例,考虑一个示例,其中在块1404基于输入帧104(1)和104(2)在其原始(“y-向上”)定向上的像素数据108接收运动向量的第一阵列112(1),并且在块1408基于已旋转45度的输入帧104(1)和104(2)的像素数据108接收运动向量的第二阵列112(2)。参考图10描述了旋转输入图像帧104的概念。因此,在该说明性示例中,在块1402可以提供第一帧104(1)和第二帧104(2)的像素数据108作为输入以产生运动向量的第一阵列112(1),并且在块1406可以提供第一旋转帧1004(1)和第二旋转帧1004(2)的像素数据108作为输入以产生运动向量的第二阵列112(2)。在该说明性示例中,运动向量的两个阵列112(1)和112(2)可以重新对齐(例如,通过在相反方向上将第二阵列112(2)旋转45度),并且然后通过观察两个阵列112(1)和112(2)中的对应向量之间的角度差(方向)和/或长度差(幅度)来进行比较以确定不匹配。可能的情况是,实际运动(例如,场景中的移动或动画对象)可以为旋转的输入帧104产生非常相似的运动向量阵列,而错误检测的运动可以产生非常不同的运动向量阵列。在该说明性示例中,可以在块1412处通过用两个归一化向量的点积来衰减每一阵列112(1)和112(2)中两个对应向量的平均值的长度,来产生运动向量112的最终阵列。在一些实施方案中,可以在块1412利用如参考图8和图9描述的衰减纹理来产生最终阵列。例如,在过程900的块902处确定的该组增量向量可以基于在块1404处接收的运动向量的第一阵列112(1)和在块1408处接收的运动向量的第二阵列112(2)之间的增量,并且在块1412处可以使用所得衰减纹理来衰减第一阵列112(1)、第二阵列112(2)或者两个阵列112(1)和112(2)之间的向量的组合(例如,平均值)。

作为如何使用过程1400的另一说明性示例,考虑一个示例,其中产生用于多个先前渲染的帧104的输入纹理的第一mip级别(mipmap级别),并且在块1402将该第一mip级别的对应像素数据108作为输入提供给gpu110,以产生运动向量的第一阵列112(1)。同时,产生用于多个先前渲染的帧104的输入纹理的第二mip级别,并且在块1406将该第二mip级别的对应像素数据108作为输入提供给gpu110,以产生运动向量的第二阵列112(2)。这甚至可以针对任意数量的mip级别来完成,以产生任意数量的对应运动向量阵列。在一些实施方案中,可以产生3或4个mip级别的输入纹理,从而在块1410之前接收运动向量112的3或4个阵列。在一些实施方案中,每一mip级别是前一个mip级别宽度和高度的一半(例如,面积的25%)。在块1410,在本说明性示例中,可以确定由不同mip级别产生的阵列对112之间的差异,并且在块1412,可以基于该确定的差异产生运动向量112的最终阵列。例如,该逻辑可以针对不同的mip级别检测运动向量112的多个阵列上的异常,并且异常衰减可以被衰减(例如,减小到零)。使用输入帧104的不同mip级别来产生运动向量112的不同阵列的此示例在场景中存在大面积的重复图案(例如,壁纸)的情况下可能有所帮助,并且在gpu110的视频编码器可能另外产生大量高幅度运动向量的情况下,即使没有移动或动画对象,也认为由于相对于运动向量分辨率的重复图案的频率而存在大量运动。因此,当过程1400用于产生不同mip级别的运动向量112的阵列时,可以帮助检测重复图案的不同频率上的异常,并且当检测到异常时,可以使用衰减纹理来衰减(例如,清零)那些运动向量112。

作为如何使用过程1400的又一示例,考虑以不同分辨率获得多个阵列112(1)和112(2)的示例,并且在块1410通过将第一阵列112(1)中的单个运动向量与第二阵列112(2)中的多个对应运动向量进行比较(例如,与第二阵列112(2)中的多个对应运动向量在方向和/或幅度方面的平均值进行比较)来确定差异。使用不同分辨率的运动向量112的阵列可以产生差异,这对于在块1412产生最终的运动向量阵列是有用的。

图15是根据本文公开的实施方案的用于获得图像区域的不同部分的不同分辨率的多个运动向量阵列的示例性过程1500的流程图。为了论述目的,参考先前的图来描述过程1500。此外,如图3和图15中的离页引用“b”所示,过程1500可以表示在图3的块306处的操作之前执行的操作,并且在一些实施方案中,过程1500可以继续块306-314的操作。

在1502,显示系统的逻辑(例如,hmd100的逻辑)可以将与先前渲染的帧104相关联的像素数据108作为输入提供给gpu110。在块1502执行的操作可以类似于关于过程300的块302所描述的操作。

在1504,该逻辑可以从gpu110接收运动向量的第一阵列112(1),运动向量的第一阵列112(1)以第一分辨率被接收,或者以其他方式被上采样或下采样到第一分辨率。

在1506,该逻辑可以至少部分基于运动向量的第一阵列112(1)来检测跨越显示器的图像区域1505的第一部分1505(a)中不存在运动,并且可以至少部分基于运动向量的第一阵列112(1)来检测图像区域1505的第二部分1505(b)中对象106的运动。例如,可以在图像区域1505的右半部分中检测非零运动向量,而图像区域1505的左半部分可以包含零值运动向量,而没有任何非零运动向量。

在1508,逻辑可以将第一像素数据108(1)(与第一帧104(1)相关联)的第一部分和第二像素数据108(2)(与第二帧104(2)相关联)的第一部分作为输入提供给gpu110。第一像素数据108(1)的第一部分和第二像素数据108(2)的第一部分可以各自对应于图像区域1505的第一部分1505(a)(其中在块1506检测到不存在运动)。

在1510,逻辑可以从gpu110接收由gpu110的视频编码器至少部分基于第一像素数据108(1)的第一部分和第二像素数据108(2)的第一部分产生的运动向量的第二阵列112(2)。运动向量的该第二阵列112(2)可以以第二分辨率产生,该第二分辨率比运动向量的第一阵列112(1)的第一分辨率高。为检测到不存在运动的图像区域1505的第一部分1505(a)获得较高分辨率的运动向量场112(2)可以基于较高分辨率的运动向量场112(2)可以帮助检测图像区域1505的没有检测到大规模移动的第一部分1505(a)中的小规模移动的概念。

在1512,逻辑可以将第一像素数据108(1)(与第一帧104(1)相关联)的第二部分和第二像素数据108(2)(与第二帧104(2)相关联)的第二部分作为输入提供给gpu110。第一像素数据108(1)的第二部分和第二像素数据108(2)的第二部分可以各自对应于图像区域1505的第二部分1505(b)(其中在块1506检测到对象106的运动)。

在1514,逻辑可以从gpu110接收由gpu110的视频编码器至少部分基于第一像素数据108(1)的第二部分和第二像素数据108(2)的第二部分产生的运动向量的第三阵列112(3)。运动向量的该第三阵列112(3)可以以第三分辨率产生,该第三分辨率比运动向量的第二阵列112(2)的第二分辨率高。用于检测到运动的图像区域1005的第二部分1005(b)的该相对较低分辨率的运动向量场112(3)可以基于可能不需要较高分辨率的运动向量场来检测图像区域1505的第二部分1505(b)中的移动的概念,其中已经以第一运动向量场112(1)的第一分辨率检测到大规模移动。

在1516,该逻辑可以使用运动向量的第二阵列112(2)和运动向量的第三阵列112(2)用于进行运动平滑。过程1500可以从块1516继续到过程300的块306,其中基于来自块1516的运动向量112来修改重投影帧104(3)的像素数据108(3)。在示例中,在块1516使用多个运动向量阵列进行运动平滑可以包括参考过程1400的块1412描述的操作。

图16示出可以嵌入的根据本文公开的实施方案的hmd1600的示例性组件,诸如vr耳机。hmd1600可以与参考先前的图的hmd100相同或类似,且因此,图16中所示的hmd1600的组件可以实现在hmd100中。hmd1600可以被实现为由用户102穿戴(例如,在用户102头上)的独立装置。在一些实施方案中,hmd1600可以是头戴式的,诸如通过允许用户102使用紧固机构(例如,可调带)将hmd1600紧固在他/她的头上,该紧固机构的尺寸适于围绕用户102的头部。在一些实施方案中,hmd1600包括虚拟现实(vr)或增强现实(ar)耳机,该耳机包括近眼或近眼显示器。因而,术语“可穿戴装置”、“可穿戴电子装置”、“vr耳机”、“ar耳机”和“头戴式显示器(hmd)”在本文可以互换使用,以指代图16的装置1600。然而,应了解,这些类型的装置仅仅是hmd1600的示例,并且应了解,hmd1600可以以各种其他形状因素实现。

在所说明实现方式中,hmd1600包括一个或多个处理器1602和存储器1604(例如,计算机可读介质1604)。在一些实现方式中,处理器1602可以包括中央处理单元(cpu)、图形处理单元(gpu)110、cpu和gpu110两者、微处理器、数字信号处理器或此项技术中已知的其他处理单元或组件。可替代地或另外地,本文描述的功能可以至少部分由一个或多个硬件逻辑组件执行。例如,但不限于,可以使用的说明性类型的硬件逻辑组件包括现场可编程门阵列(fpga)、专用集成电路(asic)、应用程序特定标准产品(assp)、系统级芯片(soc)、复杂可编程逻辑装置(cpld)等。此外,每一处理器1602可以拥有其自己的本地存储器,本地存储器也可以存储程序模块、程序数据和/或一个或多个操作系统。

存储器1604可以包括以任何方法或技术实现的用于存储诸如计算机可读指令、数据结构、程序模块或其他数据的信息的易失性和非易失性存储器、可移除和不可移除介质。此类存储器包括但不限于ram、rom、eeprom、快闪存储器或其他存储器技术、cd-rom、数字通用光盘(dvd)或其他光学存储器、磁盒、磁带、磁盘存储器或其他磁性存储装置、raid存储系统、或可以用于存储所需信息并且可以由计算装置访问的任何其他介质。存储器1604可以被实现为计算机可读存储介质(“crsm”),该计算机可读存储介质可以是可由处理器1602访问以执行存储在存储器1602上的指令的任何可用物理介质。在一个基本实现方式中,crsm可以包括随机存取存储器(“ram”)和快闪存储器。在其他实现方式中,crsm可包括但不限于只读存储器(“rom”)、电可擦除可编程只读存储器(“eeprom”)或可以用于存储所需信息并可以由处理器1602访问的任何其他有形介质。

通常,hmd1600可以包括被配置成实现本文描述的技术、功能性和/或操作的逻辑(例如,软件、硬件和/或固件等)。计算机可读介质1604被示为包括各种模块,诸如指令、数据存储等,该模块可以被配置成在处理器1602上执行,以进行本文描述的技术、功能性和/或操作。几个示例性功能模块被示为存储在计算机可读介质1604中并且可在处理器1602上执行,尽管相同的功能性可以替代地以硬件、固件或作为系统级芯片(soc)和/或其他逻辑来实现。

为了其他模块的利益,操作系统模块1606可以被配置成管理hmd1600内的硬件并耦合到hmd。另外,在一些情况下,hmd1600可以包括存储在存储器1604中或者hmd1600可以以其他方式访问的一个或多个应用程序1608。在此实现方式中,应用程序1608包括游戏应用程序1610。然而,hmd1600可以包括任何数量或类型的应用程序,并且并不限于此处展示的具体示例。游戏应用程序1610可以被配置成起始可由用户102玩的基于视频的交互式游戏(例如,vr游戏)的玩游戏,并且输出要在hmd1600的显示面板上渲染的帧(例如,实际帧104)。合成器1611与hmd1600的其他逻辑组合,可以被配置成执行本文描述的运动平滑技术,以渲染运动平滑的重投影帧104。

通常,hmd1600具有输入装置1612和输出装置1614。输入装置1612可以包括控制按钮。在一些实现方式中,一个或多个麦克风可以充当输入装置1612以接收音频输入,诸如用户语音输入。在一些实现方式中,一个或多个相机或其他类型的传感器(例如,惯性测量单元(imu))可以充当输入装置1612以接收姿态输入,例如用户102的手和/或头部运动。在一些实施方案中,可以以键盘、小键盘、鼠标、触摸屏、操纵杆等形式提供附加的输入装置1612。在其他实施方案中,hmd1600可以省略键盘、小键盘或其他类似形式的机械输入。相反,hmd1600可以实现为相对简单形式的输入装置1612、网络接口(无线或基于有线的)、电源和处理/存储能力。例如,可以采用一个或多个输入组件的有限集合(例如,起始配置、通电/断电等的专用按钮),以便此后可以使用hmd1600。在一个实现方式中,输入装置1612可以包括控制机构,诸如用于增加/减小音量的基本容量控制按钮以及电源和复位按钮。

输出装置1614可以包括显示器1616,显示器可以包括一个或多个显示面板(例如,一对立体显示面板)。输出装置1614可以还包括但不限于发光元件(例如,led)、创建触觉的振动器、扬声器(例如,头戴式耳机)和/或类似物。也可以有简单的发光元件(例如,led)来指示状态,诸如,当电源接通时。

hmd1600可以还包括耦合到天线1620的无线单元1618,以便于无线连接到网络。无线单元1618可以实现各种无线技术中的一者或多者,诸如wi-fi、蓝牙、射频(rf)等等。应了解,hmd1600可以还包括物理端口,以便于有线连接到网络、连接的外围装置(包括pc、游戏控制台等)、或者与其他无线网络通信的插电式网络装置。

hmd1600可以还包括光学子系统1622,该光学子系统使用一个或多个光学元件将来自电子显示器1616的光引导到用户的眼睛。光学子系统1622可以包括不同光学元件的各种类型和组合,包括但不限于诸如光圈、透镜(例如,菲涅耳透镜、凸透镜、凹透镜等)、滤波器等等。在一些实施方案中,光学子系统1622中的一个或多个光学元件可以具有一个或多个涂层,诸如抗反射涂层。光学子系统1622对图像光的放大允许电子显示器1616在物理上比较大的显示器更小、重量更轻并且消耗更少的功率。另外,图像光的放大可以增大显示内容(例如,图像)的视野(fov)。例如,所显示内容的fov使得所显示内容是使用用户的fov的几乎全部(例如,120-150度对角线)并且在一些情况下全部来呈现的。ar应用程序可以具有更窄的fov(例如,大约40度fov)。光学子系统1622可以被设计成校正一个或多个光学误差,诸如但不限于桶形失真、枕形失真、纵向色像差、横向色像差、球面像差、彗形像差、场曲率、散光等等。在一些实施方案中,提供给电子显示器1616用于显示的内容是预失真的,并且光学子系统1622在从基于内容产生的电子显示器1616接收图像光时校正该失真。

hmd1600可以还包括一个或多个传感器1624,诸如用以产生运动、位置和定向数据的传感器。这些传感器1624可以是或包括陀螺仪、加速度计、磁力计、摄像机、颜色传感器或其他运动、位置和定向传感器。传感器1624还可以包括传感器的子部分,诸如一系列主动或被动标记,其可以由相机或颜色传感器从外部查看,以便产生运动、位置和定向数据。例如,vr耳机可以在其外部包括多个标记,诸如反射器或灯(例如,红外线或可见光),当被外部相机查看或被光(例如,红外线或可见光)照亮时,这些标记可以提供一个或多个参考点供软件解释,以便产生运动、位置和定向数据。hmd1600可以包括对由hmd1600环境中的基站投射或广播的光(例如,红外线或可见光)敏感的光传感器。

在示例中,传感器1624可以包括惯性测量单元(imu)1626。imu1126可以是基于从加速度计、陀螺仪、磁力计和/或其他适于检测运动、校正与imu1626相关联的误差或其某种组合的传感器接收的测量信号来产生校准数据的电子装置。基于测量信号,此类基于运动的传感器(诸如imu1626)可以产生指示hmd1600相对于hmd1600的初始位置的估计位置的校准数据。例如,多个加速度计可以测量平移运动(向前/向后、向上/向下、向左/向右),并且多个陀螺仪可以测量旋转运动(例如,俯仰、偏航和滚动)。例如,imu1626可以快速地采样测量信号,并根据采样数据计算hmd1600的估计位置。例如,imu1626可随时间对从加速度计接收的测量信号进行积分以估计速率向量,并随时间对速率向量进行积分以确定参考点在hmd1600上的估计位置。参考点是可以用来描述hmd1600的位置的点。虽然参考点通常可以被定义为空间中的点,但是在各种实施方案中,参考点被定义为hmd1600内的点(例如,imu1626的中心)。可替代地,imu1626将采样的测量信号提供给外部控制台(或其他计算装置),从而确定校准数据。

传感器1624可以以相对较高的频率操作,以便以高速率提供传感器数据。例如,传感器数据可以以1000hz的速率产生(或者每1毫秒产生1个传感器读数)。以此方式,每秒获取一千个读数。当传感器以这种速率(或更高的速率)产生如此多的数据时,用于预测运动的数据集相当大,甚至在大约几十毫秒的相对短的时间段内也是如此。

如所提及,在一些实施方案中,传感器1624可以包括对hmd1600环境中的基站发射的光敏感的光传感器,用于跟踪hmd1600在3d空间中的位置和/或定向、姿势等。位置和/或定向的计算可以基于光脉冲的定时特性和存在或不存在由传感器1624检测到的光。

hmd1600可以还包括眼睛跟踪模块1628。hmd1600内部的相机或其他光学传感器可以捕捉用户眼睛的图像信息,并且眼睛跟踪模块1628可以使用捕捉的信息来确定瞳孔间距离、眼间距离、每只眼睛相对于hmd1600的三维(3d)位置(例如,为了失真调整的目的),包括每只眼睛的扭转和旋转(即,滚动、俯仰和偏航)的幅度以及注视方向。在一个示例中,红外光在hmd1600内发射,并从每只眼睛反射。反射光被hmd1600的相机接收或检测,并被分析以从每只眼睛反射的红外光的变化中提取眼睛旋转。眼睛跟踪模块1628可以使用许多用于跟踪用户102的眼睛的方法。因此,眼睛跟踪模块1628可以跟踪每只眼睛的多达六个自由度(即,3d位置、滚动、俯仰和偏航),并且可以组合来自用户102的两只眼睛的跟踪量的至少一个子集来估计注视点(即,用户正在看的虚拟场景中的3d定位或位置)。例如,眼睛跟踪模块1628可以集成来自过去测量的信息、识别用户102头部位置的测量以及描述由电子显示器1616呈现的场景的3d信息。因此,使用用于用户102的眼睛的位置和定向的信息来确定用户102正在看的由hmd1600呈现的虚拟场景中的注视点。

hmd1600可以还包括头部跟踪模块1630。如上所述,头部跟踪模块1630可以利用一个或多个传感器1624来跟踪用户102的头部运动,包括头部旋转。例如,头部跟踪模块1630可以跟踪hmd1600的多达六个自由度(即,3d位置、滚动、俯仰和偏航)。这些计算可以在一系列帧104的每个帧104进行,使得应用程序1608可以根据头部位置和定向来确定如何在下一帧104(甚至重投影帧104)中渲染场景。在一些实施方案中,头部跟踪模块1630被配置成基于当前和/或过去数据来预测hmd1600的未来位置和/或定向。这是因为应用程序被要求在用户102实际看到显示器1616上的光(并因此看到图像)之前渲染帧104。因此,下一帧104可以基于在更早的时间点,诸如在渲染帧104之前大约25-30毫秒(ms)进行的头部位置和/或定向的未来预测来渲染。由头部跟踪模块1630提供的旋转数据可以用于以任何合适的测量单位确定hmd1600旋转的方向和hmd1600旋转的量。例如,旋转方向可以被简化,并按照对应于左、右、上和下的正或负水平方向和正或负垂直方向输出。旋转量可以是角度、弧度等。可以计算角速度来确定hmd1600的旋转速率。

尽管已经用专用于结构特征的语言对主题进行了描述,但是应理解,所附权利要求中定义的主题不必限于所描述的具体特征。相反,具体特征被公开为实现权利要求的说明性形式。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1