CN104904201A - 基于着色器的图形内容的观看定向的立体转换 - Google Patents

基于着色器的图形内容的观看定向的立体转换 Download PDF

Info

Publication number
CN104904201A
CN104904201A CN201380069877.XA CN201380069877A CN104904201A CN 104904201 A CN104904201 A CN 104904201A CN 201380069877 A CN201380069877 A CN 201380069877A CN 104904201 A CN104904201 A CN 104904201A
Authority
CN
China
Prior art keywords
instruction
image
vertex shader
viewing angle
processor
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.)
Granted
Application number
CN201380069877.XA
Other languages
English (en)
Other versions
CN104904201B (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.)
Qualcomm Inc
Original Assignee
Qualcomm Inc
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 Qualcomm Inc filed Critical Qualcomm Inc
Publication of CN104904201A publication Critical patent/CN104904201A/zh
Application granted granted Critical
Publication of CN104904201B publication Critical patent/CN104904201B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04NPICTORIAL COMMUNICATION, e.g. TELEVISION
    • H04N13/00Stereoscopic video systems; Multi-view video systems; Details thereof
    • H04N13/20Image signal generators
    • H04N13/275Image signal generators from 3D object models, e.g. computer-generated stereoscopic image signals
    • H04N13/279Image signal generators from 3D object models, e.g. computer-generated stereoscopic image signals the virtual viewpoint locations being selected by the viewers or determined by tracking
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T15/003D [Three Dimensional] image rendering
    • G06T15/005General purpose rendering architectures

Landscapes

  • Engineering & Computer Science (AREA)
  • Computer Graphics (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Theoretical Computer Science (AREA)
  • Multimedia (AREA)
  • Signal Processing (AREA)
  • Controls And Circuits For Display Device (AREA)
  • Testing, Inspecting, Measuring Of Stereoscopic Televisions And Televisions (AREA)
  • Processing Or Creating Images (AREA)
  • Image Generation (AREA)

Abstract

本发明的实例技术是针对从经设计以产生单视图的应用程序产生立体视图。举例来说,所述技术可基于观看角度修改用于顶点着色器的指令。当执行所述经修改顶点着色器时,所述经修改顶点着色器可基于所述观看角度产生立体视图的顶点的坐标。

Description

基于着色器的图形内容的观看定向的立体转换
技术领域
本发明涉及图形数据处理,且更具体地说,涉及用于立体视图的图形数据处理。
背景技术
立体视图指代表现为涵盖3维(3D)体积的所感知图像。为了产生立体视图,装置在显示器的2维(2D)区域上显示两个图像。这两个图像包含大体上类似的内容,但沿着所述两个图像中的一或多个对应像素的水平轴线具有稍微的位移。在2D区域上这两个图像的同时观看致使观看者感知到被弹出或推入正显示所述两个图像的2D显示的图像。以此方式,虽然所述两个图像显示于显示器的2D区域上,但观看者感知到表现为涵盖3D体积的图像。
立体视图的所述两个图像分别称为左眼图像和右眼图像。左眼图像可由观看者的左眼观看,且右眼图像不可由观看者的左眼观看。类似地,右眼图像可由观看者的右眼观看,且左眼图像不可由观看者的右眼观看。举例来说,观看者可佩戴专用眼镜,其中所述眼镜的左镜片阻挡右眼图像且通过左眼图像,且所述眼镜的右镜片阻挡左眼图像且通过右眼图像。
因为左眼和右眼图像包含沿着水平轴线具有稍微位移的大体上类似的内容,但不可由观看者的双眼同时观看(例如,由于所述专用眼镜),所以观看者的大脑通过混合所述两个图像来解析对应像素之间的稍微位移。所述混合致使观看者将所述两个图像感知为具有3D体积的图像。
发明内容
一般来说,本发明的技术是针对修改产生单视图的指令以致使图形处理单元(GPU)产生立体视图。GPU的着色器程序可经设计以产生单视图。本发明中描述的技术至少基于观看角度修改此着色器程序的指令以产生立体视图。举例来说,所述技术修改着色器程序的指令以针对立体视图的视图中的一者沿一个方向移位像素的位置,且针对立体视图的另一视图沿另一方向移位所述像素的位置。经修改着色器程序使像素的位置移位的方向是基于观看角度。
在一个实例中,本发明描述用于图形处理的方法。所述方法包含:以处理器确定相对于显示器的观看角度;以所述处理器接收用于经配置以对单视图的图像操作的顶点着色器的指令;以及以所述处理器基于所述观看角度将用于所述顶点着色器的所述指令修改为包含一或多个指令以产生经修改顶点着色器。在此实例中,所述经修改顶点着色器当经执行时产生立体视图的顶点的顶点坐标。所述方法还包含以所述处理器指示图形处理单元(GPU)执行所述经修改顶点着色器。
在一个实例中,本发明描述一种设备。所述设备包含图形处理单元(GPU)和处理器。所述处理器经配置以确定相对于显示器的观看角度,且基于所述观看角度将用于顶点着色器的指令修改为包含一或多个指令以产生经修改顶点着色器。在此实例中,所述经修改顶点着色器当经执行时产生立体视图的顶点的顶点坐标。所述处理器还经配置以指示所述GPU执行所述经修改顶点着色器。
在一个实例中,本发明描述一种处理器。所述处理器经配置以确定相对于显示器的观看角度,接收用于经配置以对单视图的图像操作的顶点着色器的指令,以及基于所述观看角度将用于所述顶点着色器的所述指令修改为包含一或多个指令以产生经修改顶点着色器。在此实例中,所述经修改顶点着色器当经执行时产生立体视图的顶点的顶点坐标。所述处理器还经配置以指示图形处理单元GPU执行所述经修改顶点着色器。
在一个实例中,本发明描述一种设备,其包含:图形处理单元(GPU);用于确定相对于显示器的观看角度的装置;用于接收用于经配置以对单视图的图像操作的顶点着色器的指令的装置;以及用于基于所述观看角度将用于所述顶点着色器的所述指令修改为包含一或多个指令以产生经修改顶点着色器的装置。在此实例中,所述经修改顶点着色器当经执行时产生立体视图的顶点的顶点坐标。所述设备还包含用于指示所述GPU执行所述经修改顶点着色器的装置。
在一个实例中,本发明描述一种其上存储有指令的计算机可读存储媒体,所述指令在被执行时致使一或多个处理器:确定相对于显示器的观看角度;接收用于经配置以对单视图的图像操作的顶点着色器的指令;以及基于所述观看角度将用于所述顶点着色器的所述指令修改为包含一或多个指令以产生经修改顶点着色器。在此实例中,所述经修改顶点着色器当经执行时产生立体视图的顶点的顶点坐标。所述指令进一步致使所述一或多个处理器指示图形处理单元(GPU)执行所述经修改顶点着色器。
在随附图式及以下描述中阐述本发明的一或多个方面的细节。本发明的其它特征、目标和优点将从所述描述和图式以及权利要求书而显而易见。
附图说明
图1是说明根据本发明中所描述的一或多个实例的显示立体视图的显示器的概念图。
图2是说明不同观看角度的概念图。
图3是说明观看者的眼睛和头定向的检测的概念图。
图4是说明观看角度的实例的概念图。
图5是说明可实施本发明中描述的一或多个实例技术的装置的实例的框图。
图6是说明零视差平面的位置的概念图。
图7是说明根据本发明中描述的一或多个实例技术的左眼图像与右眼图像之间的水平视差的概念图。
图8是说明可实施本发明中描述的一或多个实例技术的图形处理单元(GPU)的实例的框图。
图9是说明可实施本发明中描述的一或多个实例技术的图形处理单元(GPU)的另一实例的框图。
图10A-10C是说明根据本发明中描述的一或多种技术的实例结果的概念图。
图11是进一步详细说明图5的实例装置的框图。
图12是说明根据本发明中所描述的一或多个实例技术的实例操作的流程图。
具体实施方式
本发明中描述的实例技术是针对在执行或运行时间期间再现立体3维(S3D)图形。举例来说,应用程序可产生将由用于显示的图形处理单元(GPU)再现的单视图图像。本发明中描述的技术可在应用程序的执行期间(即,在运行时间期间)将单视图图像转换为立体视图图像。
在一些实例中,所述技术可再现S3D图形而不需要对产生图形的应用程序或GPU的任何修改。在一些实例中,本发明中描述的技术可由应用程序处理器实施,所述应用程序处理器执行到图形驱动器的包装器。到图形驱动器的包装器可视为根据本发明中描述的技术修改对先前产生的图形驱动器的输入或修改先前产生的图形驱动器的输出的程序。以此方式,本发明中描述的技术可提供GPU来产生S3D图形而不需要修改在应用程序处理器上执行的图形驱动器。然而,产生新图形驱动器或修改先前产生的图形驱动器以使得应用程序处理器响应于图形驱动器的执行而实施本发明中描述的实例技术可为可能的。出于说明的目的,将所述技术描述为由执行图形驱动器包装器的应用程序处理器执行。
从应用程序的角度,执行应用程序的应用程序处理器可输出用于GPU的常规3D图形再现的应用程序的图形数据和命令。在应用程序处理器上执行的图形驱动器包装器可修改所述命令以及由GPU执行的指令以使得GPU在S3D显示器上再现S3D图形。在本发明中,术语“命令”和“指令”可互换地使用。以此方式,GPU可再现S3D图形而无需对产生图形的应用程序或GPU的任何改变。因此,本发明中描述的技术可允许观看者体验由未经设计以产生S3D图形的应用程序产生的图像内容的S3D图形。
此外,本发明中描述的技术可考虑观看角度(即,观看者观看显示器所处的角度)以确定应用程序处理器经由图形驱动器包装器修改由GPU执行的指令的方式。通过考虑观看角度,即使显示器倾斜或观看者的头倾斜,观看者也可体验高质量S3D图形。
在常规3D图形再现中,GPU从单个视点(例如,单视图)产生3D图形。此单个视点可意味着可由观看者的右眼和左眼观看的单个图像。S3D图形不同于3D图形之处在于S3D图形产生立体视图。术语立体视图指代从双眼视点产生的图像。在双眼视点中,可存在两个图像,其中一个图像可由一只眼睛观看且不可由另一只眼睛观看,且反之亦然。举例来说,当观看者佩戴专用眼镜时,通过眼镜的左镜片进入的光可由左眼观看且不可由右眼观看,且反之亦然。双眼视点可被称为立体视图。
举例来说,在S3D图形中,GPU可产生用于左眼的图像和用于右眼的另一图像(即,立体视图)。左眼图像被阻挡于观看者的右眼且仅被引导到左眼。右眼图像被阻挡于观看者的左眼且仅被引导到右眼。术语立体视图指代各自显示于显示器上的两个图像(例如,左眼图像和右眼图像),而单视图指代显示于显示器上的单个图像。左眼图像和右眼图像的组合可对观看者表现为如同所述图像是弹出或推入正显示所述图像的显示器。这可导致更实际且丰富的观看体验。
在本发明中,S3D图像(例如,立体视图)和3D图像(例如,单视图)的概念不应混淆。3D图像是被限制于显示器的2维(2D)区域的图像。举例来说,在3D图形处理中,应用程序界定3D基元,其中所述基元形成应用程序内容的各种对象。这些对象形成被限制于显示器的2D区域的单个图像(例如,单视图)。
举例来说,3D图像内的对象可表现为与3D图像内的其它对象相比更远离或更接近。然而,所有这些对象限于显示器的2D区域。S3D图像是由组合右眼和左眼图像的观看者的大脑产生的感知图像。所得图像(即,S3D图像)表现为不限制于显示器的2D区域。而是,S3D图像表现为涵盖3D体积,其中所述图像表现为弹出或推入显示器。举例来说,S3D图像内的对象表现为与3D体积内的其它对象相比更远离或更接近,而不是像3D图像的情况那样在2D区域内。
换句话说,3D图形处理指代产生表现为被限制于显示器的2D区域的3D图像(例如,通过由应用程序定义的3D基元)。此3D图像称为单视图。S3D指代用于立体视图的创建的再现而不是单视图。在立体视图中,右眼和左眼图像被限制于2D显示器;然而,当观看者观看立体视图时,所述图像表现为涵盖3D体积。
一起形成S3D图像的右眼和左眼图像可为3D图像。是观看者的大脑致使观看者在大脑组合3D右眼图像和3D左眼图像时感知到S3D图像。举例来说,当观看者同时观看右眼和左眼图像时,观看者可基于人的双眼视觉感知场景的深度。右眼图像和左眼图像的内容可大体类似于单个3D图像的内容。
为了高质量立体效果,左眼图像与右眼图像之间可仅存在水平视差。举例来说,左眼图像中的对象的位置和右眼图像中的所述对象的位置可不同。然而,差异可仅在水平方向上,且不在垂直方向上。是对象之间的水平视差致使观看者的双眼视觉组合左眼图像和右眼图像以使得对象表现为弹出或推入显示器。对象之间的任何垂直视差可削弱S3D效果。
本发明中描述的技术,执行图形驱动器或图形驱动器包装器的应用程序处理器可将致使GPU产生用于单视图的图形内容的指令修改为致使GPU产生用于立体视图的图形内容的指令。换句话说,在修改之前,指令可致使GPU产生单个3D图像。在修改之后,指令可致使GPU产生立体视图的两个3D图像(例如,3D左眼图像和3D右眼图像)。
应注意虽然本发明中描述的技术大体上是针对3D图像所揭示,但本发明的方面不限于此。本发明的技术还可延伸到2D图形。举例来说,单视图的单个图像可为2D图像,且本发明的技术可修改指令以致使GPU产生用于立体视图的两个2D图像。在此情况下,观看者将感知到弹出或推入正显示用于立体视图的两个图像的显示器的单个图像。为避免混淆,下文描述的技术涉及用于单视图的单个图像以及用于立体视图的左眼和右眼图像,应了解这些图像可为3D图像或2D图像。
本发明中描述的实例技术,应用程序处理器经由图形驱动器或图形驱动器包装器可修改由待由GPU执行的应用程序发出的指令以及待由GPU执行的顶点着色器程序的指令。举例来说,应用程序处理器可执行应用程序。应用程序可能已经设计以产生单个图像(例如,单视图),且可将所述单个图像的图形内容产生为多个基元。另外,应用程序可确定基元的每一顶点的像素值,例如颜色、透明度和坐标值。
在应用程序的执行期间(例如,在运行时间中),应用程序经由应用程序处理器发出命令以检索顶点着色器程序的指令。顶点着色器程序当经执行时的输出可为由应用程序为单个图像(例如,单视图)产生的基元的顶点的裁剪坐标。实例技术可修改顶点着色器程序的指令来产生用于左眼图像和右眼图像(例如,立体视图)的基元的顶点的裁剪坐标。用于左眼图像和右眼图像的基元的顶点的裁剪坐标可基于观看角度。
观看角度指代在应用程序的执行期间观看者正观看左眼和右眼图像正显示于其上的显示器的角度(即,观看者相对于显示器的观看定向)。可存在确定观看角度的许多不同方式。本发明中描述的技术不限于确定观看角度的任何特定方式。
并且,在应用程序的执行期间,应用程序经由应用程序处理器发出绘制指令到GPU以指示GPU绘制单个图像内的基元中的一或多者。举例来说,在本发明的技术中,在应用程序处理器上执行的应用程序如同GPU即将产生用于单个图像的图形内容那样输出指令。本文所描述的技术修改由应用程序发出的指令(例如绘制指令)来产生用于左眼和右眼图像的图形内容。以此方式,从应用程序的角度来看不存在对指令的修改。
举例来说,应用程序处理器经由图形驱动器包装器监视由应用程序发出的指令。当应用程序发出绘制指令时,图形驱动器包装器俘获此绘制指令且发出两个绘制指令,其中一个指令是基于观看角度产生用于左眼图像的图形内容且一个指令是基于观看角度产生用于右眼图像的图形内容。
观看角度可不保持恒定。举例来说,在应用程序的执行期间,观看者可倾斜装置,可倾斜他或她的头,或这两种情况。为了考虑观看角度的改变的可能性,应用程序处理器可周期性地确定观看角度。作为一个实例,在GPU输出左眼图像和右眼图像的一个组合之后,所述技术可确定观看角度。在此实例中,图形驱动器包装器可修改顶点着色器的指令以考虑由GPU再现的左眼图像和右眼图像的下一组合的观看角度的改变。或者,处理器可连续地确定观看角度,且图形驱动器包装器可利用当前观看角度来确定修改顶点着色器的指令的方式。
如上文所描述,图形驱动器包装器可修改顶点着色器的指令以产生用于左眼图像和右眼图像两者的基元的顶点。举例来说,所述技术可致使经修改顶点着色器执行两次。在第一执行实例中,经修改顶点着色器可基于观看角度在第一方向上使顶点的裁剪坐标移位,且在第二执行实例中,经修改顶点着色器可基于观看角度在第二方向上使顶点的裁剪坐标移位。GPU可处理在第一方向上移位的顶点以再现左眼图像,且可处理在第二方向上移位的顶点以再现右眼图像。
然而,在第一方向上使所有裁剪坐标移位且随后在第二方向上使所有裁剪坐标移位可得到立体视图,其中由应用程序产生的单个图像的所有对象表现为弹出或推入正在显示左眼图像和右眼图像的显示器。举例来说,由应用程序产生的基元可形成不同对象。通过在第一方向上使所有基元的裁剪坐标移位来产生左眼图像,且在第二方向上使所有基元的裁剪坐标移位来产生右眼图像,所有对象可表现为弹出或推入显示器。
此结果对于人双眼视觉可能不是理想的。举例来说,观看者可能希望一些对象比其它对象弹出更多。作为另一实例,即使所有对象弹出或推入显示器达相同量,观看者也可能希望控制所述对象弹出或推入显示器的量。
如更详细地描述,应用程序处理器经由图形驱动器包装器还可修改顶点着色器的指令以使得一些对象比其它对象弹出或推入显示器更多。在一些实例中,除修改顶点着色器的指令以允许一些对象比其它对象弹出或推入显示器更多之外或替代于修改顶点着色器的指令以允许一些对象比其它对象弹出或推入显示器更多,应用程序处理器经由图形驱动器包装器可修改增加或减小左眼图像与右眼图像之间的水平视差的指令。以此方式,观看者可能够控制立体视图弹出或推入显示器的量。
图1是说明根据本发明中所描述的一或多个实例的显示立体视图的显示器的概念图。图1说明装置10。装置10的实例包含(但不限于)移动无线电话、个人数字助理(PDA)、包含视频显示器的视频游戏控制台、移动视频会议单元、膝上型计算机、桌上型计算机、电视机机顶盒、数字媒体播放器、平板计算装置、智能电话及类似物。装置10包含显示器12。显示器12的实例包含(但不限于)液晶显示器(LCD)、有机发光二极管显示器(OLED)、阴极射线管(CRT)显示器、等离子显示器、极化显示器或另一种类型的显示装置。显示器12可为经配置以显示立体视图(例如,左眼图像和右眼图像)的任何类型的显示器。
如所示,显示器12显示3D图像14A和3D图像14B。图1将图像14A说明为实线框,且将图像14B说明为虚线框。图像14A和图像14B可各自为3D图像。举例来说,如果个别地观看图像14A和14B中的每一者,那么图像14A和14B将不会表现为弹出或推入显示器12(例如,表现为如同单视图)。
然而,当一起观看图像14A和图像14B时,图像14A和图像14B一起形成立体视图。举例来说,图像14A和图像14B可包含相似图像内容,但在显示器12上移位。由观看者佩戴的专用眼镜可阻挡观看者的右眼看到图像14A,且允许观看者的左眼看见图像14B。所述专用眼镜还可阻挡观看者的左眼看到图像14B,且允许观看者的右眼看见图像14A。当观看者一起观看图像14A和14B时,图像14A与14B之间的水平视差可导致观看者感知到S3D图像(即,表现为在显示器12后方或显示器12前方且包含3D体积的图像)。换句话说,图像14A是立体视图的左眼图像,且图像14B是立体视图的右眼图像。
在装置10的处理器上执行的应用程序可产生单个图像(例如,单视图)。举例来说,执行应用程序的处理器可将单个图像的图像内容产生为多个基元。此单个图像的图像内容可类似于图像14A和图像14B的图像内容。另外,执行应用程序的处理器可确定基元的每一顶点的像素值,例如颜色、透明度和坐标值。基元的像素值可被称为图像数据。执行应用程序的处理器可将图像数据和指令输出到装置10的图形处理单元(GPU),指示所述GPU再现单个图像。
根据本发明中描述的技术,处理器可将命令俘获到GPU,其命令GPU再现单个图像。举例来说,处理器可执行图形驱动器或图形驱动器包装器,且处理器可经由所述图形驱动器或图形驱动器包装器将命令俘获到GPU以再现单个图像。出于说明的目的,将所述技术描述为由执行图形驱动器包装器的处理器执行。一般来说,为易于描述,所述技术描述执行各种功能的图形驱动器包装器。然而,应理解处理器是经由图形驱动器包装器的执行实施所述技术。
举例来说,图形驱动器包装器可为在处理器上执行的程序。图形驱动器包装器可修改图形驱动器接收的指令或图形驱动器输出的指令以使得经修改指令致使GPU再现立体视图。因此,本发明中描述的技术可不需要对图形驱动器的任何修改。而是,处理器可执行图形驱动器包装器且执行先前开发的图形驱动器。然而,修改现有图形驱动器或产生新图形驱动器以实施本发明中描述的技术可为可能的。
执行图形驱动器包装器的处理器可修改由处理器发出的命令且致使GPU再现形成立体视图的两个图像(例如,图像14A和图像14B)。另外,执行图形驱动器包装器的处理器可修改在GPU上执行的着色器程序(例如,顶点着色器)的指令。举例来说,图形驱动器包装器可修改顶点着色器的指令以使得经修改顶点着色器当在GPU上经执行时使由在处理器上执行的应用程序产生的单个图像中的像素的位置移位。图形驱动器包装器可致使GPU执行经修改顶点着色器两次。在经修改顶点着色器的第一执行中,经修改顶点着色器在一个方向上使单个图像中的像素的位置移位。在经修改顶点着色器的第二执行中,经修改顶点着色器在第二执行中在另一方向上使单个图像中的像素的位置移位。图像14A可为从顶点着色器在一个方向上使单个图像的像素移位而得到的图像。图像14B可为从顶点着色器在另一方向上使单个图像的像素移位而得到的图像。
在修改顶点着色器的指令中,执行图形驱动器包装器的处理器可考虑观看角度。观看角度是观看者观看显示器12所处的角度。举例来说,在图1中,显示器12可以认为是在横向模式中。如果观看者笔直向前观看显示器12(即,观看者未倾斜他或她的头),那么观看角度可以认为是0。然而,如果观看者倾斜装置10或倾斜他或她的头,那么观看角度可不再为0。举例来说,如果观看者将装置10旋转为处于纵向模式(例如,将装置10倾斜90°),那么观看角度可为90°。
应理解观看角度在横向模式中为0且在纵向模式中为90°是出于说明的目的而提供且不应被视为具限制性。本发明中描述的技术也适用于其中观看角度在纵向模式中是0且在横向模式中是90°的情形或横向与纵向模式之间的任何模式。
一般来说,装置10的处理器可确定观看角度,且处理器经由在处理器上执行的图形驱动器包装器可基于观看角度而修改由应用程序输出到GPU的指令和在GPU上执行的着色器程序的指令。图形驱动器包装器可修改所述指令以使得GPU再现形成立体视图的两个图像而不是形成单视图的单个图像。
图2是说明不同观看角度的概念图。出于说明的目的,图2说明观看者可倾斜装置10的不同角度。然而,本发明中描述的技术也可以扩展到其中观看者并不倾斜装置10而是倾斜他或她的头或两者的组合的实例。
大多数立体3D显示器必须与装置定向上的约束一起使用。举例来说,多数全部3D电视是在横向模式中观看。这对于经设置用于在水平表面上使用(TV机柜、桌面等)的许多装置是合理的。然而,对于例如电话和平板计算机等手持式装置,观看者可在横向或纵向模式中或甚至以任何角定向观看显示器。
举例来说,在位置18A中,装置10处于横向模式。为易于描述,图2说明定向点16,当装置10处于横向模式时其定位于装置10的右上角处。观看者可将装置10倾斜45°(即,从位置18A到位置18B)。在此情况下,图2说明在位置18B的定向点16相对于在位置18A的定向点在右下方向上移动。在此实例中,观看角度可视为45°。
作为另一实例,观看者可将装置10倾斜-45°(即,从位置18A到位置18C)。在此情况下,图2说明在位置18C的定向点16相对于在位置18A的定向点在左上方向上移动。在此实例中,观看角度可视为-45°。因为观看者可将装置10倾斜任何量,所以观看角度可从-180°到180°变动。
举例来说,横向和纵向是两个典型显示模式(例如,观看者将装置10从横向更多地旋转到纵向模式,或反之亦然)。在这些情况下,装置10可确定装置10是否处于横向模式或纵向模式,且处理器经由图形驱动器包装器可修改指令以致使GPU再现用于横向模式或纵向模式的左眼图像和右眼图像。然而,观看者可将装置10定向在任何角度,且不仅是在横向模式或纵向模式中。因此,处理器可考虑观看角度以确定修改在GPU上执行的指令的方式。
可存在确定观看角度的各种方式。举例来说,装置10可包含装置10用来确定是否从横向模式切换到纵向模式的加速度计。装置10还可包含加速度计的单轴或多轴模型以检测恰当加速度的量值和方向。此加速度计可基于重量改变的方向而输出定向。装置10的处理器可基于输出定向确定观看角度。
作为另一实例,装置10可包含陀螺仪。陀螺仪可基于角度动量守恒的原理提供定向的测量。装置10的处理器可基于由陀螺仪提供的定向的测量而确定观看角度。基于其它操作原理的陀螺仪也存在,例如在消费者电子装置中使用的电子微芯片封装MEMS陀螺仪装置。陀螺仪可提供比加速度计更准确的3D空间内的移动辨识。
加速度计或陀螺仪的输出可允许处理器确定观看角度的合理的估计。然而,观看角度的估计可基于观看者以例如垂直(例如,观看者并不倾斜他或她的头)等特定方式定向的假设。换句话说,加速度计或陀螺仪可提供显示器定向的准确测量,其可足以确定观看角度的合理的估计但不可提供观看者定向的准确测量。
在一些实例中,装置10的处理器确定观看者的定向(例如,观看者是否垂直定向,或观看者是否倾斜他或她的头)可为可能的。举例来说,显示器12或装置10可包含内建式面向前方的相机。通过面向前方的相机,相机处理器可检测观看者的眼睛或观看者相对于显示器12的头定向。装置10的处理器可基于如由相机处理器检测的所检测的眼睛或头定向而确定观看角度。
除正常光学相机以外,其它传感器也可经配置以检测观看者的眼睛或头定向。一般来说,本发明中描述的技术可利用任何技术来确定观看角度,包含不必依赖于检测用户的眼睛或头的技术。本发明中描述的技术不应被视为限于上文描述的用于确定观看角度的实例。
举例来说,本发明中描述的技术可仅基于加速度计和/或陀螺仪的输出确定观看角度。作为另一实例,本发明中描述的技术可仅基于所检测的用户的眼睛或头而确定观看角度。作为另一实例,本发明中描述的技术可基于加速度计和/或陀螺仪的输出且基于所检测的用户的眼睛或头而确定观看角度。作为另一实例,所述技术可基于加速度计和/或陀螺仪的输出且基于经配置以确定用户的观看定向的一或多个其它传感器而确定观看角度。上文的任何排列和组合以及任何其它技术可用以确定观看角度。
图3是说明观看者的眼睛和头定向的检测的概念图。在图3中,装置10的显示器12显示由装置10的相机俘获的面。应理解显示器12并不需要显示由相机俘获的图像以确定观看角度,且图3为便于图示而说明显示器12显示由相机俘获的面。
如图3中所示,装置10处于横向模式;然而,观看者的头倾斜。在此情况下,装置10的相机处理器可检测眼睛20A和20B的定向,且将眼睛20A和20B的定向发射到装置10的处理器。基于眼睛20A和20B的定向,装置10的处理器可确定观看角度。根据本发明中描述的技术,图形驱动器包装器可基于所确定的观看角度修改在GPU上执行的指令。
图4是说明观看角度的实例的概念图。在图4中,观看角度标记为阿尔法(α)。观看角度是观看者的观看定向与显示器的定向之间的关系。举例来说,α是由眼睛的水平方向和显示器的水平方向形成的角度的测量。显示器的水平方向指代相对于显示器的定向的水平平面,且眼睛的水平方向指代相对于观看者的眼睛20A和20B的定向的水平平面。在图4中,观看者笔直观看显示器12(例如,不存在观看者的头的倾斜)。因此,眼睛的水平方向是水平直线。在图4中,装置10以一角度倾斜,且不在横向模式或纵向模式中。因此,显示器的水平方向是相对于装置10水平,但相对于眼睛的水平方向为成角度的线。
图5是说明可实施本发明中描述的一或多个实例技术的装置的实例的框图。举例来说,图5进一步详细说明装置10。如图5中所示,装置10可包含应用程序处理器22、图形处理单元(GPU)30、系统存储器36、一或多个传感器42和相机处理器44。装置10可包含除图5中说明的那些组件之外的组件。
此外,在一些实例中,应用程序处理器22、GPU 30和相机处理器44可形成为容纳在单个电路封装内的共同集成电路(例如,形成为共同处理器)。然而,本发明的方面不限于此,且应用程序处理器22、GPU 30和相机处理器44中的一或多者可为容纳在单独的电路封装中的单独的集成电路。
一或多个传感器42可经配置以将装置10的定向的测量输出到应用程序处理器22。一或多个传感器42的实例包含加速度计和陀螺仪。相机处理器44可从由装置10的相机(未图示)或显示器12的相机(未图示)俘获的图像接收图像数据。在本发明中描述的技术中,相机可经配置以在无用户干预的情况下且在后台中连续地俘获图像。举例来说,所俘获图像不需要显示或存储以用于稍后检索。相机处理器44可从所俘获图像确定观看者的定向。
相机处理器44可确定观看者的眼睛的定向以确定观看者的定向。相机处理器44可实施任何技术以识别观看者的眼睛,相机处理器44从中确定观看者的眼睛的定向。许多当前相机处理器经配置以识别观看者的眼睛,且这些当前相机处理器可为相机处理器44的一个实例。
一或多个传感器42可将装置10的定向的测量输出到应用程序处理器22。相机处理器44可将观看者定向的测量输出到应用程序处理器22。应用程序处理器22可至少基于装置10的定向的测量和观看者的定向的测量确定观看角度。举例来说,应用程序处理器22可将观看角度确定为装置10的定向与观看者的定向之间的角度。如更详细地描述,应用程序处理器22可利用观看角度来确定修改顶点着色器38的指令的方式。
相机处理器44可能不是在每个实例中都是必要的。举例来说,装置10的定向的测量对于应用程序处理器22确定观看角度可为足够的。在这些实例中,应用程序处理器22可以观看者定向的测量预配置。应用程序处理器22可基于装置10的定向的测量和观看者定向的预配置测量而确定观看角度。作为另一实例,应用程序处理器22可基于观看者的定向的测量而确定观看角度而无需使用一或多个传感器42的输出。在此实例中,应用程序处理器22可以装置10的定向预配置(例如,可经预配置以当不使用一或多个传感器42的输出时确定装置10的定向是横向)。
利用一或多个传感器42和相机处理器44确定观看角度是仅出于说明的目的而提供且不应被视为具限制性。可存在应用程序处理器22可确定观看角度的其它方式,且本发明中描述的技术可扩展到此些其它技术。
在一些实例中,应用程序处理器22可在每次立体视图的产生确定观看角度一次,因为观看者可改变观看角度。举例来说,GPU 30可输出经再现图像,例如立体视图的左眼图像和右眼图像。在左眼图像和右眼图像两者的每次输出之后,应用程序处理器22可确定观看角度。作为另一实例,应用程序处理器22可连续地确定观看角度。如更详细地描述,应用程序处理器22经由图形驱动器包装器26可基于当前所确定的观看角度修改顶点着色器38的指令以使得当顶点着色器38处理下一图像时,顶点着色器38可产生如由应用程序处理器22所确定的下一左眼图像和下一右眼图像的裁剪坐标。
应用程序处理器22可为装置10的中央处理单元(CPU)。GPU 30可为可操作以输出图形数据以供在显示器上呈现的处理单元。应用程序处理器22、GPU 30和相机处理器44的实例包含(但不限于)数字信号处理器(DSP)、通用微处理器、专用集成电路(ASIC)、现场可编程逻辑阵列(FPGA)或其它等效集成或离散逻辑电路。
在一些实例中GPU 30可为经具体设计用于图形处理的专用硬件。举例来说,图形处理可需要快速并行处理,且GPU 30可经具体设计用于此些快速并行处理。GPU 30执行除图形处理之外的任务可为可能的,例如一般处理任务。因此,GPU 30可视为一般处理GPU(GPGPU)。本发明中描述的技术可应用于其中GPU 30仅执行图形相关任务的实例或其中GPU 30是GPGPU的实例。
系统存储器36可为计算机可读存储媒体的实例。举例来说,系统存储器36可存储致使应用程序处理器22和GPU 30执行归于本发明中的每一者的功能的指令。系统存储器36可视为包括致使一或多个处理器(例如,应用程序处理器22或GPU 30)执行各种功能的指令的计算机可读存储媒体。
系统存储器36的实例包含但不限于随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、CD-ROM或其它光盘存储装置、磁盘存储装置或其它磁性存储装置、快闪存储器,或可用于以指令或数据结构的形式携载或存储所要的程序代码且可由计算机或处理器存取的任何其它媒体。在一些实例中,系统存储器36可被视为非暂时性存储媒体。术语“非暂时性”可指示存储媒体不体现于载波或传播信号中。然而,术语“非暂时性”不应解释为意指系统存储器36是不可移动的。作为一个实例,可从装置10移除系统存储器36,及将所述系统存储器移动到另一装置。作为另一实例,实质上类似于系统存储器36的存储装置可插入到装置10中。在某些实例中,非暂时性存储媒体可存储可随时间改变的数据(例如,在RAM中)。
GPU 30可包含着色器处理器32和固定功能管线34。有时称为着色器核心的着色器处理器32可为GPU 30的核心,例如顶点着色器和片段着色器等着色器程序在其上执行。固定功能管线34可包含执行固定功能的硬件单元。换句话说,例如顶点着色器和片段着色器等着色器程序可为在着色器处理器32上执行且允许功能灵活性的软件单元,而固定功能管线34包含具有固定功能和最小功能灵活性的硬件单元。
举例来说,GPU的一些较早版本仅包含图形管线中的固定功能单元。在GPU 30中,GPU的较早版本的固定功能图形管线部分地被顶点着色器(例如顶点着色器38)和片段着色器代替。举例来说,顶点着色器38可执行例如模型视图变换、照明和投影等功能,其由GPU的较早版本中的固定功能单元执行。片段着色器可执行GPU的较早版本中的固定功能单元的片段级的功能。
本发明中描述的实例技术可修改经设计以产生单个三维(3D)图像(例如,用于单视图)的着色器程序,以使得当经修改着色器程序在着色器处理器32上执行时,GPU 30基于观看角度产生用于S3D图像(例如,立体视图)的图形数据。再次,如上文所论述,立体视图包含左眼图像和右眼图像。左眼图像和右眼图像包含与单视图图像大体上类似的图形内容;然而,左眼和右眼图像的一或多个对应像素可相对于彼此沿着水平轴线移位。
举例来说,设想右眼图像放置在左眼图像之上。在此情况下,右眼图像中的所有内容可能不与左眼图像中的相同内容完美地对齐。而是,右眼中的一或多个对象可在左眼图像中的相同对象的左边或右边(例如,右眼图像与左眼图像中的对象之间可存在水平视差)。为了高质量立体效果,右眼图像与左眼图像中的对象之间可不存在垂直视差。
左眼图像可由观看者的左眼观看,且右眼图像被阻挡于观看者的左眼。右眼图像可由观看者的右眼观看,且左眼图像被阻挡于观看者的右眼。在一些实例中,观看者可佩戴专用眼镜,其阻挡左眼图像由右眼观看且阻挡右眼图像由左眼观看。然而,本发明的方面不必需要观看者佩戴专用眼镜。举例来说,一些显示器并不需要观看者佩戴专用眼镜来体验立体视图。本发明的技术可延伸到此些显示器。
GPU 30可产生用于左眼图像和右眼图像的图形数据以使得当观看者同时观看左眼图像和右眼图像时,观看者的大脑致使观看者感知到弹出或推入正在显示所述两个图像的显示器的图像(例如,表现为在显示器前方或后方)。此弹出或推入是由于观看者的大脑解析立体视图的具有大体上类似内容的两个图像中的水平差异。举例来说,观看者的双眼视觉致使观看者同时观看左眼图像和右眼图像两者,且观看者通过感知深度来解析左眼和右眼图像中的水平差异。
作为一实例,应用程序处理器22可执行存储在系统存储器36中的一或多个应用程序,例如应用程序42。应用程序32的实例包含(但不限于)网络浏览器、用户接口、电子邮件应用程序、电子表格应用程序、文字处理应用程序、图形创作应用程序、视频游戏或产生用于显示的可观看对象的其它应用程序。举例来说,应用程序42可为当经执行时输出显示于显示器上的图形内容的视频游戏。
应用程序42可由开发者针对单视图而设计。举例来说,应用程序42在执行后可即刻产生3D图形内容,其中3D图形内容被限制于显示器的2D区域。应用程序42在应用程序处理器22上执行后可将产生的3D图形内容划分为基元,例如三角形、矩形或其它类型的多边形。这些基元中的每一者可包含将在显示器上显示的像素。举例来说,这些基元可形成图像内的对象。应用程序42在应用程序处理器22上执行后还可即刻对基元的顶点中的每一者指派像素值。举例来说,像素值可包含顶点的3D坐标、顶点的颜色值以及顶点的透明度值。像素值不需要在本发明的每个方面中都包含所有以上实例组件。
应用程序处理器22可随后将顶点的像素值转发到GPU 30用于进一步处理。举例来说,应用程序处理器22可包含图形驱动器24,其可为在应用程序处理器22上执行的软件。应用程序处理器经由图形驱动器24可经配置以将命令发射到GPU 30,且作为响应,GPU 30可根据所接收的命令执行功能。举例来说,图形驱动器24充当GPU 30与应用程序处理器22之间的接口。当应用程序处理器22发出命令到GPU 30时,GPU 30是通过图形驱动器24接收所述命令。举例来说,在应用程序处理器22上执行的应用程序42可指示GPU 30执行特定任务。在此情况下,图形驱动器24可从应用程序42接收用于特定任务的指令,且应用程序处理器22可将指令提供到GPU 30。作为响应,GPU 30可执行所述任务。
在一些实例中,可根据特定应用程序编程接口(API)设计图形驱动器24。举例来说,图形驱动器24可根据OpenGL或OpenGL ES(嵌入式系统)API而设计,其为柯罗诺斯团队(Khronos Group)的API且其规范是公开可用的。然而,本发明的技术可扩展到微软DirectX系统,例如DirectX 9、10或11,或任何其它基于着色器的图形系统和API。出于说明的目的,在其中API是OpenGL ES 2.0 API的上下文中描述本发明的技术。然而,本发明的方面不限于此,且可延伸到其它API或基于着色器的图形系统。
为了再现从应用程序处理器22接收的基元,GPU 30的着色器处理器32可执行例如顶点着色器和片段着色器等一或多个着色器程序来产生显示器的像素的像素值。开发者可根据例如出于说明的目的在本发明中使用的OpenGL ES 2.0 API的API而开发这些顶点着色器和片段着色器。用于这些顶点和片段着色器的源代码可存储在系统存储器36中。
举例来说,应用程序42可利用顶点着色器38,其可经配置以对由应用程序42产生的单视图的图像操作。由应用程序42产生的单视图的图像的像素值可需要由着色器处理器32使用顶点着色器38处理。作为一个实例,顶点着色器38可为在应用程序42在应用程序处理器22上的执行期间具体来说由应用程序42调用的顶点着色器。顶点着色器38可在GPU 20的着色器处理器32上执行,且应用程序42可在应用程序处理器22上执行,但顶点着色器38和应用程序42可出于显示由应用程序42产生的图像的目的而互相关。
顶点着色器38的源代码可存储在系统存储器36中。应用程序处理器22经由图形驱动器24可检索顶点着色器38的源代码且将用于顶点着色器38的源代码提供到编译器28。编译器28可编译顶点着色器38的源代码来产生顶点着色器38的目标代码,且将目标代码存储在系统存储器38中。应用程序处理器22经由图形驱动器34可随后指示GPU 30从系统存储器36检索顶点着色器38的目标代码,且指示GPU 30在着色器处理器32上执行顶点着色器38的目标代码。着色器处理器32可随后执行顶点着色器38的目标代码以处理由应用程序42的执行产生的顶点的像素值。GPU 30与固定功能管线34和着色器处理器32结合可产生用于应用程序42的图形内容供显示。
虽然系统存储器36展示为存储用于仅一个顶点着色器38的源代码,但本发明的方面不限于此。举例来说,应用程序42可能利用多个不同顶点着色器,且用于这些顶点着色器中的每一者的源代码可存储在系统存储器36中。举例来说,顶点着色器可为内容相依的且甚至场景相依的,且应用程序42可基于待再现的图像的内容或场景而利用特定着色器。并且,应用程序42可需要顶点着色器38的多个示例的执行。举例来说,着色器处理器32可同时(例如,并行)执行顶点着色器38的多个示例,其中顶点着色器38的每一示例执行大体上类似功能但是在不同像素值上执行。系统存储器36可类似地存储用于片段着色器的源代码。图形驱动器34可检索用于片段着色器的源代码,且编译器28可以类似于上文对于顶点着色器38所述方式的方式编译所述源代码来产生用于片段着色器的目标代码。
如将进一步详细描述,本发明的一或多个实例技术可在编译之前基于观看角度修改顶点着色器38(例如,顶点着色器38的源代码)。编译器28可编译经修改源代码来产生经修改顶点着色器40的目标代码。着色器处理器32可执行经修改顶点着色器40的目标代码,其可致使GPU 30产生立体3D图形内容(例如,用于S3D的左眼图像和右眼图像的图形内容)。然而,在描述对顶点着色器38的修改之前,以下描述顶点着色器38的实例功能性,其可辅助理解应用于顶点着色器38的源代码的修改。此外,在本发明中术语“命令”和“指令”可互换地使用。
如上文所描述,应用程序处理器22经由应用程序42可产生基元的顶点的坐标。这些坐标可被称为世界坐标,且可对应用程序42为特定的。换句话说,如由应用程序42定义的顶点的坐标可不必为基元显示于其上的显示器的坐标,且也可能为在可观看区域之外的顶点的坐标。顶点着色器38可经设计以将可在3D中的世界坐标转换为显示器的2D坐标(例如,显示器坐标)。为了执行此功能,顶点着色器38可将世界坐标变换为眼睛坐标,且随后变换为裁剪坐标。举例来说,顶点着色器38当经执行时的输出可为顶点的裁剪坐标。作为固定功能管线34的部分,随后可确定最终显示器坐标(例如,显示器的坐标)。
裁剪坐标可界定视图锥台。视图锥台可界定3D图形内容的可观看区域。GPU 30可利用视图锥台来剔除驻留在视图锥台外部的像素。举例来说,固定功能管线34的固定功能单元(例如,固定功能管线24的锥台单元)可剔除驻留在如由顶点着色器38产生的裁剪坐标定义的视图锥台外部的像素。
从世界坐标计算裁剪坐标的等式可为:
V裁剪=PRJ*V眼睛=PRJ*MVT*V世界,  (等式1)
其中V裁剪是顶点裁剪坐标,V眼睛是顶点眼睛坐标,V世界是由应用程序42提供的顶点世界坐标,PRJ是投影矩阵,且MVT是模型视图变换矩阵(或世界视图变换矩阵)。在一些实例中,PRJ和MVT矩阵可组合为单个矩阵。然而,为便于理解,单独地描述这些矩阵。
投影矩阵(PRJ)和模型视图或世界视图变换矩阵(MVT)可由API定义。术语模型视图和世界视图可互换地使用。V裁剪、V眼睛和V世界可包含四个分量(例如,x、y、z和w坐标)。
V裁剪、V眼睛和V世界矩阵可表示为:
具有可编程着色器的OpenGL、OpenGL ES和OpenGL ES 2.0 API将PRJ矩阵界定为:
其中L和R分别指定左和右垂直裁剪平面的坐标,B和T分别指定底部和顶部水平裁剪平面的坐标,且z近和z分别指定到近和远深度裁剪平面的距离。
在一些实例中,裁剪平面可为对称的。举例来说,-L可等于R,且-B可等于T。在这些情况下,PRJ矩阵可简化到:
具有可编程着色器的OpenGL、OpenGL ES和OpenGL ES 2.0 API将MVT矩阵界定为:
M V T = a 11 a 12 a 13 a 14 a 21 a 22 a 23 a 24 a 31 a 32 a 33 a 34 0 0 0 1 . (等式5)
PRJ和MVT矩阵的所有变量可由在应用程序处理器22上执行的应用程序42定义,且图形驱动器24可将这些变量提供到执行顶点着色器38的目标代码的着色器处理器32。从等式1、4和5可以看出,通过这些变量,顶点着色器38可确定顶点中的每一者的V裁剪坐标。GPU 30可利用顶点的裁剪坐标且执行进一步功能性结合固定功能管线34和片段着色器的功能性来再现用于显示的图像。以此方式,GPU 30可产生用于由应用程序42产生的图形内容的单视图。
根据本发明的技术,虽然顶点着色器38可利用MVT和PRJ矩阵的变量来确定V裁剪坐标,但可不需要MVT和PRJ矩阵来修改顶点着色器38(例如,修改顶点着色器38的源代码)来产生立体视图。换句话说,本发明中描述的技术修改的指令可不需要MVT和PRJ矩阵的特定值。
举例来说,可存在设计顶点着色器38的许多方式,且顶点着色器38可为内容且甚至场景相依的,从而允许内容开发者利用许多不同方式来对顶点着色器38进行编程。因此,确定MVT和PRJ矩阵由开发者定义的特定方式可能是不可行的。然而,本发明中描述的技术并不需要知道开发者开发顶点着色器38的方式或开发者界定MVT和PRJ矩阵的方式。
上文实例描述确定单视图的V裁剪坐标的一种方法。可存在许多不同技术来计算裁剪坐标,且一般来说,用以计算裁剪坐标的特定技术可为不重要的。然而,在任何情况下,对于3D图形内容,不管用以计算裁剪坐标的技术如何都可能需要计算裁剪坐标(V裁剪)。举例来说,甚至可能应用程序处理器22确定裁剪坐标,且图形驱动器24可将裁剪坐标提供到执行顶点着色器38的目标代码的着色器处理器32。在此实例中,PRJ和MVT矩阵可为单位矩阵。举例来说,应用程序处理器22可执行等式1的矩阵乘法且将结果提供到着色器处理器32。在此实例中,着色器处理器32可将所接收值与单位矩阵相乘来产生由应用程序42产生的顶点中的每一者的V裁剪坐标。
然而,在任何情况下(例如,其中执行顶点着色器38的着色器处理器32确定裁剪坐标或其中执行顶点着色器38的着色器处理器32接收裁剪坐标),顶点着色器38可利用特定变量来存储裁剪坐标。所述特定变量可对顶点着色器38针对其设计的API为特定的。举例来说,如果根据具有可编程着色器的OpenGL、OpenGL ES或OpenGL ES 2.0 API设计顶点着色器38,那么顶点着色器38可将裁剪坐标存储在gl_Position变量中。可自动声明gl_Position变量。在其它图形API中可存在相似变量。如果根据具有可编程着色器的OpenGL、OpenGL ES或OpenGL ES 2.0 API设计顶点着色器38,那么顶点着色器38可包含例如以下指令:gl_Position.x=x裁剪,gl_Postion.y=y裁剪,gl_Position.z=z裁剪,且gl_Position.w=w裁剪,其中如上文等式2中所指出,
在本发明中描述的一或多个实例技术中,可为在应用程序处理器22上执行的软件的图形驱动器包装器26可修改顶点着色器38的界定用于单视图的裁剪坐标的指令,以界定用于立体视图的裁剪坐标(例如,用于左眼图像和裁剪坐标和用于右眼图像的裁剪坐标)。举例来说,图形驱动器包装器26可从应用程序处理器22接收所确定的观看角度。应用程序处理器22由于图形驱动器包装器26的执行可经配置以基于由应用程序处理器22所确定的观看角度而修改顶点着色器38的指令以界定用于立体视图的裁剪坐标。
举例来说,应用程序处理器22经由图形驱动器包装器26可修改顶点着色器38的指令以使得当顶点着色器38的经修改指令由着色器处理器32第一次执行时,顶点着色器38的经修改指令基于观看角度在一个方向上使裁剪坐标移位,且当顶点着色器38的经修改指令由着色器处理器32第二次执行时,顶点着色器的经修改指令基于观看角度在另一方向上使同一裁剪坐标移位。然而,简单地在不同方向上使裁剪坐标移位且再现所得图像可致使立体视图始终以某一固定量弹出显示器12或始终以某一固定量推入显示器12。此结果对观看者可为不合意的。
举例来说,假定立体视图弹出显示器12。在此情况下,观看者可感知到在显示器12的前方某一距离的平面上的立体视图。观看者感知到立体视图的此平面可被称为零视差平面(ZDP)。然而,观看者可需要感知到处于不同于当前零视差平面的距离处的零视差平面。
对于零视差平面调整,应用程序处理器22经由图形驱动器包装器26可增加或减小左眼图像与右眼图像之间的水平视差。举例来说,应用程序42可输出界定单个图像的检视区的命令。术语“检视区”指代图像在显示器12上涵盖的区域。举例来说,应用程序42可界定显示器12上的单个图像(例如,单视图)的大小和位置。单个图像的大小和位置的此定义可视为所述单个图像的检视区。为了界定检视区,应用程序处理器22经由应用程序42可发出glViewport命令,其变量界定显示器12上的单视图图像的大小和位置。应用程序处理器22经由图形驱动器包装器26可基于观看角度将界定单个图像的大小和位置的命令(例如,由应用程序32发出的glViewport命令)修改为界定左眼图像和右眼图像的大小和位置的命令(例如,界定左眼图像的检视区和右眼图像的检视区的glViewport命令)。用于左眼图像的glViewport命令可基于观看角度将左眼图像限制于显示器的一个部分,且用于右眼图像的glViewport命令可基于观看角度将右眼图像限制于显示器的另一部分。这两个部分可能至少部分重叠。
在一些实例中,应用程序处理器22经由图形驱动器包装器26可修改glViewport命令以增加或减小左眼图像与右眼图像之间的水平视差。举例来说,当左眼图像被限制于一个部分且右眼图像被限制于另一部分时,在左眼图像中的所有相似对象与右眼图像中的对象之间可存在某些固定水平视差。换句话说,左眼图像与右眼图像中的对应顶点中的每一者之间的水平视差的量可相同。作为说明性实例,假定由应用程序42产生的图像包含球和块。在此实例中,左眼图像和右眼图像中的球的顶点之间的水平视差可与左眼图像和右眼图像中的块的顶点之间的水平视差相同。因此,所得立体视图、球和块可出现在零视差平面,其中所述零视差平面在显示器12的前方或后方。当所述球和块出现在零视差平面时,所述球和块可能不表现为推入到零视差平面中或推出零视差平面。
为了调整零视差平面的位置(例如,0视差地点在显示器12前方或后方的量),应用程序处理器22经由图形驱动器包装器26可修改glViewport命令的指令以允许观看者界定左眼图像中的相似对象与右眼图像中的对象之间的水平视差。举例来说,观看者可提供水平视差值,其界定左眼图像和右眼图像中的相似对象之间的水平视差。
以此方式,观看者可视为界定左眼图像与右眼图像之间的水平视差,因为观看者可进一步界定左眼图像和右眼图像中的所有相似对象水平地移位的量。如上文所描述,左眼图像与右眼图像之间的水平视差的量界定立体视图出现在显示器12前方或后方的量。因此,通过界定左眼图像与右眼图像之间的水平视差,观看者可界定零视差平面的位置。
在一些实例中,替代于观看者界定左眼图像与右眼图像之间的水平视差,应用程序处理器22可估计左眼图像与右眼图像之间的水平视差。作为一个实例,应用程序处理器22或图形驱动器包装器26可预加载有水平视差值,图形驱动器包装器26使用所述水平视差值来增加或减小左眼图像与右眼图像之间的水平视差。此水平视差值可基于观看者一般观看显示器12的共同距离的假设。举例来说,在其中装置10是移动装置的实例中,大多数观看者将装置10保持在远离其面部的大致相同距离。因此,大多数观看者可偏好于零视差平面出现在显示器12前方大致相同的距离处。应用程序处理器22或图形驱动器包装器26可预加载有产生处于显示器12前方通常优选的距离处的零视差平面的水平视差值。
作为另一实例,相机处理器44可经配置以确定观看者与显示器12的距离的估计。举例来说,相机处理器44可识别观看者的头,且基于头大小的测量,相机处理器44可估计观看者相对于显示器12的距离。在此实例中,应用程序处理器22可利用观看者的距离的此估计来确定水平视差值,其中所述水平视差值界定左眼图像与右眼图像之间的水平视差的量。
在本发明中描述的技术中,glViewport命令可以不是顶点着色器38的指令。而是,固定功能管线34的检视区变换单元可基于glViewport命令将左眼图像限制到一个部分,且将右眼图像限制到另一部分。在这些实例中,GPU 30可将glViewport命令提供到固定功能管线34的检视区变换单元以基于观看角度将左眼图像限制到显示器12的一个部分,且基于观看角度将右眼图像限制到显示器12的另一部分,以使得零视差平面处于相对于显示器12的所要位置处。
在glViewport命令的修改的以上实例中,应用程序处理器22经由图形驱动器包装器26可界定左眼图像与右眼图像之间的水平视差以使得观看者感知到处于所要零视差平面处的立体视图。在一些实例中,通过允许观看者以不同量增加或减小相似对象之间的水平视差可实现甚至更好的观看体验。举例来说,在glViewport命令修改中,应用程序处理器22经由图形驱动器包装器26可修改glViewport命令以使得左眼图像和右眼中的所有相似对象移位相同量。这导致立体视图出现在显示器12前方或后方在零视差平面处。然而,观看者还可能希望使一些对象出现在零视差平面前方,一些对象出现在零视差平面后方,且一些对象出现在零视差平面处。
在一些实例中,并非观看者或应用程序处理器22确定界定零视差平面的位置的水平视差值,观看者可界定零视差平面的位置,或应用程序处理器22可确定零视差平面的位置。在这些实例中,应用程序处理器22经由图形驱动器包装器26可不必需要修改由应用程序42发出的glViewport命令,而是致使glViewport命令执行两次:一次用于左眼图像,且另一次用于右眼图像。实际上,应用程序处理器22经由图形驱动器包装器26可进一步修改顶点着色器38的指令以使得由应用程序42输出的基元的顶点在左眼图像和右眼图像中移位不同量。
举例来说,在其中图形驱动器包装器26修改glViewport命令的实例中,图形驱动器包装器26可视为在图像层级界定水平视差(例如,右眼图像与左眼图像之间的水平视差)。举例来说,图形驱动器包装器26可产生两个glViewport命令:一个命令基于观看角度将左眼图像限制到一个部分,且另一个命令基于观看角度将右眼图像限制到另一部分。举例来说,应用程序42可发出界定单个图像的检视区的glViewport命令。图形驱动器包装器26可在第一执行实例中修改由应用程序42发出的glViewport命令以界定左眼图像的检视区,且在第二执行实例中修改由应用程序42发出的glViewport命令以界定右眼图像的检视区。
在其中应用程序处理器22经由图形驱动器包装器26进一步修改顶点着色器38的指令的实例中,图形驱动器包装器26可视为在顶点层级界定水平视差(例如,左眼图像中的顶点与右眼图像中的顶点之间的水平视差)。因此,修改顶点着色器38的指令以调整视差可提供与修改glViewport命令的指令以调整视差相比更精细层级的视差调整。在其中图形驱动器包装器26进一步修改顶点着色器38的指令的实例中,GPU 30可利用由应用程序42发出的glViewport命令来界定用于左眼图像和右眼图像的检视区(例如,可不需要glViewport命令的修改)。举例来说,图形驱动器包装器26可致使glViewport命令执行两次:左眼和右眼图像中的每一者一次。然而,在此实例中,图形驱动器包装器26可不修改由应用程序42发出的glViewport命令,且对顶点着色器38的指令的额外修改可允许顶点移位不同量以使得一些对象出现在零视差平面前方,一些对象出现在零视差平面后方,且一些对象出现在零视差平面处。
举例来说,应用程序42可界定三个维度中的基元的顶点(例如,x、y、z、w坐标),其中w坐标是齐次坐标。在本发明中描述的技术中,应用程序处理器22经由图形驱动器包装器26可利用顶点的z坐标的值来确定顶点在左眼图像和右眼图像中移位的量。举例来说,如果所述z坐标的值等于零视差平面的位置,那么顶点着色器38的经修改指令可不使左眼图像和右眼图像中的顶点移位。然而,如果所述z坐标的值不等于零视差平面的位置,那么顶点着色器38的经修改指令可使左眼图像和右眼图像中的顶点的位置移位。顶点着色器38的经修改指令使顶点的位置移位的量可基于z坐标的值。
在其中图形驱动器包装器26修改glViewport命令以在图像层级调整视差的实例中,图形驱动器包装器26可不进一步修改顶点着色器38的指令以在顶点层级调整视差。在其中图形驱动器包装器26进一步修改顶点着色器38的指令以在顶点层级调整视差的实例中,图形驱动器包装器26可不修改glViewport命令以在图像层级调整视差。然而,本发明的方面不限于此,且图形驱动器包装器26修改glViewport命令以在图像层级调整视差且进一步修改顶点着色器38的指令以在顶点层级调整顶点之间的视差可为可能的。
并且,当图形驱动器包装器26仅修改glViewport命令以调整零视差平面的位置时,GPU 30可能够与当图形驱动器包装器26进一步修改顶点着色器38的指令以调整对象相对于零视差平面出现的位置(例如,在零视差平面前方、在零视差平面处或在零视差平面后方)时相比更快地再现立体视图。这可能是因为与固定功能管线34的检视区调整单元调整左眼图像和右眼图像的检视区相比顶点着色器38花费较长时间在着色器处理器32上执行。然而,当图形驱动器包装器26进一步修改顶点着色器38的指令以调整对象相对于零视差平面出现的位置时,再现的立体视图可提供与当图形驱动器包装器26修改glViewport命令时相比更好的观看者体验。这可能是因为对顶点着色器38的指令的进一步修改允许一些对象出现在零视差平面前方、零视差平面处或零视差平面后方,而通过对glViewport命令的修改,所有对象出现在零视差平面处,所述零视差平面可在显示器12前方或后方。
是修改glViewport命令还是进一步修改顶点着色器38的指令可为设计选择问题。举例来说,如果再现时间是重要因数,那么应用程序处理器22经由图形驱动器包装器26可修改glViewport命令。如果较理想的观看体验是重要因数,那么应用程序处理器22经由图形驱动器包装器26可进一步修改顶点着色器38的指令。
因此,图形驱动器包装器26可修改顶点着色器38的指令以使得当顶点着色器38的经修改指令执行着色器处理器32时,GPU 30可基于观看角度在一个方向上使基元的顶点移位,且基于观看角度在另一方向上使基元的顶点移位。在一些实例中,图形驱动器包装器26可进一步修改顶点着色器38的指令以使得当顶点着色器38的进一步经修改指令在着色器处理器32上执行时,GPU 30可基于观看角度且基于零视差平面的位置在一个方向上使基元的顶点移位。在一些实例中,图形驱动器包装器26可修改由应用程序42发出的glViewport命令的指令以使得固定功能管线34的检视区变换单元增加或减小左眼图像与右眼图像之间的水平视差以调整零视差平面的位置。
下文描述应用程序处理器22、GPU 30和系统存储器36可一起作用以致使GPU 30从产生单视图的应用程序42再现立体视图的实例方式。举例来说,应用程序处理器22可基于来自一或多个传感器42和相机处理器44的一或多个输出确定观看角度。应用程序处理器22可周期性地(例如在GPU 30对左眼图像和右眼图像两者的每次再现一次)确定观看角度,作为一个实例(即,立体视图的每次产生一次)。图形驱动器包装器26可利用此所确定的观看角度来修改由应用程序42发出的指令且修改顶点着色器38的指令。
举例来说,为了致使GPU 30再现图像,应用程序处理器22可执行应用程序42的glShaderSource命令。glShaderSource命令指示图形驱动器24从系统存储器36检索顶点着色器38的源代码。在本发明的实例中,响应于由应用程序42发出的glShaderSource命令,图形驱动器包装器26可在顶点着色器38的源代码到达图形驱动器24之前拦截所述源代码。应用程序处理器22经由图形驱动器包装器26可修改顶点着色器38的源代码以包含指令,所述指令致使经修改顶点着色器38当经执行时基于由应用程序处理器22确定的观看角度而产生用于立体视图的图形内容。举例来说,图形驱动器包装器26可致使经修改顶点着色器38执行两次。在第一执行中,经修改顶点着色器38可基于观看角度产生用于左眼图像的图形内容,且在第二执行中,经修改着色器38可基于观看角度产生用于右眼图像的图形内容,或反之亦然。另外,在一些实例中,图形驱动器包装器26可进一步修改顶点着色器38的指令以基于零视差平面的位置确定顶点的位置。
如由应用程序处理器22执行的图形驱动器包装器26可充当源代码编辑器。作为一个实例,图形驱动器包装器26可监视由应用程序42发出的指令。当图形驱动器包装器26识别出应用程序42发出glShaderSource命令时,图形驱动器包装器26可俘获且修改顶点着色器38的指令(例如,顶点着色器38的源代码)。举例来说,图形驱动器包装器26可包含指令到顶点着色器38的源代码中,所述指令基于观看角度修改针对单个图像(例如,单视图)产生的裁剪坐标的值来产生左眼图像和右眼图像(例如,立体视图)的裁剪坐标。
举例来说,如上文所指出,顶点着色器38可包含存储x裁剪坐标的值的gl_Position.x变量以及存储y裁剪的值的gl_Position.y变量。如下文更详细地论述,图形驱动器包装器26可包含第一指令到顶点着色器38中,所述第一指令基于观看角度更新gl_Position.x的值(例如,x裁剪坐标),且包含第二指令到顶点着色器38中,所述第二指令基于观看角度更新gl_Position.y的值(例如,y裁剪坐标)。
为了产生左眼图像,由应用程序处理器22添加到顶点着色器38中的第一指令经由图形驱动器包装器26致使顶点着色器38将第一值添加到x裁剪值。所述第一值可基于观看者的眼睛之间的距离和观看角度。由应用程序处理器22添加到顶点着色器38中的第二指令经由图形驱动器包装器26致使顶点着色器38将第二值添加到y裁剪值。所述第二值可基于观看者的眼睛之间的距离、观看角度以及显示器12的高度和宽度。
为了产生右眼图像,由图形驱动器包装器26添加到顶点着色器38中的指令致使顶点着色器38对x裁剪值减去第一值。用于右眼图像的第一值可为与用于左眼图像的第一值相同的值。由图形驱动器包装器26添加到顶点着色器38中的第二指令致使顶点着色器38对y裁剪值减去第二值。用于右眼图像的第二值可为与用于左眼图像的第二值相同的值。
举例来说,应用程序处理器22经由图形驱动器包装器26可修改顶点着色器38的源代码以添加将存储在gl_Position.x变量(例如,x裁剪坐标)中的值改变为gl_Position.x变量的当前值加(z*w世界/(R-L)/2)*X的指令,其中z、R和L全部是来自PRJ矩阵(等式4)的变量,且w世界是来自V世界矩阵(等式2)的变量(例如,如由应用程序42定义的顶点坐标)。应用程序处理器22经由图形驱动器包装器26可修改顶点着色器38的源代码以添加将存储在gl_Position.y变量(例如,y裁剪坐标)中的值改变为gl_Position.y变量的当前值加(z*w世界/(T-B)/2)*Y的指令,其中z、T和B全部是来自PRJ矩阵(等式4)的变量,且w世界是来自V世界矩阵(等式2)的变量(例如,如由应用程序42定义的顶点坐标)。
X的值可为+D*cos(α)或-D*cos(α),其中D是观看者的右眼与左眼之间的距离的二分之一的近似,且可为用户可定义的或预编程值,且阿尔法α是观看角度。作为一个实例,应用程序处理器22可基于一或多个传感器42和相机处理器44的输出确定观看角度。Y的值可为+D*sin(α)或-D*sin(α)。
举例来说,假定左眼与右眼之间的距离是2*D。在此实例中,观看者的左眼的坐标可为(-Dx,-Dy,-Dz),且观看者的右眼的坐标可为(Dx,Dy,Dz)。Dz坐标可视为0,因为左眼和右眼的坐标可从观看者的面部前方和眼睛中间(即,(0,0,0)位置位于观看者的面部前方和观看者的左眼与右眼之间的点处)开始。如果观看角度是α,那么观看者的左眼的坐标可为(-Dx*cos(α),-Dy*sin(α),0),且视图的右眼的坐标可为(Dx*cos(α),Dy*sin(α),0)。在此实例中,如果观看角度是0,那么左眼和右眼的坐标变为(-Dx,0,0)和(Dx,0,0)。然而,当观看角度不是0时,观看角度可界定观看者的左眼和右眼相对于(0,0,0)位置的位置。左眼和右眼的坐标可视为:
应用程序处理器22经由图形驱动器包装器26可将以下指令添加到顶点着色器38的指令集合:gl_Position.x+=(z*w世界/(R-L)/2)*X。这可等效于gl_Position.x=gl_Position.x+(z*w世界/(R-L)/2)*X。举例来说,gl_Position.x+=命令将由gl_Position.x+=指令定义的值添加到由gl_Position命令存储的值(例如,将所述值添加到x裁剪)。在一些情形中,gl_Position.x+=指令可简化为gl_Position.x+=X。下文进一步详细描述gl_Position.x+变量可等于(z*w世界/(R-L)/2)*X或恰等于X的原因。
应用程序处理器22经由图形驱动器包装器26还可将以下指令添加到顶点着色器38的指令集合:gl_Position.y+=(z*w世界/(T-B)/2)*Y。这可等效于gl_Position.y=gl_Position.y+(z*w世界/(T-B)/2)*Y。举例来说,gl_Position.y+=命令将由gl_Position.y+=指令定义的值添加到由gl_Position命令存储的值(例如,将所述值添加到y裁剪)。在一些情形中,gl_Position.y+=指令可简化为gl_Position.y+=Y*显示器12的宽度除以显示器12的高度。下文进一步详细描述gl_Position.y+变量可等于(z*w世界/(T-B)/2)*Y或恰好等于Y*显示器12的宽度除以显示器12的高度的原因。
根据本发明的技术,为了产生左眼图像,应用程序处理器22经由图形驱动器包装器26可将变量X的值界定为D*cos(α)。这是因为观看位置向左移动等效于观测对象向右移动。当X等于+D*cos(α)时,gl_Position.x+=命令致使将常数(例如(z*w世界/(R-L)/2)*D*cos(α)或恰好D*cos(α))添加到由应用程序42产生的顶点中的每一者的x裁剪坐标,其致使顶点向左移动D*cos(α)的值。并且,为了产生左眼图像,应用程序处理器22经由图形驱动器26可将变量Y的值界定为D*sin(α)。这是因为观看位置向下移动等效于观测对象向上移动。当Y等于+D*sin(α)时,gl_Position.y+=命令致使将常数(例如(z*w世界/(T-B)/2)*D*sin(α)或恰好D*sin(α)*显示器12的宽度除以显示器12的高度)添加到由应用程序42产生的顶点中的每一者的y裁剪坐标,其致使顶点向左移动D*sin(α)*宽度/高度的值,其中宽度是显示器12的宽度且高度是显示器12的高度。
为了产生右眼图像,应用程序处理器22经由图形驱动器包装器26可将变量X的值界定为-D*cos(α)。这是因为观看位置向右移动等效于观测对象向左移动。当X等于-D*cos(α)时,gl_Position.x+=命令致使从由应用程序42产生的顶点中的每一者的x裁剪坐标减去常数(例如(z*w世界/(R-L)/2)*-D*cos(α)或恰好-D*cos(α)),其致使顶点向右移动-D*cos(α)的值。并且,为了产生右眼图像,应用程序处理器22经由图形驱动器包装器26可将变量Y的值界定为-D*sin(α)。这是因为观看位置向上移动等效于观测对象向下移动。当Y等于-D*sin(α)时,gl_Position.y+=命令致使从由应用程序42产生的顶点中的每一者的y裁剪坐标减去常数(例如(z*w世界/(T-B)/2)*-D*sin(α)*宽度/高度或恰好-D*cos(α)*宽度/高度),其致使顶点向右移动-D*sin(α)*宽度/高度的值。
在修改顶点着色器38的源代码之后,应用程序处理器22可将顶点着色器38的经修改源代码存储在系统存储器中。在一些实例中,应用程序处理器22可将顶点着色器38的经修改源存储在顶点着色器38的未经修改源代码在系统存储器36中存储的相同位置。在另一个实例中,应用程序处理器22可将顶点着色器38的经修改源存储在系统存储器36中与顶点着色器38的未经修改源代码所存储的位置不同的位置。
在发出glShaderSource命令之后,应用程序42发出glCompileShader命令。glCompileShader命令致使在应用程序处理器22上执行的编译器28编译顶点着色器38的经修改源代码。举例来说,glCompileShader命令可致使编译器28从系统存储器36检索用于经修改顶点着色器38的源代码,且编译经修改顶点着色器38。在编译之后,编译器28将所得目标代码存储在系统存储器36中。举例来说,如所示,系统存储器36包含经修改顶点着色器40。经修改顶点着色器40是由编译器28编译顶点着色器38的经修改源代码而产生的目标代码。
此外,如上文所描述,图形驱动器包装器26可在顶点着色器28的源代码中包含指令,所述指令致使顶点着色器28将常数添加到gl_Position.x变量和gl_Position.y变量来产生左眼图像,且从gl_Position.x和gl_Position.y变量减去所述常数来产生右眼图像。经修改顶点着色器40的目标代码包含指令,所述指令致使经修改顶点着色器40将常数添加到gl_Position.x变量和gl_Position.y变量来产生左眼图像且从gl_Position.x变量和gl_Position.y变量减去所述常数来产生右眼图像。如更详细地描述,经修改顶点着色器40响应于来自应用程序42的绘制命令而经由图形驱动器包装器26从应用程序处理器22接收所述常数的值。
在一些实例中,如上文所描述,应用程序处理器22经由图形驱动器包装器26可进一步修改顶点着色器38的指令以进一步调整左眼图像和右眼图像中的顶点的位置以使得一些对象出现在零视差平面前方、零视差平面处或零视差平面后方。举例来说,如上文所描述,图形驱动器包装器26可修改顶点着色器38的指令以包含以下指令:gl_Position.x+=X且gl_Position.y+=Y*宽度/高度,其中对于左眼图像X等于+D*cos(α)且Y等于+D*sin(α),且对于右眼图像X等于-D*cos(α)且Y等于-D*sin(α)。
为了进一步允许在顶点层级的调整,图形驱动器包装器26可修改顶点着色器38的指令以包含以下指令:gl_Position.x+=X*(1-(gl_Position.w/ZDPloc))且gl_Position.y+=Y*宽度/高度*(1-(gl_Position.w/ZDPloc))。ZDPloc可为用户界定或预配置的值,其界定零视差平面相对于显示器12的位置。在一些其它实例中,处理器22可基于如由相机处理器44确定的观看者的位置的估计而确定零视差平面的位置的估计。gl_Position.w变量存储w裁剪坐标。
举例来说,类似于gl_Position.x和gl_Position.y变量,顶点着色器38可在gl_Position.w变量中存储w裁剪坐标。在在本发明中描述的实例中,w裁剪坐标可等于如由应用程序42定义的基元的负z坐标。如上文所描述,应用程序42可将基元界定为(x,y,z,w)。这些坐标可视为在世界空间中界定(即,顶点的v世界坐标是(x世界,y世界,z世界,w世界))。
在本发明中描述的技术中,gl_Position.w可等于-z世界。gl_Position.w等于-z世界的原因是由于上文等式3和4中界定的PRJ矩阵。如PRJ矩阵中示出,第三列、第四行的值是-1。如上文等式1中界定,V裁剪等于PRJ*MVT*V世界。因此,当PRJ矩阵乘以V世界矩阵和MVT矩阵时V世界的z世界坐标乘以PRJ矩阵的第三列、第四行的-1。w裁剪坐标等于z世界与-1的乘法的结果(即,w裁剪等于-z世界),且gl_Position.w变量存储w裁剪的值(即,gl_Position.w等于-z世界)。
用gl_Position.x+=X*(1+(z世界/ZDPloc))和gl_Position.y+=Y*宽度/高度*(1+(z世界/ZDPloc))代替gl_Position.x+=X*(1-(gl_Position.w/ZDPloc))和gl_Position.y+=Y*宽度/高度*(1-(gl_Position.w/ZDPloc))命令是可能的。然而,图形驱动器包装器26可不存取由应用程序42输出的所有z世界值。在本发明中描述的技术中,如果作为一个实例,顶点着色器38是根据OpenGL 2.0 ES API设计,那么顶点着色器38可经设计以包含等于w裁剪的gl_Position.w变量,其在此情况下也等于-z世界。因此,虽然图形驱动器包装器26可不存取z世界坐标,但图形驱动器包装器26可利用gl_Position.w变量来确定z世界的值。
z世界坐标可提供由应用程序42输出的单个图像内的顶点的相对深度的测量。举例来说,由应用程序42输出的单个图像可被限制于显示器12的2D区域;然而,单个图像内的对象可基于顶点的z世界坐标而出现在其它对象的前方或后方。在其中图形驱动器包装器26修改顶点着色器28的指令以包含gl_Position.x+=X*(1-(gl_Position.w/ZDPloc))和gl_Position.y+=Y*宽度/高度*(1-(gl_Position.w/ZDPloc))命令的实例中,图形驱动器包装器26可考虑顶点的相对深度以确定针对左眼图像在一个方向上使顶点移位多少且针对右眼图像在另一方向上使顶点移位多少。
举例来说,当单个图像中的顶点的-z世界(即,如由gl_Position.w变量定义)等于ZDPloc时,gl_Position.x+=0且gl_Position.y+=0。在此情况下,经修改顶点着色器38可不使左眼图像或右眼图像中的顶点移位,因为用于左眼图像的gl_Position.x和gl_Position.y分别等于用于右眼图像的gl_Position.x和gl_Position.y。然而,当单个图像中的顶点的-z世界并不等于ZDPloc时,则经修改顶点着色器38可基于观看角度针对左眼图像在一个方向上使顶点移位,且基于观看角度针对右眼图像在另一方向上使顶点移位。此外,因为由应用程序42产生的单个图像中的顶点的-z世界坐标可不同,所以经修改顶点着色器38可使单个图像中的不同顶点移位不同量以产生左眼图像和右眼图像。
换句话说,X和Y*宽度/高度变量与(1-(gl_Position.w/ZDPloc))的进一步乘法导致顶点在左眼图像和右眼图像中将移位多少的顶点层级确定。并且,因为单个图像中的顶点可基于z世界的值而移位不同量,所以在所得立体视图中,一些对象可出现在零视差平面前方,一些对象可出现在零视差平面处,且一些对象可出现在零视差平面后方。
在一些实例中,替代或补充进一步修改顶点着色器38的指令以将X和Y*宽度/高度变量与(1-(gl_Position.w/ZDPloc))相乘,图形驱动器包装器26可修改glViewport命令以调整零视差平面的位置。举例来说,应用程序42在由处理器22执行时还可即刻发出界定单个图像的检视区的命令(例如,界定显示器12上的单个图像的大小和位置的命令)。此命令可为glViewport命令。glViewport命令界定图像的开始坐标(例如,x和y坐标)以及图像的宽度和长度。开始坐标以及glViewport命令的宽度和长度值界定图像的大小和位置。
在一些实例中,图形驱动器包装器26可俘获由应用程序42发出的glViewport命令。在这些实例中,图形驱动器包装器26可阻挡图形驱动器24将由应用程序42发出的glViewport命令发射到GPU 30。作为替代,图形驱动器包装器26可将如由应用程序42发出的开始坐标以及glViewport命令的宽度和长度值存储在系统存储器36中。
在替代实例中,图形驱动器包装器26可允许图形驱动器24将由应用程序42发出的glViewport命令发射到GPU 30。在此实例中,类似于上文,图形驱动器包装器26可存储开始坐标以及如由应用程序42发出的glViewport命令的宽度和长度值。在此替代实例中,在GPU 30应用由应用程序42发出的glViewport命令之前,图形驱动器包装器26可修改由应用程序42发出的glViewport命令,且将经修改glViewport命令发射到GPU30。以此方式,虽然GPU 30接收由应用程序42发出的glViewport命令,但GPU 30可执行经修改glViewport命令,其是由图形驱动器包装器26修改。
在任一实例中,图形驱动器包装器26可随后等待直到应用程序42发出命令到GPU30指示GPU 30绘制一或多个基元。此绘制命令可为glDraw命令。存在glDraw命令的各种实例,例如glDrawArrays和glDrawElements。绘制命令的这些各种实例中的每一者通常被称为glDraw命令。
当应用程序42发出glDraw命令时,图形驱动器包装器26俘获glDraw命令,且阻挡图形驱动器24发射glDraw命令到GPU 30。图形驱动器包装器26随后产生致使GPU30产生用于左眼图像和右眼图像的图形内容的指令。作为一个实例,图形驱动器包装器36产生致使GPU 30执行经修改顶点着色器40的目标代码两次、发出界定用于左眼图像和右眼图像的检视区的两个glViewport命令且发出两个glDraw命令的指令。
在其中图形驱动器包装器26修改顶点着色器38的指令以将X和Y*宽度/高度变量与(1-(gl_Position.w/ZDPloc))相乘的实例中,图形驱动器包装器26可不修改glViewport命令,但仍可发出glViewport命令,左眼图像和右眼图像中的每一者一个。在其中图形驱动器包装器26并不修改顶点着色器38的指令以将X和Y*宽度/高度变量与(1-(gl_Position.w/ZDPloc))相乘的实例中,图形驱动器包装器26可修改glViewport命令,且发出两个glViewport命令,其中所述两个glViewport命令是由应用程序42发出的不同glViewport命令。
作为顶点之间的视差的顶点层级调整或左眼图像与右眼图像之间的视差的图像层级调整中任一者的技术的概述,在图形驱动器包装器26阻挡图形驱动器24发射由应用程序42发出的glDraw命令之后,图形驱动器包装器26发出命令到GPU 30,所述命令致使着色器处理器32使经修改顶点着色器40准备好产生立体视图的第一图像(例如,左眼图像)的裁剪坐标。随后,图形驱动器包装器26可发出第一glViewport命令到固定功能管线34的检视区变换单元,其界定显示器上的第一图像的大小和位置。图形驱动器包装器26可随后发出第一glDraw命令到GPU 30,所述命令致使GPU 30再现被限制于如由第一glViewport命令定义的显示器的第一部分的第一图像。
图形驱动器包装器26随后发出命令到GPU 30,所述命令致使着色器处理器22使经修改顶点着色器40准备好产生立体视图的第二图像(例如,右眼图像)的裁剪坐标。随后,图形驱动器包装器26可发出第二glViewport命令到固定功能管线34的检视区变换单元,其界定显示器上的第二图像的大小和位置。图形驱动器包装器26可随后发出第二glDraw命令到GPU 30,所述指令致使GPU 30再现被限制于如由第二glViewport命令定义的显示器的第二部分的第二图像。
在以下实例中更详细描述如上文概述描述的本发明的技术。仅为便于理解,在以下实例中,以GPU 30首先产生用于左眼图像的图形内容随后产生用于右眼图像的图形内容而描述所述技术;然而,相反情况也是可能的。
举例来说,在图形驱动器包装器26拦截glViewport命令且随后阻挡由应用程序42发出的glDraw命令之后,图形驱动器包装器26产生指示GPU 30产生左眼图像的裁剪坐标的指令。再次应注意,在一些实例中图形驱动器包装器26可阻挡由应用程序42发出的glViewport命令向GPU 30的发射。在其它实例中,图形驱动器包装器26可允许由应用程序42发出的glViewport命令发射到GPU 30。
作为一个实例,应用程序处理器22经由图形驱动器包装器26产生致使GPU 30执行经修改顶点着色器40的目标代码的指令。作为响应,GPU 30的着色器处理器32执行经修改顶点着色器40的目标代码。另外,应用程序处理器22经由图形驱动器包装器26发射常数值,经修改顶点着色器30将所述常数值添加到gl_Position.x变量来产生左眼图像的裁剪坐标。由于经修改顶点着色器40的目标代码的执行,着色器处理器42的输出是左眼图像的顶点的裁剪坐标。
举例来说,如上文所论述,出于将描述的原因,图形驱动器包装器26可将以下指令包含到顶点着色器38的源代码中:gl_Position.x+=(z*w世界/(R-L)/2)*X,或恰好gl_Position.x+=X且gl_Postion.y+=(z*w世界/(T-B)/2)*Y,或恰好gl_Position.y+=Y*宽度/高度。如上文所描述,对于顶点之间的视差的顶点层级调整,图形驱动器包装器26可进一步修改顶点着色器38的源代码中的gl_Position.x和gl_Postion.y命令。举例来说,在这些实例中,出于将描述的原因,图形驱动器包装器26可将以下指令包含到顶点着色器38的源代码中:gl_Position.x+=(z*w世界/(R-L)/2)*X*(1-(gl_Position.w/ZDPloc)),或恰好gl_Position.x+=X*(1-(gl_Position.w/ZDPloc))且gl_Postion.y+=(z*w世界/(T-B)/2)*Y*(1-(gl_Position.w/ZDPloc)),或恰好gl_Position.y+=Y*宽度/高度*(1-(gl_Position.w/ZDPloc))。
z、w世界、R、L、T和B变量可能是着色器处理器32已知的,如上文相对于等式(2)和(4)所描述。然而本发明的方面并不需要着色器处理器32知道z、w世界、R、L、T和B变量的值。举例来说,z、w世界、R、L、T和B变量可各自为常数,并且因此(z*w世界/(R-L)/2)和(z*w世界/(T-B)/2)的结果将是常数值。在此情况下,(z*w世界/(R-L)/2)和(z*w世界/(T-B)/2)的值可经估计或用户提供,且在适当时相乘到X或Y的值中。如更详细描述,在一些实例中,(z*w世界/(R-L)/2)可简化为1,且(z*w世界/(T-B)/2)可简化为显示器12的宽度/高度。
在一些实例中,着色器处理器32可不知道X和Y的值。对于左眼图像,除指示着色器处理器32执行经修改顶点着色器40的目标代码的指令之外,图形驱动器包装器26可将X和Y的值发射到着色器处理器32。在一些实例中,对于左眼图像,X的值可为+D*cos(α),且对于左眼图像,Y的值可为+D*sin(α),其中D等于观看者的眼睛之间的距离的近似二分之一,且可为用户界定或预编程的,且阿尔法α等于如由处理器22所确定的观看角度。因为变量X的值为+D*cos(α),所以gl_Position.x+=命令致使着色器处理器32将D*cos(α)的值添加到存储在gl_Position.x变量中的值(例如,将D*cos(α)添加到x裁剪的值)。而且,因为Y的值为+D*sin(α),所以gl_Position.y+=命令致使着色器处理器32将D*sin(α)*宽度/高度的值添加到存储在gl_Position.y变量中的值(例如,添加D*sin(α)*宽度/高度)。
再次,对于顶点的顶点层级调整,添加的gl_Position.x+=命令致使着色器处理器32将D*cos(α)*(1-(gl_Position.w)/(ZDPloc)的值添加到存储在gl_Position.x变量中的值,且添加的gl_Position.y+=命令致使着色器处理器32将D*sin(α)*(1-(gl_Position.w)/(ZDPloc)的值添加到存储在gl_Position.y变量中的值。然而,顶点的此顶点层级调整不是在每个实例中都是必要的。
图形驱动器包装器26还界定用于左眼图像的检视区。举例来说,在应用程序42发出glDraw命令时之前,应用程序42发出图形驱动器包装器26拦截的glViewport命令。图形驱动器包装器26还将开始坐标以及宽度和长度值存储在系统存储器36中。在其中图形驱动器包装器26修改顶点着色器38的指令用于顶点之间的视差的顶点层级调整的实例中,图形驱动器包装器26可不修改glViewport命令的指令,且可改为与由应用程序42发出的glViewport命令相同的两个glViewport命令。在其中图形驱动器包装器26并不修改顶点着色器38的指令用于顶点之间的视差的顶点层级调整的实例中,图形驱动器26可如下文所描述修改glViewport命令的指令以确定零视差平面的位置。
为了界定用于零视差平面的图像层级调整的左眼图像的检视区,图形驱动器包装器26可修改由应用程序42发出的经拦截glViewport命令。举例来说,glViewport命令包含四个变量,其中前两个变量界定显示器上的图像的开始坐标,且后两个变量界定图像的宽度和长度。宽度和长度变量不一定是坐标值。而是,宽度和长度变量界定图像从开始坐标延伸的量。举例来说,应用程序42可发出如下陈述的glViewport命令:glViewport(0,0,宽度,长度)。在此实例中,(0,0)指代显示器的左下方。变量“宽度”指代显示器的宽度,且变量“长度”指代显示器的长度。因此,在此实例中,应用程序42界定图像的检视区以涵盖显示器的全部,其将与单视图图像一致。然而,除图解说明的那些外,应用程序42可指派用于glViewport命令的不同变量。
根据本发明,图形驱动器包装器26可拦截glViewport命令(例如,先前实例的glViewport(0,0,宽度,长度)),且修改用于此检视区命令的变量。举例来说,图形驱动器包装器26可修改glViewport命令的变量以将左眼图像限制到显示器的所要部分。为易于描述,所述技术描述将左眼图像限制到显示器的左二分之一,且将右眼图像限制到显示器的右二分之一;然而,方面不限于此。
对于左眼图像,图形驱动器包装器26可将由应用程序42发出的glViewport命令修改为glViewport(0,0,宽度/2,长度)。在此实例中,宽度/2将为显示器的宽度的二分之一。举例来说,经修改glViewport命令指示左眼图像从显示器的左端开始(例如,从x轴上的0点开始)且向右延伸“宽度/2”的距离,其将左眼图像限制到显示器的左二分之一。并且,经修改glViewport命令指示左眼图像将从显示器的底部开始(例如,从y轴上的0点开始)且向上延伸“长度”的距离,其将图像限制到显示器的顶部和底部。
在任一实例(例如,其中glViewport命令经修改或其中glViewport命令不经修改)中,图形驱动器包装器26可随后发出第一glDraw命令到GPU 30。响应于glDraw命令,GPU30可通过固定功能管线34和片段着色器处理经修改顶点着色器40的目标代码的执行而产生的左眼图像的裁剪坐标。在具有glViewport命令修改的实例中,第一glViewport命令可将左眼图像限制到显示器的左二分之一。在不具有glViewport命令修改的实例中,第一glViewport命令可不将左眼图像限制到显示器的左二分之一。glDraw命令可随后致使GPU 30将左眼图像再现到用于临时存储的帧缓冲器。举例来说,所述帧缓冲器可存储左眼图像直到产生右眼图像。随后,GPU 30可将帧缓冲器的全部输出到显示处理器(未图示)。显示处理器可致使显示器显示左眼图像和右眼图像来产生立体视图。
图形驱动器包装器26可为了产生右眼图像而重复用于产生左眼图像的相同步骤。举例来说,图形驱动器包装器26发出另一指令以致使着色器处理器32执行经修改顶点着色器40的目标代码。另外,图形驱动器包装器26发射常数值,经修改顶点着色器40将从gl_Position.x变量减去所述常数值来产生右眼图像的裁剪坐标且从gl_Position.y变量减去所述常数值来产生左眼图像的裁剪坐标。由于经修改顶点着色器40的目标代码的执行,着色器处理器32的输出是右眼图像的顶点的裁剪坐标。
如上文所描述,图形驱动器包装器26可将指令gl_Position.x+=(z*w世界/(R-L)/2)*X或恰好gl_Position.x+=X添加到顶点着色器38的源代码,且添加指令gl_Position.y+=(z*w世界/(T-B)/2)*Y或恰好gl_Position.y+=Y*宽度/高度。对于左眼图像,变量X的值可为+D*cos(α)且变量Y的值可为+D*sin(α)。在本发明的实例中,对于右眼图像,变量X的值可为-D*cos(α)且变量Y的值可为-D*sin(α)。因为变量X的值为-D*cos(α),所以gl_Position.x+=命令致使着色器处理器32从存储在gl_Position.x变量中的值减去D*cos(α)的值。并且,因为变量Y的值是-D*sin(α),所以gl_Position.y+=命令致使着色器处理器32从存储在gl_Position.y变量中的值减去D*sin(α)*宽度/高度的值。
在一些实例中(例如,对于左眼图像与右眼图像之间的视差的图像层级调整),图形驱动器包装器26还界定用于右眼图像的检视区。如上文所论述,对于左眼图像,图形驱动器包装器26将检视区界定为glViewport(0,0,宽度/2,长度)以将左眼图像限制到显示器的左二分之一。对于右眼图像,图形驱动器包装器26可将检视区界定为glViewport(宽度/2,0,宽度/2,长度)。在此实例中,(宽度/2,0)坐标指示右眼图像将从显示器的中间开始且向右延伸。并且,glViewport命令中的(宽度/2,长度)变量指示右眼图像将延伸显示器的宽度的二分之一和显示器的全长度。
因此,在此实例中,经修改glViewport命令(例如,glViewport(宽度/2,0,宽度/2,长度))将把右眼图像限制到显示器的右二分之一。举例来说,经修改glViewport命令指示右眼图像将从显示器的中间开始(例如,从x轴上的宽度/2点开始)且向右延伸“宽度/2”的距离,其将把右眼图像限制到显示器的右二分之一。并且,经修改glViewport命令指示右眼图像将从显示器的底部开始(例如,从y轴上的0点开始)且向上延伸“长度”的距离,其将图像限制到显示器的顶部和底部。
图形驱动器包装器26可随后发出第二glDraw命令到GPU 30。响应于glDraw命令,GPU 30可通过固定功能管线34和片段着色器处理由经修改顶点着色器40的目标代码的执行产生的右眼图像的裁剪坐标。glDraw命令可随后致使GPU 30将右眼图像再现到用于临时存储的帧缓冲器。在此情况下,GPU 30可能已将左眼图像存储到帧缓冲器,且GPU 30可指示显示处理器从帧缓冲器检索且显示所存储的左眼图像和右眼图像来产生立体视图。
如上文所描述,图形驱动器包装器26可将指令gl_Position.x+=命令和gl_Position.y+=命令添加到顶点着色器38的源代码。添加到顶点着色器38的源代码的gl_Position.x+=命令和gl_Position.y+=命令基于观看角度而造成左眼图像与右眼图像之间的稍微位移,以带来立体视图的弹出或推动效果。
在上述对glViewport命令的修改的实例中,对glViewport命令的修改将左眼图像限制到显示器12的左二分之一,且将右眼图像限制到显示器12的右二分之一。然而,将左眼图像限制到显示器12的左二分之一且将右眼图像限制到显示器12的右二分之一可能不考虑观看角度α。并且,将左眼图像限制到显示器12的左二分之一且将右眼图像限制到显示器12的右二分之一可能不允许观看者设定ZDP的所要位置。
以下描述图形驱动器包装器26可修改glViewport命令以考虑观看角度且允许在所要位置设定零视差平面的方式。举例来说,如上,假定由应用程序42定义的检视区是glViewport(0,0,宽度,高度),其中显示器12的左下方的位置是(0,0),且显示器12的右上方的位置是(宽度,高度)。
在此情况下,对于左眼图像,图形驱动器包装器26可将glViewport命令修改为glViewport(-VP移位*cos(α),-VP移位*sin(α),宽度-VP移位*cos(α),高度-Vp移位*sin(α)),其中(-VP移位*cos(α),-VP移位*sin(α))是左眼图像的左下方,且(宽度-VP移位*cos(α),高度-Vp移位*sin(α))是左眼图像的右上方。对于右眼图像,图形驱动器包装器26可将glViewport命令修改为glViewport(VP移位*cos(α),VP移位*sin(α),宽度+VP移位*cos(α),高度+VP移位*sin(α)),其中(VP移位*cos(α),VP移位*sin(α))是右眼图像的左下方,且(宽度+VP移位*cos(α),高度+VP移位*sin(α))是右眼图像的右上方。
在以上实例中,VP移位变量可界定左眼图像与右眼图像之间的水平视差的量。举例来说,VP移位可为上述水平视差值。水平视差值可指示左眼图像和右眼图像的检视区相对于彼此移位的量(即,检视区移位的量),因此为变量VP移位。观看者可界定VP移位的值以界定零视差平面的位置。作为另一实例,处理器22可经配置以基于观看者相对于显示器12有多远的估计而确定VP移位的值。作为另一实例,应用程序22或图形驱动器包装器26可以用于VP移位的值预配置。
在一些实例中,图形驱动器包装器26可进一步修改用于左眼和右眼图像的glViewport命令用于检视区拉伸。检视区拉伸扩展了左眼图像和右眼图像的检视区以使得在左眼图像与右眼图像之间潜在地存在重叠。举例来说,在无检视区拉伸的情况下,左眼图像和右眼图像可被限制于显示器上的相应部分,且可不存在重叠。为了增加或减小重叠,应用程序处理器22经由图形驱动器包装器26可进一步修改glViewport命令以包含检视区拉伸。检视区拉伸还可影响零视差平面的位置,且可提供将零视差平面的位置控制到所要位置的另一方式。
修改glViewport命令以包含检视区拉伸不是在每个实例中都是必要的。此外,根据本发明中描述的技术,应用程序处理器22经由图形驱动器包装器26可基于观看角度修改glViewport命令以包含检视区拉伸。举例来说,应用程序处理器22经由图形驱动器包装器26可如下修改glViewport命令。对于左眼图像的检视区,应用程序处理器22经由图形驱动器包装器26可将glViewport命令修改为glViewport(-VP移位*cos(α),-VP移位*sin(α),宽度,高度)。对于右眼图像的检视区,应用程序处理器22经由图形驱动器包装器26可将glViewport命令修改为glViewport(0,0,宽度+VP移位*cos(α),高度+VP移位*sin(α))。
如上文所描述,本发明中描述的技术可在执行或运行时间期间修改用以产生单视图的图像的指令以产生立体视图的图像。举例来说,观看者可选择用于执行的应用程序42,其可需要执行顶点着色器38用于处理由应用程序42的执行产生的图形。在应用程序42在装置10上执行或运行的同时,图形驱动器24、图形驱动器包装器26和编译器28可在应用程序处理器22执行其相应功能以致使应用程序处理器22修改顶点着色器38的源代码且产生用于经修改顶点着色器40的目标代码。换句话说,3D图形到S3D图形转换是由应用程序处理器22经由图形驱动器包装器26在运行时间执行,而不需要经预编程的S3D图形内容或经预记录的S3D图像或视频。
并且,虽然上文实例是在其中应用程序处理器22经由图形驱动器包装器26添加指令到顶点着色器38和修改顶点着色器38的指令且修改界定检视区的指令的上下文中描述,但本发明的方面不限于此。在一些实例中,并非图形驱动器包装器26,应用程序处理器22经由图形驱动器24或编译器28修改顶点着色器38的指令和由应用程序42输出的指令可为可能的。然而,这些实例可需要对图形驱动器24或编译器28的修改。
对图形驱动器24或编译器28的修改可比开发图形驱动器包装器26且使应用程序处理器22经由图形驱动器包装器26执行本发明中描述的功能以使得GPU 30产生用于立体视图的左眼图像和右眼图像更困难。举例来说,装置10可能已经加载有预先存在的图形驱动器24和编译器28,且可能难以改变图形驱动器24和编译器28。通过添加图形驱动器包装器26以致使应用程序处理器22执行对顶点着色器38的修改,实例技术可不需要对预先存在的图形驱动器24和编译器28的修改。
此外,上述技术可允许GPU 30产生立体视图的图像而无需对应用程序42的修改。举例来说,产生立体视图的一些其它技术可需要应用程序42的开发者修改应用程序42的源代码来产生左眼和右眼图像的像素值。这些技术需要来自应用程序42的开发者的辅助以修改其应用程序用于立体视图,这可为应用程序42的开发者的潜在繁琐的任务。上述实例技术可为针对单视图开发的应用程序42提供立体视图,而无需来自应用程序42的开发者的任何辅助。
此外,已经提出一些其它技术以在运行时间将3D图形转换到S3D图形。然而,这些其它技术可能不考虑观看角度。举例来说,在这些其它技术中,如果观看角度改变,那么所得立体视图可表现为不太理想。通过考虑观看角度,不管观看者正观看显示器12的角度或不管显示器12的角度,所述技术都提供较丰富的观看体验。
并且,上述技术可不需要对系统存储器26的多次调用以产生用于立体视图的左眼和右眼图像。举例来说,在产生立体视图的一些其它技术中,GPU将产生左眼图像。在左眼图像的产生完成之后,GPU将即刻利用在产生左眼图像时存储在系统存储器36中的深度信息来产生右眼图像。然而,对系统存储器36的重复调用以检索深度信息可为计算上昂贵的且可能需要过量的电力消耗。
上述实例技术可不需要为了左眼图像的深度信息对系统存储器36的此些多次调用来产生右眼图像。举例来说,图形驱动器包装器26可修改顶点着色器38的源代码和界定检视区的指令来独立于彼此产生左眼和右眼图像,而不一定需要一个图像的深度信息来产生另一图像。
如上文所描述,图形驱动器包装器26可将gl_Position.x+=(z*w世界/(R-L)/2)*X或恰好gl_Position.x+=X命令包含到顶点着色器28的源代码中,其修改gl_Position.x变量的值,且包含gl_Position.y+=(z*w世界/(T-B)/2)*Y或恰好gl_Position.x+=Y*宽度/高度,其中X等于D*cos(α)或-D*cos(α),且Y等于D*sin(α)或-D*sin(α)。再次,如果需要顶点的顶点层级调整,那么图形驱动器包装器26可进一步将X和Y变量与(1-gl_Position.w/ZDPloc)相乘,其中gl_position.w存储等于-z世界的w裁剪坐标,且ZDPloc是所要零视差平面位置。以下提供此将指令包含到顶点着色器38的源代码中的原因。
如上文等式(1)所指出,V裁剪=PRJ*V眼睛=PRJ*MVT*V世界。可修改用于V裁剪的等式来产生左眼和右眼的裁剪坐标。举例来说,左眼和右眼的裁剪坐标可为:
V裁剪_左眼=PRJ*VT左眼*V眼睛=PRJ*VT左眼*MVT*V世界 (等式8),且
V裁剪_右眼=PRJ*VT右眼*V眼睛=PRJ*VT右眼*MVT*V世界 (等式9)。
VT左眼和VT右眼可为基于左眼和右眼远离单视图的假定距离的4x4矩阵。单视图的坐标可为(0,0,0),且左眼可视为位于(D*cos(α),D*sin(α),0),如等式6中描述,且右眼可视为位于(-D*cos(α),-D*sin(α),0)。换句话说,(0,0,0)位置可视为处于观看者的右眼和左眼的中间。如果左眼视为位于远离右眼与左眼的中间的(D*cos(α),D*sin(α))处,且右眼视为位于远离右眼与左眼的中间的(-D*cos(α),-D*sin(α))处,那么D指示观看者的右眼与左眼之间的距离的二分之一,且阿尔法α指示观看角度。
VT左眼和VT右眼的矩阵可定义为:
VT左眼和VT右眼可重写为两个矩阵的和。举例来说,VT左眼可重写为
VT右眼可重写为
通过将VT左眼矩阵代入用于V裁剪_左眼的等式(等式7),V裁剪_左眼等于:
通过将VT右眼矩阵代入用于V裁剪_右眼的等式(等式8),V裁剪_右眼等于:
在等式10和11两者中(例如,用于V裁剪_左眼和V裁剪_右眼) P R J * 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 * M V T * V 世界可简化为PRJ*MVT*V世界,因为 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 是单位矩阵且等效于乘以一。
如上文等式1中描述,PRJ*MVT*V世界等于V裁剪。因此,V裁剪_左眼和V裁剪_右眼等式(例如,分别为等式10和11)可重写为:
通过代入用于PRJ和MVT的矩阵(分别为等式4和5),且执行等式11的矩阵乘法,用于V裁剪_左眼的等式可简化为:
代入V世界:
通过将矩阵相乘,V裁剪_左眼的所得值等于:
更具体来说:
在上文V裁剪_左眼的等式中,x裁剪是单个图像的x裁剪坐标,且y裁剪是单个图像的y裁剪坐标。((z/((R-L)/2)*D*cos(α)*w世界是添加到左眼图像的x裁剪的值。((z/((T-B)/2)*D*sin(α)*w世界是添加到左眼图像的y裁剪的值。z和w世界值与用于由应用程序42产生的单个图像的值相同。添加到x裁剪和y裁剪的值是基于观看角度(α)以及显示器12的宽度与高度之间的比率。
通过与用于V裁剪_左眼的代入相似的代入,V裁剪_右眼可简化为:
更具体来说:
从等式14和15可见,通过将常数加到计算的x裁剪坐标且将常数加到计算的y裁剪,且保持所有其它裁剪坐标相同,顶点着色器38可产生用于左眼图像的裁剪坐标。类似地,通过从x裁剪坐标减去常数且从y裁剪坐标减去常数且保持所有其它裁剪坐标相同,顶点着色器38可产生用于右眼图像的裁剪坐标。出于至少这些原因,图形驱动器包装器16可包含指令gl_Position.x+=z*w世界/((R-L)/2)*X,其中X等于+D*cos(α),以及指令gl_Position.y+=z*w世界/((T-B)/2)*Y,其中Y等于+D*sin(α),以产生左眼图像,且其中X等于-D*cos(α)且Y等于-D*sin(α)以产生右眼图像。
在一些实例中,进一步简化gl_Position.x+=命令为仅gl_Position.x+=X可为可能的。举例来说,w世界变量设定成1是常见的。并且,具有可编程着色器的OpenGL、OpenGLES和OpenGL ES 2.0将锥台界定为:其中fovx是OpenGL、OpenGLES和OpenGL ES 2.0中界定的锥台。观看角度设定成45度也是常见的,这意味着cot(fovx)等于1。这意味着等于1。因此,在这些实例中,简化为恰好X(例如,等于1,且w世界等于1)。在这些实例中,gl_Position.x+=变量可简化为gl_Position.x+=X。
并且,显示器12的宽度可等于R-L,且显示器12的高度可等于T-B。因此,指令gl_Position.y+=z*w世界/((T-B)/2)*Y可向下简化为指令gl_Position.y+=Y*宽度/高度。
因此,以上等式提供说明将指令gl_Position.x+=(z*w世界/(R-L)/2)*X或gl_Position.x+=X和gl_Position.y+=(z*w世界/(T-B)/2)*Y或gl_Position.y+=Y添加到顶点着色器38在执行两次时可足以基于观看角度使单视图图像移位以产生立体视图的原因的数学基础,且其中在第一执行中X等于+D*cos(α)且Y等于+D*sin(α),且其中在第二执行中X等于-D*cos(α)且Y等于-D*sin(α)。此外,甚至在其中(z*w世界/(R-L)/2)不等于1的实例中,以及在其中(z*w世界/(T-B)/2)不等于宽度/高度的实例中,z*w世界/(R-L)/2*D也可为观看者可选择其值的常数值,且类似地,z*w世界/(T-B)/2*D也可为观看者可选择其值的常数值。
换句话说,在本发明中描述的技术中,可不需要z、w世界、R、L、T、B和D的实际值。而是,观看者可选择z*w世界/(R-L)/2*D的第一值,以及z*w世界/(R-L)/2*D的第二值。图形驱动器包装器26可将第一值与cos(α)相乘,且将所得值提供到顶点着色器38。图形驱动器包装器26在顶点着色器38中包含的顶点着色器38中的gl_Position.x+=命令可将由图形驱动器包装器26提供的值添加到gl_Position.x的当前值以确定用于左眼图像的经修改顶点着色器40的目标代码的第一执行中的顶点的x裁剪坐标。并且,图形驱动器包装器26可将第二值与sin(α)相乘,且将所得值提供到顶点着色器38。图形驱动器包装器26在顶点着色器38中包含的顶点着色器38中的gl_Position.y+=命令可将由图形驱动器包装器26提供的值添加到gl_Position.y的当前值以确定用于左眼图像的经修改顶点着色器40的目标代码的第一执行中的顶点的y裁剪坐标。
类似地,图形驱动器包装器26可将第一值与-1和cos(α)相乘,且将所得值提供到顶点着色器38。图形驱动器包装器26在顶点着色器38中包含的顶点着色器38中的gl_Position.x+=命令可将由图形驱动器包装器26提供的值添加到gl_Position.x的当前值以确定用于右眼图像的经修改顶点着色器40的目标代码的第二执行中的顶点的x裁剪坐标。并且,图形驱动器包装器26可将第二值与-1和sin(α)相乘,且将所得值提供到顶点着色器38。图形驱动器包装器26在顶点着色器38中包含的顶点着色器38中的gl_Position.y+=命令可将由图形驱动器包装器26提供的值添加到gl_Position.y的当前值以确定用于右眼图像的经修改顶点着色器40的目标代码的第二执行中的顶点的y裁剪坐标。
在一些实例中,观看者可选择用于gl_Position.x+=命令和gl_Position.y+=命令的修改的第一值和第二值的值和/或VP移位和ZDPloc的值。这可允许观看者按需要精细调谐立体效果。举例来说,观看者可能够通过界定顶点移位的量和零视差平面的位置而个性化立体效果。
以此方式,本发明的技术可提供对针对单视图设计的顶点着色器38的较小修改以使得当编译且执行经修改顶点着色器时(例如,经修改顶点着色器40的目标代码的执行),所得图像可为观看者提供立体视图。立体视图可为观看者提供3D体验,与观看受显示器的2D区域限制的图像相比其可为较丰富的、较完整的体验。
图6是说明零视差平面的位置的概念图。举例来说,原始视点的位置可为(0,0,0)位置。左眼可处于远离原始视点的距离D,且右眼可处于远离原始视点的距离-D。举例来说,左眼可位于(-D*cos(α),-D*sin(α)),且右眼可位于(D*cos(α),D*sin(α))。
从左眼视点和右眼视点延伸的成角度线分别说明左眼和右眼看见的区域。从左眼视点和右眼视点延伸的直线说明观看者相对于显示器12的定向的定向(即,观看角度)。在此实例中,观看角度是0。
如图6中所示,ZDP的位置处于显示器12的前方,且在由应用程序42定义的z和z裁剪平面内。ZDP的位置可基于两个因数。一个因数可为D的选定值。另一因数可为VP移位的值(即,水平视差值),其指示左眼图像与右眼图像之间的视差。通过选择D和VP移位的值,观看者可选择ZDP的所要位置。在这些实例中,由应用程序42产生的图像中的所有对象可出现在ZDP内(例如,显示器12的前方,而不是被限制于显示器12的表面内)。如上文所描述,应用程序处理器22确定D和VP移位的值可为可能的。
此外,在一些实例中,VP移位可能不是必要的,且观看者或应用程序处理器22可确定ZDP的位置。在这些实例中,图形驱动器包装器26可基于ZDP的位置修改存储在gl_Postion.x和gl_Position.y变量中的值以使得一些对象出现在ZDP前方,一些对象出现在ZDP处,且其它对象出现在ZDP后方。
图7是说明根据本发明中描述的一或多个实例技术的左眼图像与右眼图像之间的水平视差的概念图。举例来说,图7说明右眼图像45A和左眼图像45B。在此实例中将水平视差指示为VP移位*2。如图7中示出,水平视差处于图像层级(即,右眼图像45A与左眼图像45B中的所有顶点之间的视差是相同的)。如上文所描述,应用程序处理器22或观看者可选择VP移位的值。通过选择VP移位的值,观看者或应用程序处理器22可界定零视差平面的位置。
图8是说明可实施本发明中描述的一或多个实例技术的图形处理单元(GPU)的实例的框图。举例来说,图8更详细地说明GPU 30的组件。如图8中所示,GPU 30包含命令处理器66、着色器处理器32以及固定功能管线34。命令处理器66可充当GPU 30与应用程序处理器22之间的接口。举例来说,命令处理器66可从应用程序处理器22接收命令,且可确定所述命令是否应转发到着色器处理器32或固定功能管线34。作为另一实例,命令处理器66可从应用程序处理器22接收观看角度。
作为一个实例,如上文所描述,执行应用程序42的应用程序处理器22可指示GPU30执行经修改顶点着色器40的目标代码。在此实例中,命令处理器66可从应用程序处理器22接收命令,且可指示着色器处理器32执行经修改顶点着色器40的目标代码。作为另一实例,在一些实例中,如上文所描述,图形驱动器包装器26可修改由应用程序42发出的glViewport命令,且将经修改glViewport命令提供到GPU 30。在此实例中,命令处理器66可接收经修改glViewport命令,且确定此命令是用于固定功能管线34的检视区变换单元54。命令处理器66可将经修改glViewport命令转发到检视区变换单元54用于应用左眼图像和右眼图像的检视区。
举例来说,如上文所描述,应用程序42可发出glDraw命令,图形驱动器包装器26阻挡所述命令发射到GPU 30。glDraw命令可将图形驱动器包装器26触发为发出第一指令到着色器处理器42以执行经修改顶点着色器40的目标代码。进而,着色器处理器42执行经修改顶点着色器40的目标代码,且将所得裁剪坐标存储在其本地存储器或系统存储器36中。
glDraw命令还致使图形驱动器包装器26发出第一glViewport指令,其由命令处理器66接收。在其中不需要左眼与右眼图像之间的水平视差的图像层级调整的实例中,图形驱动器包装器26可不修改第一glViewport命令。在其中需要左眼与右眼图像之间的水平视差的图像层级调整的实例中,图形驱动器包装器26可基于观看角度和VP移位的值修改第一glViewport命令。
随后,图形驱动器包装器26发出第一glDraw命令,其由命令处理器66接收。命令处理器66作为响应致使固定功能管线34的固定功能单元和着色器处理器32执行其相应功能以产生用于立体视图的第一图像(例如,左眼图像)的图形内容。举例来说,如更详细论述,响应于第一glDraw命令,且当需要水平视差的图像层级调整时,检视区变换单元54将第一图像限制到显示器的第一部分,且每片段操作单元62将第一图像的图形内容输出到帧缓冲器64。
在立体视图的第一图像存储在帧缓冲器64中之后,GPU 30重复所述步骤来产生用于立体视图的第二图像的图形内容。举例来说,图形驱动器包装器26发出第二指令到着色器处理器32以执行经修改顶点着色器40的目标代码。进而,着色器处理器32执行经修改顶点着色器40的,且将所得裁剪坐标存储在其本地存储器或系统存储器36中。图形驱动器包装器26还发出第二glViewport指令,其由命令处理器66接收。再次,在需要图像层级的视差调整的情况下可修改glViewport指令,且在不需要图像层级的视差调整的情况下可不修改glViewport指令。
随后,图形驱动器包装器26发出第二glDraw命令,其由命令处理器66接收。命令处理器66作为响应致使固定功能管线34的固定功能单元和着色器处理器32执行其相应功能以产生用于立体视图的第二图像(例如,右眼图像)的图形内容。举例来说,响应于第二glDraw命令,且当需要水平视差的图像层级调整时,检视区变换单元54将第二图像限制到显示器的第二部分,且每片段操作单元62将第二图像的图形内容输出到帧缓冲器64。
如图8中的虚线方框中所示,着色器处理器32包含经修改顶点着色器40和片段着色器58。虚线方框指示着色器处理器32可实际上不包含经修改顶点着色器40和片段着色器58。而是,着色器处理器32可执行经修改顶点着色器40和片段着色器58的目标代码。经修改顶点着色器40和片段着色器58的目标可存储在系统存储器36中。
固定功能管线34可包含一或多个固定功能单元,例如基元组装单元48、锥台单元50、视角划分单元52、检视区变换单元54、光栅化单元56以及每片段操作单元62。固定功能管线34的这些固定功能单元中的每一者可为经硬接线以执行特定图形相关功能的硬件单元。虽然固定功能管线34的这些固定功能单元说明为单独的组件,但本发明的方面不限于此。固定功能管线34的固定功能单元中的一或多者可一起组合为共同固定功能单元。并且,可存在比图8中说明的那些单元多的固定功能管线34的固定功能单元。固定功能管线34的所述一或多个固定功能单元经单独地说明以便于理解。
此外,固定功能管线34的固定功能单元的特定排序是为了实例目的而说明且不应被视为具限制性。举例来说,重排序固定功能管线34的固定功能单元可为可能的。作为一个实例,每片段操作单元62的功能中的一者可为剔除由重叠像素遮挡的像素。此功能在固定功能管线34中较早执行可为可能的。
与着色器处理器32相比,固定功能管线34的这些固定功能单元可提供极受限的功能灵活性。举例来说,着色器处理器32可经具体地设计以执行可编程着色器程序,例如经修改顶点着色器40和片段着色器58。这些着色器程序致使着色器处理器32以由着色器程序定义的方式起作用。换句话说,着色器程序可界定着色器处理器32的功能性,而固定功能管线34的固定功能单元的功能性是设定的。
如上文所描述,图形驱动器包装器26可指示GPU 30执行经修改顶点着色器40的目标代码两次,其中第一执行是用于基于观看角度产生立体视图的图像中的一者(例如,左眼图像)的顶点的裁剪坐标且第二执行是用于基于观看角度产生立体视图的另一图像(例如,右眼图像)的顶点的裁剪坐标。作为响应,为了这些指令中的每一者执行经修改顶点着色器40的目标代码,命令处理器66可指示着色器处理器32检索经修改顶点着色器40的目标代码且执行经修改顶点着色器40的目标代码。如上文所描述,编译器28可编译经修改顶点着色器的源代码且存储所得目标代码作为经修改顶点着色器40的目标代码。
如图8中所示,经修改顶点着色器40可接收顶点阵列46和纹理60作为输入。顶点阵列46可包含信息以产生由应用程序42产生的顶点的像素值(例如,顶点的坐标、顶点的颜色值以及顶点的透明度值),如上文所描述。举例来说,顶点阵列46的顶点的坐标可为如由应用程序42定义的世界坐标。纹理60可为上覆于所产生图形上方以提供图形内容的较实际视图的纹理的像素值。
在着色器处理器32上执行的经修改顶点着色器40可产生顶点中的每一者的裁剪坐标。举例来说,经修改顶点着色器40可通过执行如上文相对于图1所论述的等式1的矩阵乘法将如由应用程序42定义且存储在顶点阵列46中的顶点的世界坐标转换为顶点中的每一者的裁剪坐标。此外,在着色器处理器32上执行的经修改顶点着色器40可针对顶点中的每一者的裁剪坐标基于观看角度而更新gl_Position.x和gl_Position.y变量,以在经修改顶点着色器40的目标代码的第一执行中提供左眼图像的位移且在经修改顶点着色器40的目标代码的第二执行中提供右眼图像的位移。并且,经修改顶点着色器40可执行额外常规顶点着色器任务。举例来说,经修改顶点着色器40可执行顶点上的照明功能。
在经修改顶点着色器40执行模型视图变换(例如,世界视图坐标到裁剪坐标的转换,包含以gl_Position.x+=命令和gl_Position.y+=命令的位移)之后,经修改顶点着色器40将顶点的裁剪坐标提供到固定功能管线34的基元组装单元48。基元组装单元48可利用顶点的裁剪坐标来将顶点组装为基元。举例来说,基元组装单元48可基于顶点的裁剪坐标组装多个三角形,其中所述三角形中的每一者的顶点对应于从经修改顶点着色器40接收的顶点。所述多个三角形是基元的一个实例。一般来说,基元组装单元48可基于所接收的顶点的裁剪坐标将所接收的顶点组装成任何多边形。
基元组装单元48可将组装的基元发射到锥台单元50。锥台单元50可确定组装的基元是否在视图体积内。举例来说,如上文所描述,OpenGL、OpenGL ES和OpenGL ES 2.0可将特定视图体积界定为(fovx)。然而,锥台可使用(例如)glFrustum功能由用户定义。锥台单元50可确定基元是否完全在视图体积内、完全在视图体积外部,或部分地在视图体积内且部分地在视图体积外部。锥台单元50可从进一步处理剔除完全在视图体积外部的基元以及基元的在视图体积外部的部分。锥台单元50可保持完全在视图体积内的基元以及基元的在视图体积内的部分用于进一步处理。
锥台单元50可将剩余基元和基元的部分发射到视角划分单元52。视角划分单元52可基于基元的深度而扩展或收缩基元。举例来说,基元中的每一者可由x、y和z坐标定义。z坐标可指示基元靠近或远离的程度。应注意在此阶段,GPU 30正在产生立体视图的图像中的一者的图形内容。因此,基元的接近度的概念是在单视图而不是立体视图的上下文中。
举例来说,视角划分单元52可收缩一些基元且扩展其它基元。这可产生单视图中的收缩基元与扩展基元相比进一步远离的感知。如上文所描述,当显示这些单视图图像时观看者感知到立体视图。换句话说,视角划分单元52可致使左眼图像和右眼图像为在显示器的2D区域中显示的3D图像。当观看者观看这些3D图像时,在左眼图像和右眼图像中由gl_Position.x+=命令和gl_Position.y+=命令的添加造成的位移致使观看者感知到涵盖3D体积的立体3D(S3D)图像。
视角划分单元52可将基元发射到检视区变换单元54。检视区变换单元54修改图像的大小和位置以配合经界定检视区。举例来说,在检视区变换单元54之前,经修改顶点着色器40和固定功能管线34的固定功能单元如同图像将在显示器的全部上显示那样处理图形数据。检视区变换单元54的功能可为修改图像的大小和位置以使得图像被限制于经界定检视区。
应理解,在其中需要左眼图像和右眼图像中的顶点之间的视差的顶点层级调整的实例中,检视区变换单元54可将左眼图像的检视区界定为与由应用程序42定义的单个图像的检视区相同。类似地,在此实例中,检视区变换单元54可将右眼图像的检视区界定为与由应用程序42定义的单个图像的检视区相同。在其中不需要左眼图像和右眼图像中的顶点之间的视差的顶点层级调整的实例中,检视区变换单元54可将左眼图像限制到如由经修改glViewport命令定义的一个部分,且将右眼图像限制到如由经修改glViewport命令定义的另一部分。
举例来说,如上文所描述,在可产生左眼图像的图形内容(例如,顶点的裁剪坐标)的顶点着色器40的目标代码的第一执行之后,图形驱动器包装器26可修改左眼图像的检视区以将左眼图像限制到显示器12的一个部分(例如,显示器12的左二分之一)。举例来说,在顶点着色器40的目标代码的第一执行之后,图形驱动器包装器26可将由应用程序42先前发出且被阻挡于GPU 30的glViewport(0,0,宽度,长度)命令修改为glViewport(-VP移位*cos(α),-VP移位*sin(α),宽度-Vp移位*cos(α),高度-Vp移位*sin(α)),且将此第一经修改glViewport命令提供到GPU 40。命令处理器66可将第一经修改glViewport命令提供到检视区变换单元54。检视区变换单元54可随后修改从视角划分单元52接收的基元的大小以使得在此实例中这些基元被限制于显示器的一半。
在顶点着色器40的目标代码的第二执行之后,检视区变换单元54可针对右眼图像执行相似功能。举例来说,顶点着色器40的目标代码的第二执行可用于产生右眼图像的图形内容(例如,顶点的裁剪坐标)。在顶点着色器40的目标代码的此第二执行之后,图形驱动器包装器26可将由应用程序42先前发出且被阻挡于GPU 30的glViewport(0,0,宽度,长度)命令修改为glViewport(VP移位*cos(α),VP移位*sin(α),宽度+VP移位*cos(α),高度+VP移位*sin(α)),且将此第二经修改glViewport命令提供到GPU 30。命令处理器66可将第二经修改glViewport命令转发到检视区变换单元54。以此方式,GPU 40可操作以在应用程序32的运行时间期间从由应用程序32产生的单视图图像产生用于立体视图的左眼和右眼图像,且无需依赖于深度信息来从左眼图像产生右眼图像且反之亦然。
在遵从第一经修改glViewport命令和第二经修改glViewport命令中的每一者修改检视区之后,检视区变换单元54可将基元转发到光栅化单元56。光栅化单元56可将基元转换为显示器的像素。举例来说,光栅化单元56可确定基元中的每一者涵盖显示器的哪些像素。光栅化单元56还可确定显示器上这些像素中的每一者的位置。
光栅化单元56可将其图形数据输出到片段着色器58。有时称为像素着色器的片段着色器58可为在着色器处理器32上执行的着色器程序。举例来说,用于片段着色器58的源代码可存储在系统存储器36中,且编译器28可编译片段着色器58的源代码来产生片段着色器58的目标代码。或者,系统存储器36可存储用于片段着色器58的目标代码而无需其一定由编译器28产生。
片段着色器58可输出显示器上的像素中的每一者的颜色值。举例来说,片段着色器58可基于红绿蓝(RGB)分量界定每一像素的颜色。作为一个说明性实例,片段着色器58可利用8位来界定红色分量,8位来界定绿色分量,以及8位来界定蓝色分量。片段着色器58可将颜色值输出到每片段操作单元62。
每片段操作单元62可剔除不可观看的像素。举例来说,较远离对象的像素可由较靠近对象的像素重叠,每片段操作单元62可从z缓冲器确定此情形。所述重叠可致使所述较远离对象的像素被完全遮挡。在此情况下,每片段操作单元62可剔除重叠像素。每片段操作单元62还可将像素掺合在一起。举例来说,重叠像素可为半透明的以使得其并不完全遮挡重叠像素。在此情况下,每片段操作单元62可将这些像素的颜色掺合在一起。
每片段操作单元62的输出可为显示器上的像素的像素值(例如,颜色)。每片段操作单元62可将像素值输出到系统存储器36的帧缓冲器64用于临时存储。帧缓冲器64可存储显示器上的像素中的每一者的像素值。
帧缓冲器64可视为存储位置的2D阵列。具有帧缓冲器64的存储位置的数目可为显示器12的像素的数目的两倍。并且,帧缓冲器64内的两个存储位置可对应于显示器上的一个位置。举例来说,帧缓冲器64可包含两个半部,其中每一半部包含用于显示器12的全部的存储位置。在此实例中,帧缓冲器64内的第一半部内的左上存储位置和第二半部内的左上存储位置可对应于显示器的左上像素,帧缓冲器64内的第一半部内的左上存储位置右边的存储位置和第二半部内的左上存储位置右边的存储位置可对应于显示器的左上像素右边的像素,等等。
在第一glDraw命令的完成之后,位于第一半帧缓冲器64中的存储位置可存储左眼图像的像素值。类似地,在第二glDraw命令的完成之后,位于帧缓冲器64的第二半部中的存储位置可存储右眼图像的像素值。因此,在第一和第二glDraw命令的完成之后,帧缓冲器64可存储左眼图像的像素值和右眼图像的像素值。
图9是说明可实施本发明中描述的一或多个实例技术的图形处理单元(GPU)的另一实例的框图。举例来说,图9说明OpenGL ES 2.0图形管线,且说明本发明中描述的技术可在OpenGL ES 2.0图形管线中实施的方式。图9中类似于图8的单元被给定相同参考标号,且相对于图9不进一步描述。
图9说明OpenGL ES 2.0 API 66,其可为图形驱动器24实施的API。换句话说,OpenGL ES 2.0 API 66可为图形驱动器24的一个实例。如所示,OpenGL ES 2.0输出顶点阵列46、对经修改顶点着色器40的命令、纹理60以及对片段着色器58的命令。经修改顶点着色器40接收来自顶点阵列46的世界坐标顶点和来自纹理60的纹理且基于观看角度产生裁剪坐标。基元组装单元48、光栅化单元56、片段着色器58、每片段操作单元62以及帧缓冲器64可执行与相对于图7描述的那些功能相似的功能。
图10A-10C是说明根据本发明中描述的一或多种技术的实例结果的概念图。在图10A-10C的实例中,由应用程序42产生的单个图像的分辨率可为显示器12的分辨率的二分之一。因此,在图10A-10C中,左眼图像在显示器12的二分之一上出现,且右眼图像在显示器12的另一二分之一上出现。举例来说,图10A说明左眼图像68A和右眼图像68B,图10B说明左眼图像70A和右眼图像70B,且图10C说明左眼图像72A和右眼图像72B。在图10A-10C中,观看者的左眼可仅看见左眼图像,且不可看见右眼图像,且观看者的右眼可仅看见右眼图像,且不可看见左眼图像。
图10A说明当观看角度是0(即,横向模式中)时的实例结果。图10B说明其中观看者垂直转动装置10的实例,其中观看角度相对于图10A的实例可为90°。在图10B的实例中,虽然观看者装置10的定向差90°,且再现的图像内容改变90°,但左眼图像70A与右眼图像70B之间的视差仍在水平方向上。因此,对于例如图9C中说明的任何给定观看角度,左眼图像72A与右眼图像72B之间的视差仍在水平方向上。
图11是进一步详细说明图5的实例装置的框图。举例来说,图11进一步详细说明图5的装置10。举例来说,如上文所指出,装置10的实例包含(但不限于)移动无线电话、PDA、包含视频显示器的视频游戏控制台、移动视频会议单元、膝上型计算机、桌上型计算机、电视机机顶盒及类似物。
如图11中所示,装置10可包含显示器12、应用程序处理器22、GPU 30、包含帧缓冲器64的系统存储器36、相机处理器44、收发器模块74、用户接口76、显示处理器78和相机80。显示器12、应用程序处理器22、GPU 30、系统存储器36、一或多个传感器42和相机处理器44可大体上类似或等同于图1和5中说明的那些。出于简洁的目的,仅详细地描述图11中所示的组件而不详细地描述图1和5中未图示的组件。
如图11中所示,出于清楚起见,装置10可包含图11中未图示的额外模块或单元。举例来说,装置10可包含扬声器和麦克风(其皆未在图11中展示)以在装置10为移动无线电话或扬声器(其中装置10为媒体播放器)的实例中实现电话通信。此外,装置10中所示的各种模块和单元可能不是在装置10的每个实例中都是必要的。举例来说,在其中装置10是桌上型计算机或经装备以与外部用户接口或显示器介接的其它装置的实例中用户接口76和显示器12可在装置10外部。
相机80可为经配置以俘获视频或图像的面向前方的光学相机。相机80可将其俘获的视频或图像输出到相机处理器44。相机处理器44可如上文所描述基于俘获的视频或图像确定观看者定向。
用户接口76的实例包含(但不限于)轨迹球、鼠标、键盘及其它类型的输入装置。用户接口76也可为触摸屏且可并入作为显示器12的一部分。收发器模块74可包含电路以允许装置10与另一装置或网络之间的无线或有线通信。收发器模块74可包含一或多个调制器、解调器、放大器、天线和其它此类电路以用于有线或无线通信。
显示处理器78可经配置以致使显示器12显示立体视图。可存在显示处理器78可用来致使显示器12显示立体视图的各种技术,且本发明的方面可利用这些技术中的任一者。举例来说,显示处理器78可从帧缓冲器64的一半检索左眼图像,从帧缓冲器64的另一半检索右眼图像,且将所述两个图像交错在一起以获得立体视图。
作为另一实例,显示处理器78可控制显示器12的刷新率。在此实例中,在每一刷新循环期间,显示处理器78可在左眼图像与右眼图像之间循环。举例来说,对于一个刷新循环,显示处理器78可从帧缓冲器64的一半检索左眼图像,将左眼图像扩展到显示器12的全部,且在显示器12上显示左眼图像。随后,对于下一刷新循环,显示处理器78可执行大体上类似功能,但是针对存储在帧缓冲器64的另一半中的右眼图像。换句话说,显示器12可显示左眼图像,随后是右眼图像,随后是左眼图像,等等。
观看者可佩戴与显示处理器78的刷新率同步的专用眼镜。举例来说,在显示器12显示左眼图像的同时,所述专用眼镜可关闭右镜片以使得仅观看者的左眼俘获左眼图像。随后,在显示器12正在显示右眼图像的同时,所述专用眼镜可关闭左镜片以使得仅观看者的右眼俘获右眼图像,等等。如果刷新率足够快,那么观看者感知到立体视图,其中图像弹出或推入显示器12且包含3D体积。
在一些实例中,一些常规显示器处理器可不经配置以致使显示器12显示立体视图。在这些实例中,观看者可将装置10耦合到包含显示处理器的显示器,所述显示处理器例如显示处理器78,其经配置以致使显示器12呈现立体视图。举例来说,观看者可经由收发器模块74将装置10耦合到立体视图启用的电视。举例来说,观看者可经由高清晰度多媒体接口(HDMI)线将收发器模块74耦合到电视。在此实例中,应用程序处理器22或GPU 30可指示收发器模块74将存储在帧缓冲器64中的像素值发射到电视的显示处理器。此电视的显示处理器可随后致使电视显示左眼和右眼图像以形成立体视图。
图12是说明根据本发明中所描述的一或多个实例技术的实例操作的流程图。出于说明的目的,参考图3。
处理器22可执行应用程序42来产生用于单视图的图像(82)。处理器22可在应用程序42的运行时间期间实施图12的其它框。举例来说,处理器22可确定相对于显示器12的观看角度。在一些实例中,处理器22可在立体视图的每次产生时确定相对于显示器12的观看角度一次。为了确定观看角度,处理器22可例如通过相机处理器44确定至少一个观看者定向且例如通过一或多个传感器42确定显示器定向。
处理器22经由图形驱动器包装器26可接收用于顶点着色器38的指令(84)。顶点着色器38可经配置以对由应用程序42的执行产生的单视图的图像操作。
处理器22经由图形驱动器包装器26可基于观看角度修改顶点着色器的指令以包含一或多个指令来产生经修改顶点着色器(例如,在所述指令的包含之后编译器28编译顶点着色器38之后的经修改顶点着色器40)(86)。在此实例中,经修改顶点着色器40当在GPU 30的着色器处理器32上执行时可产生立体视图的顶点的顶点坐标。
举例来说,处理器22经由图形驱动器包装器26可在顶点着色器38中添加第一指令,其基于观看角度修改由应用程序42产生的单视图的图像的顶点的第一裁剪坐标(例如,x裁剪)。举例来说,图形驱动器包装器26可添加gl_Position.x+=X命令,其中X在经修改顶点着色器40的第一执行中等于D*cos(α)且在经修改顶点着色器40的第二执行中等于-D*cos(α)。处理器22经由图形驱动器包装器26可在顶点着色器38中添加第二指令,其基于观看角度修改由应用程序42产生的单视图的图像的顶点的第二裁剪坐标(例如,y裁剪)。举例来说,图形驱动器包装器26可添加gl_Position.y+=Y*宽度/高度,其中宽度和高度是显示器12的宽度和高度,且Y在经修改顶点着色器40的第一执行中等于D*sin(α)且在经修改顶点着色器40的第二执行中等于-D*sin(α)。
在一些实例中,作为选项,图形驱动器包装器26添加的第一和第二指令也可以基于零视差平面的位置。举例来说,图形驱动器包装器26可添加gl_Position.x+=X*(1-gl_Position.w/ZDPloc),且可添加gl_Position.y+=Y*宽度/高度*(1-gl_Position.w/ZDPloc)。gl_Position.w变量存储等于-z世界的w裁剪坐标,其中z世界是如由应用程序42定义的顶点的z坐标。ZDPloc指示零视差平面相对于显示器12的位置。
作为选项,处理器22经由图形驱动器包装器26可修改由应用程序42发出的检视区命令(例如,glViewport)(90)。检视区命令的此修改可为任选的且因此以虚线说明。处理器22经由图形驱动器包装器26可修改glViewport命令以调整立体视图的第一和第二图像之间的水平视差(例如,左眼图像与右眼图像之间的水平视差)。通过调整水平视差,图形驱动器包装器26可利用经修改glViewport命令来调整零视差平面的位置。
处理器22经由图形驱动器包装器26可指示GPU 30执行经修改顶点着色器40(92)。举例来说,处理器22经由图形驱动器包装器26可指示GPU 30基于观看角度在着色器处理器32上执行经修改顶点着色器40的目标代码的第一实例来产生立体视图的第一图像(例如,左眼图像)。处理器22经由图形驱动器包装器26可指示GPU 30基于观看角度在着色器处理器32上执行经修改顶点着色器40的目标代码的第二实例来产生立体视图的第二图像(例如,右眼图像)。
以下伪码提供图形驱动器包装器26和应用程序42的功能性的实例。此伪码有意帮助理解且不应被视为具限制性。
1.图形驱动器包装器26拦截由应用程序42发出的glShaderSource命令以拦截顶点着色器28的源代码。
2.图形驱动器包装器26将“均匀浮动X”和“均匀浮动Y”插入顶点着色器38的指令中,其中“均匀”是具有可编程着色器的OpenGL和OpenGL ES中的用户定义的标准属性变量。
3.图形驱动器包装器26在顶点着色器38的源代码中插入“gl_Position.x+=X”和“gl_Position.y+=Y*宽度/高度”命令。
3a.图形驱动器包装器26插入“gl_Position.x+=X*(1-gl_Position.w/ZDPloc”和“gl_Position.y+=Y*宽度/高度*(1-gl_Position.w/ZDPloc
4.应用程序42执行glCompileShader命令,其致使编译器28编译顶点着色器38的经修改源代码指令来产生经修改顶点着色器40的目标代码。
5.应用程序42执行以下命令以链接到经修改顶点着色器40的目标代码:
programObject=glCreateProgram();
glAttachShader(programObject,vertexShader);
glAttachShader(programObject,fragmentShader);
glLinkProgram(programObject)
6.图形驱动器包装器26当由应用程序42调用时拦截glDraw命令(例如,glDrawArrays和glDrawElements),且阻挡所述命令发射到GPU 30。
7.图形驱动器包装器26发出以下命令:
glGetInteger(GL_CURRENT_PROGRAM,&program);//得到指向当前顶点着色器的指针
在一些实例中,如上文所描述修改glViewport命令来产生左眼图像的检视区。
p1=glGetUniformLocation(program,X);得到指向均匀X的指针
p2=glGetUniformLocation(program,Y);得到指向均匀Y的指针
glUniform1f(p1,D*cos(α));//设定X的值等于D*cos(α).
glUniform1f(p2,D*sin(α));//设定Y的值等于D*sin(α)
glDraw command//致使GPU 30产生左眼图像的图形内容
8.重复从7之后的步骤,具有以下修改来产生右眼图像的图形内容:
如上文所描述修改glViewport命令来产生右眼图像的检视区。
glUniform1f(p1,-D*cos(α))//设定X的值等于-D*cos(α).
glUniform1f(p2,-D*sin(α))//设定Y的值等于-D*sin(α).
glDraw command//致使GPU 30产生右眼图像的图形内容。
在一或多个实例中,所描述功能可以硬件、软件、固件或其任何组合来实施。如果以软件来实施,那么可将所述功能作为一或多个指令或代码存储在计算机可读媒体上。计算机可读媒体可包含计算机数据存储媒体。数据存储媒体可以是可由一或多个计算机或一或多个处理器存取以检索用于实施本发明中描述的技术的指令、代码和/或数据结构的任何可用的媒体。借助于实例而非限制,此类计算机可读媒体可包括随机存取存储器(RAM)、只读存储器(ROM)、EEPROM、CD-ROM或其它光盘存储装置、磁盘存储装置或其它磁性存储装置或可用来存储呈指令或数据结构的形式的所要程序代码且可由计算机存取的任何其它媒体。本文中使用的磁盘和光盘包含压缩光盘(CD)、激光盘、光盘、数字通用光盘(DVD)、软磁盘和蓝光盘,其中磁盘通常是以磁性方式再现数据,而光盘是用激光以光学方式再现数据。上述各项的组合也应包含在计算机可读媒体的范围内。
代码可以由一或多个处理器执行,所述一或多个处理器例如是一或多个数字信号处理器(DSP)、通用微处理器、专用集成电路(ASIC)、现场可编程逻辑阵列(FPGA)、或其它等效的集成或离散逻辑电路。因此,如本文中所使用的术语“处理器”可指上述结构或适合于实施本文中所描述的技术的任何其它结构中的任一者。而且,可将所述技术完全实施于一或多个电路或逻辑元件中。
本发明的技术可以在广泛多种装置或设备中实施,包括无线手持机、集成电路(IC)或一组IC(即,芯片组)。本发明中描述各种组件、模块或单元是为了强调经配置以执行所揭示的技术的装置的功能方面,但未必需要通过不同硬件单元实现。确切地说,如上文所描述,各种单元可结合合适的软件和/或固件组合在硬件单元中,或通过互操作硬件单元的集合来提供,所述硬件单元包含如上文所描述的一或多个处理器。
已描述各种实例。这些及其它实例在所附权利要求书的范围内。

Claims (37)

1.一种用于图形处理的方法,所述方法包括:
以处理器确定相对于显示器的观看角度;
以所述处理器接收用于经配置以对单视图的图像操作的顶点着色器的指令;
以所述处理器基于所述观看角度将用于所述顶点着色器的所述指令修改为包含一或多个指令以产生经修改顶点着色器,其中所述经修改顶点着色器当经执行时产生立体视图的顶点的顶点坐标;
以所述处理器指示图形处理单元GPU执行所述经修改顶点着色器。
2.根据权利要求1所述的方法,其中指示所述GPU包括:
指示所述GPU执行所述经修改顶点着色器的目标代码的第一实例以基于所述观看角度产生所述立体视图的第一图像;以及
指示所述GPU执行所述经修改顶点着色器的所述目标代码的第二实例以基于所述观看角度产生所述立体视图的第二图像。
3.根据权利要求1所述的方法,其中修改所述指令包括:
将第一指令添加到所述顶点着色器中,所述第一指令基于所述观看角度修改所述单视图的所述图像的顶点的第一裁剪坐标;以及
将第二指令添加到所述顶点着色器中,所述第二指令基于所述观看角度修改所述单视图的所述图像的所述顶点的第二裁剪坐标。
4.根据权利要求1所述的方法,其中修改所述指令包括:
在所述顶点着色器中添加第一指令,所述第一指令基于所述观看角度和零视差平面的位置修改所述单视图的所述图像的顶点的第一裁剪坐标;以及
将第二指令添加到所述顶点着色器中,所述第二指令基于所述观看角度和所述零视差平面的所述位置修改所述单视图的所述图像的所述顶点的第二裁剪坐标。
5.根据权利要求1所述的方法,其进一步包括:
将界定所述单视图的所述图像的检视区的指令修改为界定所述立体视图的第一图像的检视区的指令和界定所述立体视图的第二图像的检视区的指令。
6.根据权利要求5所述的方法,其中修改界定所述单视图的所述图像的所述检视区的所述指令包括调整所述立体视图的所述第一图像与所述立体视图的所述第二图像之间的水平视差。
7.根据权利要求6所述的方法,其中调整所述水平视差包括调整所述立体视图的所述第一图像与所述立体视图的所述第二图像之间的所述水平视差以调整零视差平面的位置。
8.根据权利要求1所述的方法,其进一步包括:
以所述处理器执行应用程序以产生所述单视图的所述图像,
其中修改用于所述顶点着色器的所述指令包括在所述应用程序的执行期间修改用于所述顶点着色器的所述指令。
9.根据权利要求1所述的方法,其中确定所述观看角度包括在所述立体视图的每次产生时确定所述观看角度一次。
10.根据权利要求1所述的方法,其中确定相对于所述显示器的所述观看角度包括:
确定观看者定向和显示器定向中的至少一者;以及
基于所述所确定观看者定向和所述所确定显示器定向中的至少一者确定所述观看角度。
11.根据权利要求1所述的方法,
其中接收指令包括以在所述处理器上执行的图形驱动器包装器接收用于所述顶点着色器的所述指令,且
其中修改所述指令包括以所述处理器上的所述图形驱动器包装器执行来修改所述顶点着色器的所述指令。
12.一种设备,其包括:
图形处理单元GPU;以及
处理器,其经配置以:
确定相对于显示器的观看角度;
基于所述观看角度将顶点着色器的指令修改为包含一或多个指令以产生经修改顶点着色器,其中所述经修改顶点着色器当经执行时产生立体视图的顶点的顶点坐标;以及
指示所述GPU执行所述经修改顶点着色器。
13.根据权利要求12所述的设备,其中为了指示所述GPU执行所述经修改顶点着色器,所述处理器经配置以:
指示所述GPU执行所述经修改顶点着色器的目标代码的第一实例以基于所述观看角度产生所述立体视图的第一图像;以及
指示所述GPU执行所述经修改顶点着色器的所述目标代码的第二实例以基于所述观看角度产生所述立体视图的第二图像。
14.根据权利要求12所述的设备,其中为了修改所述指令,所述处理器经配置以:
将第一指令添加到所述顶点着色器中,所述第一指令基于所述观看角度修改单视图的图像的顶点的第一裁剪坐标;以及
将第二指令添加到所述顶点着色器中,所述第二指令基于所述观看角度修改所述单视图的所述图像的所述顶点的第二裁剪坐标。
15.根据权利要求12所述的设备,其中为了修改所述指令,所述处理器经配置以:
在所述顶点着色器中添加第一指令,所述第一指令基于所述观看角度和零视差平面的位置修改单视图的图像的顶点的第一裁剪坐标;以及
将第二指令添加到所述顶点着色器中,所述第二指令基于所述观看角度和所述零视差平面的所述位置修改所述单视图的所述图像的所述顶点的第二裁剪坐标。
16.根据权利要求12所述的设备,其中所述处理器经配置以:
将界定单视图的图像的检视区的指令修改为界定所述立体视图的第一图像的检视区的指令和界定所述立体视图的第二图像的检视区的指令。
17.根据权利要求16所述的设备,其中为了修改界定所述单视图的所述图像的所述检视区的所述指令,所述处理器经配置以调整所述立体视图的所述第一图像与所述立体视图的所述第二图像之间的水平视差。
18.根据权利要求17所述的设备,其中为了调整所述水平视差,所述处理器经配置以:
调整所述立体视图的所述第一图像与所述立体视图的所述第二图像之间的所述水平视差以调整零视差平面的位置。
19.根据权利要求12所述的设备,其中所述处理器经配置以执行应用程序以产生单视图的图像,且在所述应用程序的执行期间修改所述顶点着色器的所述指令。
20.根据权利要求12所述的设备,其中为了确定所述观看角度,所述处理器经配置以在所述立体视图的每次产生时确定所述观看角度一次。
21.根据权利要求12所述的设备,其中为了确定所述观看角度,所述处理器经配置以:
确定观看者定向和显示器定向中的至少一者;以及
基于所述所确定观看者定向和所述所确定显示器定向中的至少一者确定所述观看角度。
22.根据权利要求12所述的设备,其中所述处理器经配置以执行图形驱动器包装器,且其中所述处理器经配置以经由所述图形驱动器包装器修改所述顶点着色器的所述指令。
23.根据权利要求12所述的设备,其中所述设备包括移动无线电话、个人数字助理、视频游戏控制台、移动视频会议单元、膝上型计算机、桌上型计算机、数字媒体播放器和平板计算装置中的一者。
24.根据权利要求12所述的设备,其进一步包括:
加速度计、陀螺仪和相机中的至少一者,
其中所述处理器经配置以基于来自所述加速度计、所述陀螺仪和所述相机中的一或多者的输出而确定相对于所述显示器的所述观看角度。
25.一种处理器,其经配置以确定相对于显示器的观看角度,接收用于经配置以对单视图的图像操作的顶点着色器的指令,基于所述观看角度将用于所述顶点着色器的所述指令修改为包含一或多个指令以产生经修改顶点着色器,其中所述经修改顶点着色器当经执行时产生立体视图的顶点的顶点坐标,且指示图形处理单元GPU执行所述经修改顶点着色器。
26.一种设备,其包括:
图形处理单元GPU;
用于确定相对于显示器的观看角度的装置;
用于接收用于经配置以对单视图的图像操作的顶点着色器的指令的装置;
用于基于所述观看角度将用于所述顶点着色器的所述指令修改为包含一或多个指令以产生经修改顶点着色器的装置,其中所述经修改顶点着色器当经执行时产生立体视图的顶点的顶点坐标;以及
用于指示所述GPU执行所述经修改顶点着色器的装置。
27.根据权利要求26所述的设备,其进一步包括处理器,其中所述处理器包含所述用于确定的装置、所述用于接收的装置、所述用于修改的装置以及所述用于指示的装置。
28.根据权利要求26所述的设备,其中所述用于指示的装置包括:
第一装置,其用于指示所述GPU执行所述经修改顶点着色器的目标代码的第一实例以基于所述观看角度产生所述立体视图的第一图像;以及
第二装置,其用于指示所述GPU执行所述经修改顶点着色器的所述目标代码的第二实例以基于所述观看角度产生所述立体视图的第二图像。
29.根据权利要求26所述的设备,其中所述用于修改的装置包括:
第一装置,其用于将第一指令添加到所述顶点着色器中,所述第一指令基于所述观看角度修改所述单视图的所述图像的顶点的第一裁剪坐标;以及
第二装置,其用于将第二指令添加到所述顶点着色器中,所述第二指令基于所述观看角度修改所述单视图的所述图像的所述顶点的第二裁剪坐标。
30.根据权利要求26所述的设备,其中所述用于修改的装置包括:
第一装置,其用于在所述顶点着色器中添加第一指令,所述第一指令基于所述观看角度和零视差平面的位置修改所述单视图的所述图像的顶点的第一裁剪坐标;以及
第二装置,其用于将第二指令添加到所述顶点着色器中,所述第二指令基于所述观看角度和所述零视差平面的所述位置修改所述单视图的所述图像的所述顶点的第二裁剪坐标。
31.根据权利要求26所述的设备,其进一步包括:
用于将界定所述单视图的所述图像的检视区的指令修改为界定所述立体视图的第一图像的检视区的指令和界定所述立体视图的第二图像的检视区的指令的装置。
32.根据权利要求31所述的设备,其中所述用于修改界定所述单视图的所述图像的所述检视区的所述指令的装置包括用于调整所述立体视图的所述第一图像与所述立体视图的所述第二图像之间的水平视差的装置。
33.根据权利要求32所述的设备,其中所述用于调整所述水平视差的装置包括用于调整所述立体视图的所述第一图像与所述立体视图的所述第二图像之间的所述水平视差以调整零视差平面的位置的装置。
34.根据权利要求26所述的设备,其进一步包括:
用于执行应用程序以产生所述单视图的所述图像的装置,
其中所述用于修改用于所述顶点着色器的所述指令的装置包括用于在所述应用程序的执行期间修改用于所述顶点着色器的所述指令的装置。
35.根据权利要求26所述的设备,其中所述用于确定所述观看角度的装置包括用于在所述立体视图的每次产生时确定所述观看角度一次的装置。
36.根据权利要求26所述的设备,其中所述用于确定相对于所述显示器的所述观看角度的装置包括:
第一装置,其用于确定观看者定向和显示器定向中的至少一者;以及
第二装置,其用于基于所述所确定观看者定向和所述所确定显示器定向中的至少一者确定所述观看角度。
37.一种其上存储有指令的计算机可读存储媒体,所述指令在被执行时致使一或多个处理器:
确定相对于显示器的观看角度;
接收用于经配置以对单视图的图像操作的顶点着色器的指令;
基于所述观看角度将用于所述顶点着色器的所述指令修改为包含一或多个指令以产生经修改顶点着色器,其中所述经修改顶点着色器当经执行时产生立体视图的顶点的顶点坐标;以及
指示图形处理单元GPU执行所述经修改顶点着色器。
CN201380069877.XA 2013-01-10 2013-12-10 基于着色器的图形内容的观看定向的立体转换 Active CN104904201B (zh)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
US13/738,514 2013-01-10
US13/738,514 US9538164B2 (en) 2013-01-10 2013-01-10 Stereoscopic conversion with viewing orientation for shader based graphics content
PCT/US2013/074072 WO2014109851A1 (en) 2013-01-10 2013-12-10 Stereoscopic conversion with viewing orientation for shader based graphics content

Publications (2)

Publication Number Publication Date
CN104904201A true CN104904201A (zh) 2015-09-09
CN104904201B CN104904201B (zh) 2017-09-08

Family

ID=49943502

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201380069877.XA Active CN104904201B (zh) 2013-01-10 2013-12-10 基于着色器的图形内容的观看定向的立体转换

Country Status (6)

Country Link
US (1) US9538164B2 (zh)
EP (1) EP2944081B1 (zh)
JP (1) JP6227668B2 (zh)
KR (1) KR101732836B1 (zh)
CN (1) CN104904201B (zh)
WO (1) WO2014109851A1 (zh)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112437243A (zh) * 2020-11-20 2021-03-02 联想(北京)有限公司 一种输出控制方法、装置及电子设备
CN112804511A (zh) * 2021-01-04 2021-05-14 烽火通信科技股份有限公司 一种动态渲染全景视频的方法和装置

Families Citing this family (14)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20150035952A1 (en) * 2013-08-05 2015-02-05 Samsung Electronics Co., Ltd. Photographing apparatus, display apparatus, photographing method, and computer readable recording medium
US10134170B2 (en) * 2013-09-26 2018-11-20 Intel Corporation Stereoscopic rendering using vertix shader instancing
US9842428B2 (en) * 2014-06-27 2017-12-12 Samsung Electronics Co., Ltd. Dynamically optimized deferred rendering pipeline
CN105635707A (zh) * 2014-11-06 2016-06-01 福州瑞芯微电子股份有限公司 一种图像生成方法和装置
US9626733B2 (en) * 2014-11-24 2017-04-18 Industrial Technology Research Institute Data-processing apparatus and operation method thereof
KR102459850B1 (ko) 2015-12-03 2022-10-27 삼성전자주식회사 3d 이미지 처리 방법 및 장치, 및 그래픽 처리 장치
US10460513B2 (en) * 2016-09-22 2019-10-29 Advanced Micro Devices, Inc. Combined world-space pipeline shader stages
US20180211434A1 (en) * 2017-01-25 2018-07-26 Advanced Micro Devices, Inc. Stereo rendering
WO2018140223A1 (en) * 2017-01-25 2018-08-02 Advanced Micro Devices, Inc. Stereo rendering
WO2019104107A1 (en) * 2017-11-22 2019-05-31 Pure Depth, Inc. Perspective distortion in multi-display system
US10740966B2 (en) 2018-05-14 2020-08-11 Microsoft Technology Licensing, Llc Fake thickness on a two-dimensional object
CN108888954A (zh) * 2018-06-20 2018-11-27 苏州玩友时代科技股份有限公司 一种拾取坐标的方法、装置、设备及存储介质
US11200722B2 (en) * 2019-12-20 2021-12-14 Intel Corporation Method and apparatus for viewport shifting of non-real time 3D applications
US11393432B2 (en) 2020-09-24 2022-07-19 Snap Inc. Rotational image viewer

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101971606A (zh) * 2008-03-14 2011-02-09 索尼爱立信移动通讯有限公司 显示与相关位置和方向信息一起记录的数据的装置、方法及系统
CN101976451A (zh) * 2010-11-03 2011-02-16 北京航空航天大学 一种基于加速度传感器的运动控制与动画生成方法
US20120050465A1 (en) * 2010-08-30 2012-03-01 Samsung Electronics Co., Ltd. Image processing apparatus and method using 3D image format
US20120056885A1 (en) * 2010-09-08 2012-03-08 Namco Bandai Games Inc. Image generation system, image generation method, and information storage medium

Family Cites Families (12)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6226006B1 (en) * 1997-06-27 2001-05-01 C-Light Partners, Inc. Method and apparatus for providing shading in a graphic display system
US8004515B1 (en) * 2005-03-15 2011-08-23 Nvidia Corporation Stereoscopic vertex shader override
US8284204B2 (en) * 2006-06-30 2012-10-09 Nokia Corporation Apparatus, method and a computer program product for providing a unified graphics pipeline for stereoscopic rendering
WO2009095862A1 (en) 2008-02-01 2009-08-06 Koninklijke Philips Electronics N.V. Autostereoscopic display device
US20090282429A1 (en) 2008-05-07 2009-11-12 Sony Ericsson Mobile Communications Ab Viewer tracking for displaying three dimensional views
JP5293582B2 (ja) * 2009-12-10 2013-09-18 株式会社セガ 画像処理プログラムおよびコンピュータ読み取り可能な記録媒体
WO2012021967A1 (en) 2010-08-16 2012-02-23 Tandemlaunch Technologies Inc. System and method for analyzing three-dimensional (3d) media content
WO2012087275A1 (en) 2010-12-20 2012-06-28 Sony Ericsson Mobile Communications Ab Determining device movement and orientation for three dimensional view
US9578299B2 (en) * 2011-03-14 2017-02-21 Qualcomm Incorporated Stereoscopic conversion for shader based graphics content
GB201106111D0 (en) 2011-04-11 2011-05-25 Mccormick Malcolm Rendering images for autostereoscopic display
CN102884803A (zh) * 2011-05-11 2013-01-16 松下电器产业株式会社 图像处理装置、影像处理方法、程序、集成电路
US9465226B2 (en) 2011-08-09 2016-10-11 Sony Computer Entertainment Inc. Automatic shutdown of 3D based on glasses orientation

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101971606A (zh) * 2008-03-14 2011-02-09 索尼爱立信移动通讯有限公司 显示与相关位置和方向信息一起记录的数据的装置、方法及系统
US20120050465A1 (en) * 2010-08-30 2012-03-01 Samsung Electronics Co., Ltd. Image processing apparatus and method using 3D image format
US20120056885A1 (en) * 2010-09-08 2012-03-08 Namco Bandai Games Inc. Image generation system, image generation method, and information storage medium
CN101976451A (zh) * 2010-11-03 2011-02-16 北京航空航天大学 一种基于加速度传感器的运动控制与动画生成方法

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112437243A (zh) * 2020-11-20 2021-03-02 联想(北京)有限公司 一种输出控制方法、装置及电子设备
CN112804511A (zh) * 2021-01-04 2021-05-14 烽火通信科技股份有限公司 一种动态渲染全景视频的方法和装置
CN112804511B (zh) * 2021-01-04 2022-04-01 烽火通信科技股份有限公司 一种动态渲染全景视频的方法和装置

Also Published As

Publication number Publication date
KR20150105399A (ko) 2015-09-16
EP2944081A1 (en) 2015-11-18
EP2944081B1 (en) 2018-11-28
KR101732836B1 (ko) 2017-05-04
JP6227668B2 (ja) 2017-11-08
US20140192053A1 (en) 2014-07-10
CN104904201B (zh) 2017-09-08
US9538164B2 (en) 2017-01-03
JP2016509298A (ja) 2016-03-24
WO2014109851A1 (en) 2014-07-17

Similar Documents

Publication Publication Date Title
CN104904201A (zh) 基于着色器的图形内容的观看定向的立体转换
CN103444190B (zh) 原生单像3d到立体3d的运行时转换
US10403032B2 (en) Rendering an image from computer graphics using two rendering computing devices
US9020241B2 (en) Image providing device, image providing method, and image providing program for providing past-experience images
US9055277B2 (en) Image rendering device, image rendering method, and image rendering program for rendering stereoscopic images
US7652674B2 (en) On the fly hardware based interdigitation
Tsai et al. A real-time 1080p 2D-to-3D video conversion system
CN103348360B (zh) 二维图像的再投影的形态学反混叠(mlaa)
CN103562963A (zh) 用于角切片真3d显示器的对准、校准和渲染的系统和方法
CN107637075B (zh) 立体视图处理
JP6831482B2 (ja) アルファブレンディングを使用した動的な画像の色の再マッピングのための方法
US20090262125A1 (en) Rendering A Multiple Viewpoint Image Into A Single Frame Buffer Using Off-Screen Rendering Surfaces
CN118115693A (zh) 生成并排三维影像的方法及电脑装置

Legal Events

Date Code Title Description
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant