JP2014512032A - シェーダベースのグラフィックスコンテンツのための立体視コンバージョン - Google Patents

シェーダベースのグラフィックスコンテンツのための立体視コンバージョン Download PDF

Info

Publication number
JP2014512032A
JP2014512032A JP2013558086A JP2013558086A JP2014512032A JP 2014512032 A JP2014512032 A JP 2014512032A JP 2013558086 A JP2013558086 A JP 2013558086A JP 2013558086 A JP2013558086 A JP 2013558086A JP 2014512032 A JP2014512032 A JP 2014512032A
Authority
JP
Japan
Prior art keywords
image
command
viewport
vertex shader
shader
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
JP2013558086A
Other languages
English (en)
Other versions
JP5694577B2 (ja
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 JP2014512032A publication Critical patent/JP2014512032A/ja
Application granted granted Critical
Publication of JP5694577B2 publication Critical patent/JP5694577B2/ja
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T15/003D [Three Dimensional] image rendering
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04NPICTORIAL COMMUNICATION, e.g. TELEVISION
    • H04N13/00Stereoscopic video systems; Multi-view video systems; Details thereof
    • H04N13/10Processing, recording or transmission of stereoscopic or multi-view image signals
    • H04N13/106Processing image signals
    • H04N13/122Improving the 3D impression of stereoscopic images by modifying image signal contents, e.g. by filtering or adding monoscopic depth cues
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T15/003D [Three Dimensional] image rendering
    • G06T15/10Geometric effects
    • G06T15/20Perspective computation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T15/003D [Three Dimensional] image rendering
    • G06T15/005General purpose rendering architectures
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T15/003D [Three Dimensional] image rendering
    • G06T15/10Geometric effects
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T15/003D [Three Dimensional] image rendering
    • G06T15/10Geometric effects
    • G06T15/30Clipping
    • 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
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04NPICTORIAL COMMUNICATION, e.g. TELEVISION
    • H04N13/00Stereoscopic video systems; Multi-view video systems; Details thereof
    • H04N13/20Image signal generators
    • H04N13/286Image signal generators having separate monoscopic and stereoscopic modes
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T15/003D [Three Dimensional] image rendering
    • G06T15/06Ray-tracing
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T15/003D [Three Dimensional] image rendering
    • G06T15/50Lighting effects
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T15/003D [Three Dimensional] image rendering
    • G06T15/50Lighting effects
    • G06T15/506Illumination models
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T15/003D [Three Dimensional] image rendering
    • G06T15/50Lighting effects
    • G06T15/60Shadow generation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T15/003D [Three Dimensional] image rendering
    • G06T15/50Lighting effects
    • G06T15/80Shading

Abstract

本開示の例示的技法は、モノビューを生成するように設計されたアプリケーションから、立体ビューを生成することを対象とする。たとえば、本技法は、頂点シェーダのソースコードを、修正された頂点シェーダが実行されると、修正された頂点シェーダに、立体ビューの画像用のグラフィックスコンテンツを生成させるように修正することができる。別の例として、本技法は、モノビュー用のビューポートを定義するコマンドを、立体ビューの画像用のビューポートを定義するコマンドに修正することができる。

Description

本出願は、各々の内容がそれぞれの全体において参照により本明細書に組み込まれている、2011年3月14日に出願した米国特許仮出願第61/452,289号、および2011年4月12日に出願した米国特許仮出願第61/474,638号の利益を主張する。
本開示は、グラフィックスデータ処理に関し、より詳細には、立体ビューのためのグラフィックスデータ処理に関する。
立体ビューは、3次元(3D)ボリュームを取り囲むように見える知覚画像を指す。立体ビューを生成するために、デバイスは、ディスプレイの2次元(2D)エリア上に2つの画像を表示する。これらの2つの画像は、実質的に同様の内容を含むが、2つの画像中の1つまたは複数の対応するピクセルの水平軸に沿ってわずかなずれを有する。これらの2つの画像を、2Dエリア上で同時視認することにより、閲覧者は、2つの画像を表示している2Dディスプレイからポップアウトし、またはディスプレイにプッシュインした画像を知覚する。このように、2つの画像は、ディスプレイの2Dエリア上に表示されるが、閲覧者は、3Dボリュームを取り囲むように見える画像を知覚する。
立体ビューの2つの画像は、それぞれ、左目画像および右目画像と呼ばれる。左目画像は、閲覧者の左目には可視であり、右目画像は、閲覧者の左目には可視でない。同様に、右目画像は、閲覧者の右目には可視であり、左目画像は、閲覧者の右目には可視でない。たとえば、閲覧者は特殊眼鏡を装着する場合があり、眼鏡の左レンズは右目画像を遮断し、左目画像を通し、眼鏡の右レンズは左目画像を遮断し、右目画像を通す。
左目画像および右目画像は、水平軸に沿ってわずかなずれのある、実質的に同様の内容を含むが、閲覧者の両目によって同時に可視ではない(たとえば、特殊眼鏡により)ので、閲覧者の脳は、2つの画像を混合させることによって、対応するピクセルの間のわずかなずれを解消する。混合により、閲覧者は、2つの画像を、3Dボリュームをもつ画像として知覚する。
概して、本開示の技法は、モノビューを生成する命令を、立体ビューを生成するように修正することを対象とする。たとえば、グラフィックス処理ユニット(GPU)のシェーダプログラムは、モノビューを生成するように設計することができる。本開示に記載する技法は、このようなシェーダプログラムの命令を修正することができる。たとえば、例示的技法は、シェーダプログラムによって生成された値を修正する命令を追加することができる。本技法は、アプリケーションによって発行された命令を、GPUにモノビューではなく立体ビュー用の画像を生成させるように修正することもできる。たとえば、本開示に記載する技法は、ビューポートを定義するコマンドを修正することができる。ビューポートは、ディスプレイ上での画像のサイズと場所とを定義し得る。たとえば、修正に先立って、コマンドが、モノビュー用のビューポートを定義し得る。例示的技法は、モノビュー用のビューポートを定義するコマンドを、立体ビューの画像の各々のためのビューポートを定義するように修正することができる。
一例では、本開示は、プロセッサを用いて、モノビューの画像を生成するように構成されておりグラフィックス処理ユニット(GPU)のシェーダプロセッサ上で実行されるべき頂点シェーダに対する命令を受信することを含む方法について記載する。この方法は、プロセッサを用いて、頂点シェーダの命令を、頂点シェーダがGPUのシェーダプロセッサ上で実行されると頂点シェーダに、頂点シェーダの第1の実行の後に立体ビューの第1の画像用のグラフィックスコンテンツを、また頂点シェーダの第2の実行の後に立体ビューの第2の画像用のグラフィックスコンテンツを生成させる1つまたは複数の命令を含むように修正することも含む。この方法は、プロセッサを用いて、モノビューの画像用のビューポートを定義するコマンドを、第1の画像用のビューポートを定義する、シェーダプロセッサとは異なる、GPUの固定機能ユニット向けの第1のコマンドと、第2の画像用のビューポートを定義する、GPUの固定機能ユニット向けの第2のコマンドとに修正することをさらに含む。
別の例では、本開示は、シェーダプロセッサ、および固定機能パイプラインの、シェーダプロセッサとは異なる固定機能ユニットを含むグラフィックス処理ユニット(GPU)と、プロセッサとを含む装置について記載する。プロセッサは、モノビューの画像を生成するように構成されておりGPUのシェーダプロセッサ上で実行されるべき頂点シェーダについての命令を受信するように動作可能である。プロセッサは、頂点シェーダの命令を、頂点シェーダがGPUのシェーダプロセッサ上で実行されると頂点シェーダに、頂点シェーダの第1の実行の後に立体ビューの第1の画像用のグラフィックスコンテンツと、頂点シェーダの第2の実行の後に立体ビューの第2の画像用のグラフィックスコンテンツとを生成させる1つまたは複数の命令を含むように修正するようにも動作可能である。プロセッサは、モノビューの画像用のビューポートを定義するコマンドを、第1の画像用のビューポートを定義する、シェーダプロセッサとは異なる、GPUの固定機能ユニット向けの第1のコマンドと、第2の画像用のビューポートを定義する、GPUの固定機能ユニット向けの第2のコマンドとに修正するようにさらに動作可能である。
別の例では、本開示は、シェーダプロセッサ、および固定機能パイプラインの、シェーダプロセッサとは異なる固定機能ユニットを含むグラフィックス処理ユニット(GPU)と、プロセッサとを含む装置について記載する。プロセッサは、モノビューの画像を生成するように構成されておりGPUのシェーダプロセッサ上で実行されるべき頂点シェーダについての命令を受信するための手段を含む。プロセッサは、頂点シェーダの命令を、頂点シェーダがGPUのシェーダプロセッサ上で実行されると頂点シェーダに、頂点シェーダの第1の実行の後に立体ビューの第1の画像用のグラフィックスコンテンツと、頂点シェーダの第2の実行の後に立体ビューの第2の画像用のグラフィックスコンテンツとを生成させる1つまたは複数の命令を含むように修正するための手段も含む。プロセッサは、モノビューの画像用のビューポートを定義するコマンドを、第1の画像用のビューポートを定義する、シェーダプロセッサとは異なる、GPUの固定機能ユニット向けの第1のコマンドと、第2の画像用のビューポートを定義する、GPUの固定機能ユニット向けの第2のコマンドとに修正するための手段をさらに含む。
別の例では、本開示は、命令を備える非一時的コンピュータ可読記憶媒体について記載する。これらの命令は、実行されると、1つまたは複数のプロセッサに、モノビューの画像を生成するように構成されておりグラフィックス処理ユニット(GPU)のシェーダプロセッサ上で実行されるべき頂点シェーダについての命令を受信させる。これらの命令はまた、1つまたは複数のプロセッサに、頂点シェーダの命令を、頂点シェーダがGPUのシェーダプロセッサ上で実行されると頂点シェーダに、頂点シェーダの第1の実行の後に立体ビューの第1の画像用のグラフィックスコンテンツと、頂点シェーダの第2の実行の後に立体ビューの第2の画像用のグラフィックスコンテンツとを生成させる1つまたは複数の命令を含むように修正させる。これらの命令はまた、1つまたは複数のプロセッサに、モノビューの画像用のビューポートを定義するコマンドを、第1の画像用のビューポートを定義する、シェーダプロセッサとは異なる、GPUの固定機能ユニット向けの第1のコマンドと、第2の画像用のビューポートを定義する、GPUの固定機能ユニット向けの第2のコマンドとに修正させる。
本開示の1つまたは複数の態様の詳細について添付の図面および以下の説明において述べる。本開示の他の特徴、目的、および利点は、説明および図面、ならびに特許請求の範囲から明らかになろう。
本開示に記載する1つまたは複数の例示的技法を実装し得るデバイスの例を示すブロック図。 本開示に記載する1つまたは複数の例示的技法を実装し得るグラフィックス処理ユニット(GPU)の例を示すブロック図。 図1の例示的デバイスをさらに詳しく示すブロック図。 本開示に記載する1つまたは複数の例示的技法による例示的動作を示すフローチャート。
本開示に記載する例示的技法は、実行またはランタイム中の立体3次元(S3D)グラフィックスのレンダリングを対象とする。従来の3Dグラフィックスレンダリングでは、グラフィックス処理ユニット(GPU)は、3Dグラフィックスを、単一視点(たとえば、モノビュー)から生成する。この単一視点は、閲覧者の右目と左目の両方によって可視である単一画像を意味し得る。
S3Dグラフィックスは、S3Dグラフィックスが立体ビューを生成するという点で、3Dグラフィックスとは異なる。立体ビューという用語は、双眼視点から生成される画像を指す。双眼視点には、2つの画像があってよく、一方の画像は両目のうち一方には可視であるが他方には可視でなく、その逆も同様である。たとえば、閲覧者が双眼鏡を装着しているとき、双眼鏡の左レンズに入る光は左目には可視であるが、右目には可視でなく、その逆も成り立つ。双眼視点は、立体ビューと呼ばれ得る。
たとえば、S3Dグラフィックスにおいて、GPUは、左目用の画像、および右目用の別の画像、すなわち、立体ビューを生成することができる。立体ビューという用語は、ディスプレイ上に各々が表示される2つの画像(たとえば、左目画像および右目画像)を指し、モノビューは、ディスプレイ上に表示される単一画像を指す。左目画像と右目画像の組合せは、閲覧者にとって、画像を表示しているディスプレイから画像がポップアウトし、またはプッシュインしているかのように見え得る。こうすることにより、より現実的および豊かな視認体験が生じ得る。
本開示において、S3D画像(たとえば、立体ビュー)および3D画像(たとえば、モノビュー)の概念は混同されるべきでない。3D画像とは、ディスプレイの2次元(2D)エリアに制限された画像である。たとえば、3D画像内のオブジェクトは、3D画像内の他のオブジェクトよりもさらに遠くまたは近くに見え得る。ただし、これらのオブジェクトはすべて、ディスプレイの2Dエリアに限定される。S3D画像とは、右目画像と左目画像とを組み合わせた、閲覧者の脳から得られる知覚画像である。得られた画像(すなわち、S3D画像)は、ディスプレイの2Dエリアに制限されないように見える。そうではなく、S3D画像は、3Dボリュームを取り囲むように見え、この場合、画像は、ディスプレイからポップアウトし、またはディスプレイにプッシュインするように見える。たとえば、S3D画像内のオブジェクトは、3D画像の場合のように2Dエリアではなく、3Dボリューム内の他のオブジェクトよりもさらに遠くまたは近くに見える。
S3D画像を一緒に形成する右目画像および左目画像は、3D画像であり得る。脳が3D右目画像と3D左目画像とを組み合わせるとき、閲覧者にS3D画像を知覚させるのは、閲覧者の脳である。右目画像および左目画像の内容は、単一3D画像の内容と実質的に同様であり得る。本開示に記載する技法は、モノビュー用のグラフィックスコンテンツをGPUに生成させる命令を、立体ビュー用のグラフィックスコンテンツをGPUに生成させる命令に修正することができる。言い換えれば、修正に先立って、命令は、GPUに単一3D画像を生成させる。修正に続いて、命令は、GPUに、2つの3D画像(たとえば、3D左目画像および3D右目画像)を生成させることができる。
本開示に記載する技法は概して、3D画像について開示されるが、本開示の態様は、そのように限定されないことに留意されたい。本開示の技法は、2Dグラフィックスにも拡張することができる。たとえば、モノビューの単一画像は2D画像であってよく、本開示の技法は、立体ビュー用の2つの2D画像をGPUに生成させるように、命令を修正することができる。この場合、閲覧者は、立体ビュー用の2つの画像を表示しているディスプレイからポップアウトされ、またはディスプレイにプッシュインされる単一画像を知覚することになる。混同を避けるために、後で説明する技法は、モノビュー用の単一画像と、立体ビュー用の左目および右目画像とに言及するが、これらの画像は3D画像または2D画像であり得ることを理解されたい。
本開示に記載する例示的技法は、GPUによって実施されるべきである、アプリケーションによって発行された命令と、GPUによって実行されるべき頂点シェーダプログラムの命令とを修正することができる。たとえば、アプリケーションプロセッサがアプリケーションを実行することができる。アプリケーションは、単一画像(たとえば、モノビュー)を生成するように設計されていてよく、単一画像のグラフィックスコンテンツを複数のプリミティブとして生成することができる。さらに、アプリケーションは、プリミティブの各頂点について、色、透明度、および座標値などのピクセル値を決定することができる。
アプリケーションの実行の間(たとえば、ランタイム中)、アプリケーションは、頂点シェーダプログラムの命令を取り出すためのコマンドを発行する。頂点シェーダプログラムの出力は、実行されるとき、単一画像(たとえば、モノビュー)向けのアプリケーションによって生成されたプリミティブの頂点についてのクリッピング座標であってよい。例示的技法は、頂点シェーダプログラムの命令を、左目画像および右目画像(たとえば、立体ビュー)用のプリミティブの頂点についてのクリッピング座標を生成するように修正することができる。
また、アプリケーションの実行中、アプリケーションは、単一画像内のプリミティブのうち1つまたは複数を描画するよう、GPUに命令するための描画命令をGPUへ発行する。たとえば、本開示の技法において、アプリケーションプロセッサ上で実行するアプリケーションは、単一画像用のグラフィックスコンテンツをGPUが生成する予定であるかのように、命令を出力する。本明細書に記載する技法は、描画命令など、アプリケーションによって発行された命令のうち1つまたは複数を、左目画像および右目画像用のグラフィックスコンテンツを生成するように修正する。このように、アプリケーションの観点からの、命令に対する修正は行われない。
たとえば、本開示に記載する技法は、アプリケーションによって発行された命令を監視する。アプリケーションが描画命令を発行すると、本技法は、このような描画命令を捕捉し、2つの描画命令を発行し、ここで、1つの命令は、左目画像用のグラフィックコンテンツを生成するためのものであり、1つの命令は、右目画像用のグラフィックスコンテンツを生成するためのものである。
さらに、本技法は、アプリケーションによって発行されたビューポート命令を修正する。たとえば、アプリケーションは、単一画像のビューポートを定義するビューポート命令を発行する。ビューポートは、ディスプレイ上での画像のサイズと場所とを定義する。たとえば、ビューポートは、画像の開始座標と、画像の幅および長さとを定義し得る。画像の幅および長さは、画像によって取り囲まれる水平距離と垂直距離とを示す値であり得る。幅および長さは、必ずしも座標値である必要はなく、むしろ、幅および長さは、画像の開始座標から始まる距離を定義する。アプリケーションは、単一画像についてのビューポートの定義をGPUへ与えることができる。
本開示の技法は、ディスプレイ上での、左目画像および右目画像の各々のサイズと場所とを定義する、左目画像および右目画像についてのビューポート命令を生成するように、ビューポート命令を修正する。このように、変更されたビューポート命令は、左目画像をディスプレイの一部分に、および右目画像をディスプレイの他の部分に制限することができる。いくつかの例では、変更されたビューポート命令は、左目画像をディスプレイの左半分に、および右目画像をディスプレイの右半分に制限することができる。ただし、本開示の態様はそのように限定されるわけではなく、変更されたビューポート命令は、別の非限定的例として、左目画像をディスプレイの上半分に、および右目画像をディスプレイの下半分に制限することもできる。いくつかの事例では、例示的技法は、右目画像および左目画像についてのビューポートを、より良好な視認体験を提供することが可能なようにさらに修正することができる。たとえば、本技法は、右目画像および左目画像についてのビューポートをシフトまたはストレッチすることができる。
ビューポートを修正する命令は、シェーダプログラムを修正する命令の一部でなくてもよい。たとえば、GPUは、シェーダコアと呼ばれることがあるシェーダプロセッサと、1つまたは複数の固定機能ユニットとを含み得る。頂点シェーダプログラムは、シェーダプロセッサ上で実行することができ、定義されたビューポートに画像を制限するためのビューポートのアプリケーションは、固定機能ユニットのうち少なくとも1つ(たとえば、固定機能ユニットのうちのビューポート変換ユニット)によって実施することができる。例示的技法では、シェーダプロセッサは、修正されたシェーダプログラムを実行して、立体ビュー用のグラフィックスコンテンツを生成することができ、少なくとも1つの固定機能ユニットは、左目画像および右目画像の各々についての定義されたビューポートを適用して、これらの画像を、ディスプレイのそれぞれの半分に制限することができる。言い換えれば、ビューポート修正は、修正されたシェーダプログラムの実行の外部で起こり得る。
図1は、本開示に記載する1つまたは複数の例示的技法を実装し得るデバイスの例を示すブロック図である。たとえば、図1は、デバイス10を示す。デバイス10の例には、限定はしないが、モバイルワイヤレス電話、携帯情報端末(PDA)、ビデオディスプレイを含むビデオゲーミングコンソール、モバイルビデオ会議ユニット、ラップトップコンピュータ、デスクトップコンピュータ、テレビジョンセットトップボックス、デジタルメディアプレーヤ、スマートフォンなどがある。図1に示すように、デバイス10は、アプリケーションプロセッサ12と、グラフィックス処理ユニット(GPU)20と、システムメモリ26とを含み得る。デバイス10は、図1に示すものの他にも、構成要素を含み得る。これらの構成要素は、明快のために図1には示していないが、図3にさらに示してある。
アプリケーションプロセッサ12は、デバイス10の中央処理ユニット(CPU)であり得る。GPU20は、ディスプレイ上での表示のためにグラフィックスデータを出力するように動作可能な処理ユニットであり得る。アプリケーションプロセッサ12およびGPU20の例には、限定はしないが、デジタル信号プロセッサ(DSP)、汎用マイクロプロセッサ、特定用途向け集積回路(ASIC)、フィールドプログラマブル論理アレイ(FPGA)、あるいは他の等価な集積回路またはディスクリート論理回路がある。
システムメモリ26は、コンピュータ可読記憶媒体の例であり得る。たとえば、システムメモリ26は、アプリケーションプロセッサ12およびGPU20に、本開示において各々による機能を実施させる命令を記憶することができる。このように、システムメモリ26は、1つまたは複数のプロセッサ、たとえば、アプリケーションプロセッサ12またはGPU20に、様々な機能を実施させる命令を備えるコンピュータ可読記憶媒体と見なされ得る。
システムメモリ26の例には、限定はしないが、ランダムアクセスメモリ(RAM)、読取り専用メモリ(ROM)、電気的消去可能プログラマブル読取り専用メモリ(EEPROM)、CD−ROMまたは他の光ディスクストレージ、磁気ディスクストレージ、または他の磁気ストレージデバイス、フラッシュメモリ、あるいは命令またはデータ構造の形態の所望のプログラムコードを搬送または記憶するために使用され得、コンピュータまたはプロセッサによってアクセスされ得る、任意の他の媒体がある。システムメモリ26は、いくつかの例では、非一時的記憶媒体と見なされ得る。「非一時的」という用語は、記憶媒体が、搬送波または伝搬信号では実施されないことを示し得る。ただし、「非一時的」という用語は、システムメモリ26が非移動性であることを意味するものと解釈されるべきでない。一例として、システムメモリ26は、デバイス10から取り外され、別のデバイスに移され得る。別の例として、システムメモリ26と実質的に同様の記憶デバイスが、デバイス10に挿入され得る。いくつかの例では、非一時的記憶媒体は、時間経過に伴って変動し得るデータを(たとえば、RAMに)記憶することができる。
GPU20は、シェーダプロセッサ22と固定機能パイプライン24とを含み得る。シェーダコアと呼ばれることもあるシェーダプロセッサ22は、頂点シェーダおよびフラグメントシェーダなどのシェーダプログラムがその上で実行するGPU20のコアであり得る。固定機能パイプライン24は、固定機能を実施するハードウェアユニットを含み得る。言い換えれば、頂点シェーダおよびフラグメントシェーダなどのシェーダプログラムは、シェーダプロセッサ22上で実行し、機能的柔軟性を可能にするソフトウェアユニットであってよく、固定機能パイプライン24は、固定機能および最低限の機能的柔軟性を有するハードウェアユニットを含む。
本開示に記載する例示的技法は、修正されたシェーダプログラムがシェーダプロセッサ22上で実行されると、GPU20がS3D画像(たとえば、立体ビュー)についてのグラフィックスデータを生成するように、単一3次元(3D)画像(たとえば、モノビュー用)を生成するように設計されたシェーダプログラムを修正することができる。やはり、上述したように、立体ビューは、左目画像と右目画像とを含む。左目画像および右目画像は、モノビュー画像と実質的に同様のグラフィックスコンテンツを含むが、左目画像および右目画像の1つまたは複数の対応するピクセルは、互いに対して、水平軸に沿ってずらされ得る。たとえば、右目画像は左目画像の上に位置することを想像されたい。この場合、右目画像中の内容すべてが、左目画像中の同一の内容と完全に整列するわけではない。そうではなく、右目中の1つまたは複数のオブジェクトは、左目画像中の同一のオブジェクトの左または右にあってよい。
左目画像は、閲覧者の左目には可視であり、右目画像は、閲覧者の左目から遮断される。右目画像は、閲覧者の右目には可視であり、左目画像は、閲覧者の右目から遮断される。いくつかの例では、閲覧者は、左目画像が右目に可視になり、右目画像が左目に可視になるのを阻止する特殊眼鏡を装着することができる。ただし、本開示の態様は、閲覧者が特殊眼鏡を装着することを必ずしも要求するわけではない。たとえば、いくつかのディスプレイは、立体ビューを体験するのに、閲覧者が特殊眼鏡を装着することを要求しない。本開示の技法は、そのようなディスプレイに拡張することができる。
GPU20は、閲覧者が左目画像と右目画像の両方を同時に見るとき、2つの画像を表示しているディスプレイからポップアウトし、またはディスプレイにプッシュインする(たとえば、ディスプレイの前または後ろにあるように見える)画像を、閲覧者の脳が閲覧者に知覚させるように左目画像および右目画像についてのグラフィックスデータを生成することができる。このポップアウトまたはプッシュインは、実質的に同様の内容をもつ立体ビューの2つの画像における水平相違を解消する閲覧者の脳に起因する。
一例として、アプリケーションプロセッサ12は、システムメモリ26に記憶された、アプリケーション32など、1つまたは複数のアプリケーションを実行することができる。アプリケーション32の例には、ウェブブラウザ、ユーザインターフェース、eメールアプリケーション、表計算アプリケーション、文書処理アプリケーション、グラフィックスオーサリングアプリケーション、ビデオゲーム、または可視オブジェクトを表示用に生成する他のアプリケーションがあるが、それに限定されない。たとえば、アプリケーション32は、実行されると、ディスプレイ上に表示されるグラフィカルコンテンツを出力するビデオゲームであってよい。
アプリケーション32は、開発者によってモノビュー用に設計することができる。たとえば、アプリケーション32は、実行されると、3Dグラフィックスコンテンツを生成することができ、3Dグラフィックスコンテンツは、ディスプレイの2Dエリアに制限される。アプリケーション32は、アプリケーションプロセッサ12上で実行されると、生成された3Dグラフィックスコンテンツを、三角形、矩形、または他のタイプのポリゴンなどのプリミティブに分割することができる。これらのプリミティブの各々は、ディスプレイ上に表示されるべきピクセルを含み得る。アプリケーション32は、アプリケーションプロセッサ12上で実行されると、プリミティブの頂点の各々にピクセル値を割り当てることもできる。たとえば、ピクセル値は、頂点の3D座標と、頂点の色値と、頂点の透明度値とを含み得る。ピクセル値は、本開示のすべての態様において、上記の例示的成分のすべてを含む必要はない。
アプリケーションプロセッサ12は次いで、頂点についてのピクセル値を、さらなる処理のためにGPU20に転送すればよい。たとえば、アプリケーションプロセッサ12は、アプリケーションプロセッサ12上で実行するソフトウェアであり得るグラフィックスドライバ14を含み得る。グラフィックスドライバ14は、GPU20にコマンドを送信するように設計することができ、それに応答して、GPU20は、受信コマンドに従って機能を実施することができる。たとえば、グラフィックスドライバ14は、GPU20とアプリケーションプロセッサ12との間のインターフェースとして機能する。アプリケーションプロセッサ12がGPU20にコマンドを発行したとき、GPU20がコマンドを受信するのは、グラフィックスドライバ14を通してである。たとえば、アプリケーションプロセッサ12上で実行するアプリケーション32は、GPU20に、特定のタスクを実施するよう命令することができる。この場合、グラフィックスドライバ14は、特定のタスクについての命令をアプリケーション32から受信することができ、GPU20に命令を与えればよい。応答として、GPU20はタスクを実施すればよい。
いくつかの例では、グラフィックスドライバ14は、特定のアプリケーションプログラミングインターフェース(API)に従って設計され得る。たとえば、グラフィックスドライバ14は、OpenGLまたはOpenGL ES(組込みシステム)APIに従って設計することができ、これらはクロノスグループのAPIであり、その仕様は公表されている。ただし、本開示の技法は、DirectX9、10、もしくは11などのマイクロソフトDirectXシステム、または他のどのシェーダベースのグラフィックスシステムおよびAPIにも拡張可能であり得る。説明のために、本開示の技法は、APIがOpenGL ES2.0APIであるコンテキストにおいて説明される。ただし、本開示の態様は、そのように限定されるわけではなく、他のAPIまたはシェーダベースのグラフィックスシステムにも拡張され得る。
アプリケーションプロセッサ12から受信されたプリミティブをレンダリングするために、GPU20のシェーダプロセッサ22は、頂点シェーダおよびフラグメントシェーダなど、1つまたは複数のシェーダプログラムを実行して、ディスプレイのピクセルについてのピクセル値を生成することができる。開発者は、これらの頂点シェーダおよびフラグメントシェーダを、本開示において説明目的で使われる、OpenGL ES2.0APIなどのAPIに従って開発することができる。これらの頂点およびフラグメントシェーダ用のソースコードは、システムメモリ26に記憶することができる。
たとえば、アプリケーション32は、モノビューを生成するように設計され得る頂点シェーダ28を使用することができる。たとえば、アプリケーション32によって生成されたピクセル値は、頂点シェーダ28を使って、シェーダプロセッサ22によって処理される必要があり得る。一例として、頂点シェーダ28は、アプリケーションプロセッサ12上でのアプリケーション32の実行中にアプリケーション32によって特に呼び出される頂点シェーダであり得る。頂点シェーダ28は、GPU20のシェーダプロセッサ22上で実行することができ、アプリケーション32は、アプリケーションプロセッサ12上で実行することができるが、頂点シェーダ28およびアプリケーション32は、アプリケーション32によって生成された画像を表示する目的のために、相互に関係し得る。
頂点シェーダ28のソースコードは、システムメモリ26に記憶することができる。グラフィックスドライバ14は、頂点シェーダ28のソースコードを取り出し、頂点シェーダ28用のソースコードをコンパイラ18に与えることができる。コンパイラ18は、頂点シェーダ28のソースコードをコンパイルして、頂点シェーダ28のオブジェクトコードを生成し、オブジェクトコードをシステムメモリ28に記憶することができる。グラフィックスドライバ14は次いで、GPU20に、頂点シェーダ28のオブジェクトコードをシステムメモリ26から取り出すよう命令し、GPU20に、頂点シェーダ28のオブジェクトコードをシェーダプロセッサ22上で実行するよう命令することができる。シェーダプロセッサ22は次いで、頂点シェーダ28のオブジェクトコードを実行して、アプリケーション32の実行によって生成された、頂点についてのピクセル値を処理することができる。GPU20は、固定機能パイプライン24およびシェーダプロセッサ22とともに、アプリケーション32向けのグラフィックスコンテンツを表示用に生成することができる。
システムメモリ26は、ただ1つの頂点シェーダ28用のソースコードを記憶するように示されているが、本開示の態様は、そのように限定されるわけではない。たとえば、アプリケーション32は、可能性としては、複数の異なる頂点シェーダを使用することができ、これらの頂点シェーダの各々のためのソースコードは、システムメモリ26に記憶することができる。また、アプリケーション32は、頂点シェーダ28の複数のインスタンス化の実行を要求し得る。たとえば、シェーダプロセッサ22は、頂点シェーダ28の複数のインスタンス化を同時に(たとえば、並行して)実行することができ、この場合、頂点シェーダ28の各インスタンス化は、実質的に同様の機能を実施するのだが、異なるピクセル値に対して実施する。システムメモリ26は同様に、フラグメントシェーダ用のソースコードを記憶することができる。グラフィックスドライバ14は、フラグメントシェーダ用のソースコードを取り出すことができ、コンパイラ18は、ソースコードをコンパイルして、フラグメントシェーダ用のオブジェクトコードを、頂点シェーダ28について上述したのと同様にして生成することができる。
さらに詳しく説明するように、本開示の1つまたは複数の例示的技法は、コンパイルに先立って、頂点シェーダ28のソースコードを修正することができる。コンパイラ18は、修正されたソースコードをコンパイルして、修正された頂点シェーダ30のオブジェクトコードを生成することができる。シェーダプロセッサ22は、修正された頂点シェーダ30のオブジェクトコードを実行することができ、そうすることによって、GPU20に、立体3Dグラフィックスコンテンツ(たとえば、S3Dの左目画像および右目画像用のグラフィックスコンテンツ)を生成させることができる。ただし、頂点シェーダ28のソースコードに対する修正について説明するのに先立って、以下では、頂点シェーダ28の例示的機能性について説明するが、この説明は、頂点シェーダ28のソースコードに適用される修正の理解を助けるであろう。
上述したように、アプリケーション32は、プリミティブの頂点についての座標を生成することができる。これらの座標は、世界座標と呼ばれる場合もあり、アプリケーション32に固有であり得る。言い換えれば、アプリケーション32によって定義される頂点の座標は、必ずしも、プリミティブが表示されるディスプレイの座標でなくてよく、可能性としては、可視エリアの外にある頂点についての座標であってもよい。頂点シェーダ28は、3Dであり得る世界座標を、ディスプレイの2D座標(たとえば、ディスプレイ座標)にコンバートするように設計され得る。この機能を実施するために、頂点シェーダ28は、世界座標を目座標に、次いで、クリッピング座標に変換することができる。たとえば、頂点シェーダ28の出力は、実行されるとき、頂点のクリッピング座標であり得る。最終的なディスプレイ座標、たとえば、ディスプレイの座標は、その後、固定機能パイプライン24の一部として決定され得る。
クリッピング座標は、視錐台を定義し得る。視錐台は、3Dグラフィックスコンテンツの可視エリアを定義し得る。GPU20は、視錐台を、視錐台の外にあるピクセルを選別するのに使用することができる。たとえば、固定機能パイプライン24の固定機能ユニット(たとえば、固定機能パイプライン24の錐台ユニット)は、頂点シェーダ28によって生成されたクリッピング座標によって定義される、視錐台の外にあるピクセルを選別することができる。
世界座標からクリッピング座標を算出するための式は、次のようになり得る。
上式で、Vclipは頂点クリップ座標であり、Veyeは頂点視点座標であり、Vworldは、アプリケーション32によって与えられる頂点世界座標であり、PRJは投射行列であり、MVTはモデルビュー変換行列(または世界ビュー変換行列)である。いくつかの例では、PRJおよびMVT行列は、組み合わせて単一行列にすることができる。ただし、理解しやすくするために、これらの行列は別々に記述する。
投射行列(PRJ)およびモデルビュー、または世界ビュー、変換行列(MVT)は、APIによって定義することができる。モデルビューおよび世界ビューという用語は、互換的に使うことができる。Vclip、Veye、およびVworldは、4つの成分(たとえば、x、y、z、およびw座標)を含み得る。たとえば、Vclip、Veye、およびVworldは、次のように表すことができる。
プログラマブルシェーダを有するOpenGL、OpenGL ES、およびOpenGL ES2.0APIは、PRJ行列を次のように定義する。
上式で、LおよびRは、それぞれ、左および右の垂直クリップ面についての座標を指定し、BおよびTは、それぞれ、下および上の水平クリップ面についての座標を指定し、znearおよびzfarは、それぞれ、近および遠深度クリップ面までの距離を指定する。
いくつかの例では、クリップ面は対称的であってよい。たとえば、−LはRに等しくてよく、−BはTに等しくてよい。これらの事例において、PRJ行列は、以下に単純化し得る。
プログラマブルシェーダを有するOpenGL、OpenGL ES、およびOpenGL ES2.0APIは、MVT行列を次のように定義する。
PRJおよびMVT行列の変数はすべて、アプリケーションプロセッサ12上で実行するアプリケーション32によって定義することができ、グラフィックスドライバ14は、これらの変数を、頂点シェーダ28のオブジェクトコードを実行中のシェーダプロセッサ22に与えればよい。これらの変数を有する式1、4、および5からわかるように、頂点シェーダ28は、頂点の各々についてのVclip座標を判断することができる。GPU20は、頂点についてのクリップ座標を使用し、固定機能パイプライン26およびフラグメントシェーダの機能性とともに、さらなる機能性を実施して、画像を表示用にレンダリングすることができる。このように、GPU20は、アプリケーション32によって生成されたグラフィックスコンテンツ用のモノビューを生成することができる。
本開示の技法によると、頂点シェーダ28は、MVTおよびPRJ行列用の変数を使用して、Vclip座標を決定することができるが、MVTおよびPRJ行列は、立体ビューを生成するように頂点シェーダ28のソースコードを修正するのに必要とされなくてもよい。そうではなく、本開示の技法は、立体ビュー(たとえば、左目画像および右目画像)用のクリッピング座標を生成するように、モノビュー用に生成されるクリッピング座標(Vclip)を修正する、頂点シェーダ28中の命令を含み得る。
上の例では、モノビュー用のVclip座標を決定するための一方法を説明している。クリッピング座標を算出するための多くの異なる技法があってよく、概して、クリッピング座標を算出するのに使用される特定の技法は重要でなくてよい。ただし、いずれにしても、3Dグラフィックスコンテンツの場合、クリッピング座標(Vclip)は、クリッピング座標を算出するのに使われる技法にかかわらず、算出される必要があり得る。たとえば、アプリケーションプロセッサ12がクリッピング座標を決定することさえも可能であってよく、グラフィックスドライバ14は、頂点シェーダ28のオブジェクトコードを実行中であるシェーダプロセッサ22にクリッピング座標を与えればよい。この例では、PRJおよびMVT行列は、ユニティ行列であり得る。たとえば、アプリケーションプロセッサ12は、式1の行列乗算を実施し、結果をシェーダプロセッサ22に与えればよい。この例では、シェーダプロセッサ22は、受信した値をユニティ行列で乗算して、アプリケーション32によって生成された頂点の各々についてのVclip座標を生成することができる。
ただし、いずれの場合にも(たとえば、頂点シェーダ28がクリッピング座標を決定する場合、または頂点シェーダ28がクリッピング座標を受信する場合)、頂点シェーダ28は、クリッピング座標を記憶するのに固有変数を使用することができる。固有変数は、頂点シェーダ28がそのために設計されるAPIに固有であり得る。たとえば、頂点シェーダ28が、プログラマブルシェーダとともにOpenGL、OpenGL ES、またはOpenGL ES2.0APIに従って設計される場合、頂点シェーダ28は、クリッピング座標をgl_Position変数に記憶することができる。他のグラフィックスAPIにも、同様の変数があり得る。たとえば、頂点シェーダ28が、プログラマブルシェーダとともに、OpenGL、OpenGL ES、またはOpenGL ES2.0APIに従って設計される場合、頂点シェーダ28は、gl_Position.x=xclip、gl_Postion.y=yclip、gl_Position.z=zclip、およびgl_Position.w=wclipなどの命令を含んでよく、ここで、式2において上で示したとおり、次のようになる。
本開示に記載する1つまたは複数の例示的技法において、グラフィックスドライバラッパー16は、アプリケーションプロセッサ12上で実行するソフトウェアであってよく、モノビューについてのクリッピング座標を定義する、頂点シェーダ28の命令を、立体ビュー用のクリッピング座標(たとえば、左目画像用のクリッピング座標および右目画像用のクリッピング座標)を定義するように修正することができる。また、グラフィックスドライバラッパー16は、クリッピング座標を定義する、頂点シェーダ28の命令の修正に加え、モノビュー用のビューポートを定義する命令を、立体ビュー用のビューポートを定義するように修正することができる。
「ビューポート」という用語は、画像がディスプレイ上で取り囲むエリアを指す。たとえば、アプリケーション32は、画像を表示するディスプレイ上での単一画像(たとえば、モノビュー)のサイズと場所とを定義することができる。単一画像のサイズおよび場所のこの定義は、単一画像用のビューポートと見なされ得る。ビューポートを定義するために、アプリケーション32は、ディスプレイ上でのモノビュー画像のサイズと場所とをその変数が定義するglViewportコマンドを発行することができる。グラフィックスドライバラッパー16は、単一画像のサイズと場所とを定義するコマンド、たとえば、アプリケーション32によって発行されたglViewportコマンドを、左目画像および右目画像のサイズと場所とを定義するコマンド(たとえば、左目画像用のビューポートと、右目画像用のビューポートとを定義するglViewportコマンド)に修正することができる。左目画像用のglViewportコマンドは、左目画像をディスプレイの一部分に制限することができ、右目画像用のglViewportコマンドは、右目画像をディスプレイの別の部分に制限することができる。
本開示の例において、グラフィックスドライバラッパー16は、外部のビューポートを定義する命令を、頂点シェーダ28の命令を修正する命令に修正することができる。言い換えれば、グラフィックスドライバラッパー16は、頂点シェーダ28の命令を、立体ビューの左目画像および右目画像用のビューポートを修正するように修正する必要がなくてよい。そうではなく、グラフィックスドライバラッパー16は、ビューポートを定義する命令を、左目画像および右目画像が表示されると、固定機能パイプライン24の固定機能ユニット(たとえば、ビューポート変換ユニット)が、左目画像を制限する、左目画像用のビューポートをディスプレイの一部分に適用し、右目画像を制限する、右目画像用のビューポートをディスプレイの別の部分に適用するように修正すればよい。
いくつかの例では、固定機能パイプライン24のビューポート変換ユニットは、左目画像をディスプレイの左半分に、右目画像をディスプレイの右半分に制限することができるが、本開示の態様は、そのように限定されるわけではない。ビューポート変換ユニットは、左目画像および右目画像を、ディスプレイの左半分および右半分以外の部分に制限することができる。概して、ビューポート変換ユニットは、より詳細に説明したように、左目画像および右目画像を、ビューポート変換ユニットが受信する変更されたビューポート命令に基づく、ディスプレイの部分に制限することができる。
一例として、GPU20に画像をレンダリングさせるために、アプリケーション32は、glShaderSourceコマンドを実行すればよい。glShaderSourceコマンドは、グラフィックスドライバ14に、システムメモリ26から頂点シェーダ28のソースコードを取り出すよう命令する。本開示の例では、アプリケーション32によって発行されたglShaderSourceコマンドに応答して、グラフィックスドライバラッパー16は、頂点シェーダ28のソースコードを、グラフィックスドライバ14に届く前にインターセプトすることができる。グラフィックスドライバラッパー16は、頂点シェーダ28のソースコードを、修正された頂点シェーダ28が実行されると、シェーダ28に、立体ビュー用のグラフィックスコンテンツを生成させる命令を含むように修正すればよい。たとえば、グラフィックスドライバラッパー16は、修正された頂点シェーダ28を2回実行させることができる。第1の実行において、修正された頂点シェーダ28は、左目画像用のグラフィックスコンテンツを生成することができ、第2の実行において、修正されたシェーダ28は、右目画像用のグラフィックスコンテンツを生成することができ、または逆も同様である。
グラフィックスドライバラッパー16は、アプリケーションプロセッサ12によって実行されると、ソースコードエディタとして機能し得る。一例として、グラフィックスドライバラッパー16は、アプリケーション32によって発行された命令を監視することができる。アプリケーション32がglShaderSourceコマンドを発行したことをグラフィックスドライバラッパー16が認識すると、グラフィックスドライバラッパー16は、頂点シェーダ28の命令(たとえば、頂点シェーダ28のソースコード)を捕捉し修正することができる。たとえば、グラフィックスドライバラッパー16は、単一画像(たとえば、モノビュー)用に生成されたクリッピング座標の値を、左目画像および右目画像(たとえば、立体ビュー)用のクリッピング座標を生成するように修正する命令を、頂点シェーダ28の命令に含めることができる。
たとえば、上述したように、頂点シェーダ28は、xclip座標についての値を記憶するgl_Position.xコマンドを含み得る。後でより詳細に論じるように、グラフィックスドライバラッパー16は、gl_Position.xの値(たとえば、xclip座標)を更新する命令を、頂点シェーダ28に含めることができる。左目画像を生成するために、グラフィックスドライバラッパー16によって頂点シェーダ28に追加された命令は、頂点シェーダ28に、xclip値に定数を加算させる。右目画像を生成するために、グラフィックスドライバラッパー16によって頂点シェーダ28に追加された命令は、頂点シェーダ28に、xclip値から定数を減算させる。
たとえば、グラフィックスドライバラッパー16は、頂点シェーダ28のソースコードを、gl_Position.x変数に記憶された値(たとえば、xclip座標)を、gl_Position.x変数に(znear*wworld/(R−L)/2)*Xをプラスした現在の値に変更する命令を追加するように修正すればよく、ここでznear、R、およびLはすべて、PRJ行列(式4)にある変数であり、wworldは、Vworld行列(式2)にある変数(たとえば、アプリケーション32によって定義される頂点座標)である。Xの値は+Dまたは−Dであってよく、Dは、閲覧者の右目と左目との間の距離の半分の近似であり、ユーザ定義可能であっても、あらかじめプログラムされた値であってもよい。
一例として、グラフィックスドライバラッパー16は、頂点シェーダ28の命令のセットに、gl_Position.x+=(znear*wworld/(R−L)/2)*Xという命令を追加することができる。この命令は、gl_Position.x=gl_Position.x+(znear*wworld/(R−L)/2)*Xと等価であり得る。たとえば、gl_Position.x+=コマンドは、gl_Position.x+=命令によって定義される値を、gl_Positionコマンドによって記憶された値に加算する(たとえば、xclipに値を加算する)。いくつかの状況では、gl_Position.x+=命令は、gl_Position.x+=Xに単純化し得る。gl_Position.x+変数が(znear*wworld/(R−L)/2)*Xまたは単なるXと等しくなり得る理由については、後でさらに詳しく説明する。
本開示の技法によると、左目画像を生成するために、グラフィックスドライバラッパー16は、変数Xの値を、+Dになるように定義すればよい。Xが+Dと等しいとき、gl_Position.x+=コマンドは、アプリケーション32によって生成された頂点の各々のxclip座標に、定数(たとえば(znear*wworld/(R−L)/2)*Dまたは単にD)を加算させ、それにより、頂点は、Dの値だけ左に移動する。右目画像を生成するために、グラフィックスドライバラッパー16は、変数Xの値を、−Dになるように定義すればよい。Xが−Dと等しいとき、gl_Position.x+=コマンドは、アプリケーション32によって生成された頂点の各々のxclip座標から、定数(たとえば(znear*wworld/(R−L)/2)*−Dまたは単に−D)を減算させ、それにより、頂点は、−Dの値だけ右に移動する。
頂点シェーダ28のソースコードを修正した後、グラフィックスドライバラッパー16は、頂点シェーダ28の修正されたソースコードをシステムメモリに記憶してよい。いくつかの例では、グラフィックスドライバラッパー16は、頂点シェーダ28の修正されたソースを、頂点シェーダ28の変更されていないソースコードがシステムメモリ26内で記憶される同じ場所に記憶してよい。代替例では、グラフィックスドライバラッパー16は、頂点シェーダ28の修正されたソースを、頂点シェーダ28の変更されていないソースコードが記憶される場所とは異なる、システムメモリ26内の場所に記憶してよい。
glShaderSourceコマンドの発行に続いて、アプリケーション32は、glCompileShaderコマンドを発行する。glCompileShaderコマンドは、アプリケーションプロセッサ12上で実行するコンパイラ18に、頂点シェーダ28の修正ソースコードをコンパイルさせる。たとえば、glCompileShaderコマンドは、コンパイラ18に、修正された頂点シェーダ28用のソースコードをシステムメモリ26から取り出させ、修正された頂点シェーダ28をコンパイルさせることができる。コンパイルの後、コンパイラ18は、得られたオブジェクトコードをシステムメモリ26に記憶する。たとえば、図に示すように、システムメモリ26は修正された頂点シェーダ30を含む。修正された頂点シェーダ30は、頂点シェーダ28の修正ソースコードをコンパイラ18がコンパイルした結果として得られるオブジェクトコードである。
さらに、上述したように、グラフィックスドライバラッパー16は、頂点シェーダ28に、gl_Position.x変数に定数を加算させて左目画像を生成し、gl_Position.x変数から定数を減算させて右目画像を生成する、頂点シェーダ28のソースコード中の命令を含み得る。修正された頂点シェーダ30のオブジェクトコードは、修正された頂点シェーダ30に、gl_Position.x変数に定数を加算させて左目画像を生成し、gl_Position.x変数から定数を減算させて右目画像を生成する命令を含む。より詳細に説明したように、修正された頂点シェーダ30は、描画コマンドに応答して、グラフィックスドライバラッパー16から定数の値を受信する。
アプリケーション32は、プロセッサ12によって実行されると、単一画像のビューポートを定義するコマンド(たとえば、ディスプレイ上での単一画像のサイズと場所とを定義するコマンド)を発行することもできる。このコマンドは、glViewportコマンドであり得る。glViewportコマンドは、画像についての開始座標(たとえば、xおよびy座標)と、画像の幅および長さとを定義する。glViewportコマンドの開始座標ならびに幅および長さ値は、画像のサイズと場所とを定義する。
本開示の例において、グラフィックスドライバラッパー16は、アプリケーション32によって発行されたglViewportコマンドを捕捉することができる。いくつかの例では、グラフィックスドライバラッパー16は、アプリケーション32によってGPU20へ発行されたglViewportコマンドを、グラフィックスドライバ14が送信するのを阻止することができる。そうではなく、グラフィックスドライバラッパー16は、アプリケーション32によって発行されたglViewportコマンドの開始座標と幅および長さ値とを、システムメモリ26に記憶することができる。
代替例では、グラフィックスドライバラッパー16は、アプリケーション32によってGPU20へ発行されたglViewportコマンドを、グラフィックスドライバ14が送信するのを許可することができる。この例では、上記と同様に、グラフィックスドライバラッパー16は、アプリケーション32によって発行されたglViewportコマンドの開始座標と幅および長さ値とを記憶することができる。この代替例では、アプリケーション32によって発行されたglViewportコマンドをGPU20が適用するのに先立って、グラフィックスドライバラッパー16は、アプリケーション32によって発行されたglViewportコマンドを修正し、修正されたglViewportコマンドをGPU20へ送信することができる。このようにして、GPU20は、アプリケーション32によって発行されたglViewportコマンドを受信したが、GPU20は、グラフィックスドライバラッパー16によって修正された、修正されたglViewportコマンドを実行することができる。
いずれの例においても、グラフィックスドライバラッパー16は次いで、1つまたは複数のプリミティブを描画するようGPU20に命令するコマンドを、アプリケーション32がGPU20に発行するまで待てばよい。この描画コマンドは、glDrawコマンドであり得る。glDrawArraysおよびglDrawElementsなど、glDrawコマンドの様々な例がある。描画コマンドのこれらの様々な例の各々は一般に、glDrawコマンドと呼ばれる。
アプリケーション32がglDrawコマンドを発行すると、グラフィックスドライバラッパー16は、glDrawコマンドを捕捉し、グラフィックスドライバ14がglDrawコマンドをGPU20へ送信するのを阻止する。グラフィックスドライバラッパー16は次いで、左目画像および右目画像用のグラフィックスコンテンツをGPU20に生成させる命令を生成する。一例として、グラフィックドライバラッパー16は、修正された頂点シェーダ30のオブジェクトコードをGPU20に2回実行させる命令を生成し、左目画像および右目画像用のビューポートを定義するための、2つのglViewportコマンドを発行し、2つのglDrawコマンドを発行する。
本技法の概要として、アプリケーション32によって発行されたglDrawコマンドをグラフィックスドライバ14が送信するのを、グラフィックスドライバラッパー16が阻止した後、グラフィックスドライバラッパー16は、シェーダプロセッサ22を使って、修正された頂点シェーダ20に立体ビューの第1の画像(たとえば、左目画像)用のクリッピング座標を生成する準備をさせるコマンドをGPU20に発行する。次いで、グラフィックスドライバラッパー16は、ディスプレイ上での第1の画像のサイズと場所とを定義する第1のglViewportコマンドを、固定機能パイプライン24のビューポート変換ユニットに発行すればよい。グラフィックスドライバラッパー16は次いで、第1のglViewportコマンドによって定義されるように、ディスプレイの第1の部分に制限された第1の画像をGPU20にレンダリングさせる第1のglDrawコマンドを、GPU20に発行すればよい。
グラフィックスドライバラッパー16は次いで、シェーダプロセッサ22に、立体ビューの第2の画像(たとえば、右目画像)用のクリッピング座標を生成するように修正された頂点シェーダ30を準備させるコマンドをGPU20に発行する。次いで、グラフィックスドライバラッパー16は、ディスプレイ上での第2の画像のサイズと場所とを定義するビューポートに対する第2のglViewportコマンドを、固定機能パイプライン24のビューポート変換ユニットに発行すればよい。グラフィックスドライバラッパー16は次いで、第2のglViewportコマンドによって定義されるように、ディスプレイの第2の部分に制限された第2の画像をGPU20にレンダリングさせる第2のglDrawコマンドを、GPU20に発行すればよい。
本開示の技法については、上では概要として説明したが、以下の例において、より詳しく説明する。理解しやすくするためにのみ、以下の例では、本技法は、左目画像用のグラフィックスコンテンツを最初に、続いて右目画像用のグラフィックスコンテンツを生成するGPU20を用いて説明されるが、その反対も可能である。また、理解しやすくするためにのみ、左目画像用のビューポートがディスプレイの左半分に制限され、右目画像用のビューポートがディスプレイの右半分に制限される技法について説明されるが、これが限定的と見なされるべきではない。
たとえば、グラフィックスドライバラッパー16がglViewportコマンドをインターセプトし、次いで、アプリケーション32によって発行されたglDrawコマンドを阻止した後、グラフィックスドライバラッパー16は、左目画像用のクリッピング座標を生成するようGPU20に命令する命令を生成する。やはり、いくつかの例では、グラフィックスドライバラッパー16は、アプリケーション32によって発行されたglViewportコマンドの、GPU20への送信を阻止し得ることに留意されたい。他の例では、グラフィックスドライバラッパー16は、アプリケーション32によって発行されたglViewportコマンドが、GPU20に送信されることを許可し得る。ただし、これら例のいずれにおいても、グラフィックスドライバラッパー16は、修正されたglViewportコマンドをGPU20に送信することができる。このようにして、GPU20が、アプリケーション32によって発行されたglViewportコマンドを受信した場合であっても、GPU20は、アプリケーション32によって発行されたglViewportコマンドを実行することができず、代わりに、グラフィックスドライバラッパー16によって発行された修正されたglViewportコマンドを実行すればよい。言い換えれば、グラフィックスドライバラッパー16によって修正された、修正されたglViewportコマンドは、アプリケーション32によって発行されたglViewportコマンドをリセットする。
一例として、グラフィックスドライバラッパー16は、GPU20に、修正された頂点シェーダ30のオブジェクトコードを実行させる命令を生成する。応答として、GPU20のシェーダプロセッサ22は、修正された頂点シェーダ30のオブジェクトコードを実行する。さらに、グラフィックスドライバラッパー16は、左目画像用のクリッピング座標を生成するために、修正された頂点シェーダ30がgl_Position.x変数に加算するべき定数値を送信する。修正された頂点シェーダ30のオブジェクトコードを実行したことによる、シェーダプロセッサ22の出力は、左目画像の頂点についてのクリッピング座標である。
たとえば、上述したように、グラフィックスドライバラッパー16は、頂点シェーダ28のソースコードに、gl_Position.x+=(znear *world/(R−L)/2)*X、または単にgl_Position.x+=Xという命令を含めることができ、その理由について説明する。znear、wworld、R、およびLという変数は、式(2)および(4)を参照して上述したように、シェーダプロセッサ22に知られている可能性があり得る。ただし、本開示の態様は、znear、wworld、R、およびL変数の値をシェーダプロセッサ22が知っていることを要求するわけではない。たとえば、znear、wworld、R、およびL変数は、各々が定数であってよく、それゆえ、(znear*wworld/(R−L)/2)の結果は定数値になるはずである。この場合、(znear*wworld/(R−L)/2)の値は、推定され、またはユーザによって提供され、Xの値に乗算され得る。より詳細に説明するように、いくつかの例では、(znear*wworld/(R−L)/2)は1に単純化し得る。
いくつかの例では、シェーダプロセッサ22は、Xの値を知らなくてよい。左目画像に対して、グラフィックスドライバラッパー16は、修正された頂点シェーダ30のオブジェクトコードを実行するようシェーダプロセッサ22に命令する命令に加え、Xの値をシェーダプロセッサ22に送信すればよい。いくつかの例では、Xの値は、左目画像の場合、+Dであってよく、Dは、閲覧者の目と目との間の距離のほぼ半分に等しく、ユーザ定義されても、あらかじめプログラムされてもよい。変数Xの値は+Dであるので、gl_Position.x+=コマンドは、シェーダプロセッサ22に、gl_Position.x変数に記憶された値にDの値を加算させる(たとえば、xclipの値にDを加算させる)。
グラフィックスドライバラッパー16は、左目画像用のビューポートも定義する。たとえば、アプリケーション32がglDrawコマンドを発行したときに先立って、アプリケーション32は、グラフィックスドライバラッパー16がインターセプトしたglViewportコマンドを発行している。グラフィックスドライバラッパー16はまた、開始座標と、幅および長さ値とを、システムメモリ32に記憶している。左目画像用のビューポートを定義するために、グラフィックスドライバラッパー16は、アプリケーション32によって発行された、インターセプトされたglViewportコマンドを修正すればよい。
たとえば、glViewportコマンドは、4つの変数を含み、最初の2つの変数は、ディスプレイ上の画像についての開始座標を定義し、最後の2つの変数は、画像の幅と長さとを定義する。幅および長さ変数は、必ずしも座標値ではない。そうではなく、幅および長さ変数は、画像が開始座標から伸長する量を定義する。たとえば、アプリケーション32は、glViewport(0,0,width,length)と述べるglViewportコマンドを発行することができる。この例では、(0,0)は、ディスプレイの左下を指す。変数「width」はディスプレイの幅を指し、変数「length」はディスプレイの長さを指す。したがって、この例では、アプリケーション32は、画像のビューポートを、ディスプレイの全体を取り囲むように定義するが、この定義は、モノビュー画像と矛盾しない。ただし、アプリケーション32は、説明したもの以外の、異なる変数をglViewportコマンドに割り当ててもよい。
本開示によると、グラフィックスドライバラッパー16は、glViewportコマンド(たとえば、前述の例のglViewport(0,0,width,length))をインターセプトし、このビューポートコマンド用の変数を修正することができる。たとえば、グラフィックスドライバラッパー16は、glViewportコマンドの変数を、左目画像をディスプレイの所望の部分に制限するように修正してよい。説明しやすくするために、本技法は、左目画像をディスプレイの左半分に、右目画像をディスプレイの右半分に制限することについて述べるが、態様はそのように限定されるわけではない。
左目画像に対して、グラフィックスドライバラッパー16は、アプリケーション32によって発行されたglViewportコマンドを、glViewport(0,0,width/2,length)に修正してよい。この例では、width/2は、ディスプレイの幅の半分になる。たとえば、修正されたglViewportコマンドは、左目画像がディスプレイの左端から始まり(たとえば、x軸上の0ポイントから始まり)、「width/2」の距離だけ右に伸びることを示し、その結果、左目画像をディスプレイの左半分に制限することになる。また、修正されたglViewportコマンドは、左目画像が、ディスプレイの下から始まり(たとえば、y軸上の0ポイントから始まり)、「length」の距離だけ上に伸びることを示し、その結果、画像をディスプレイの上および下に制限することになる。
グラフィックスドライバラッパー16は次いで、第1のglDrawコマンドをGPU20に発行すればよい。glDrawコマンドに応答して、GPU20は、固定機能パイプライン24とフラグメントシェーダとを介した、修正された頂点シェーダ30のオブジェクトコードの実行によって生成された左目画像についてのクリッピング座標を処理することができる。この例では、第1のglViewportコマンドは、左目画像をディスプレイの左半分に制限することができる。glDrawコマンドは次いで、GPU20に、左目画像を一時記憶のためにフレームバッファにレンダリングさせることができる。たとえば、フレームバッファは、右目画像が生成されるまで、左目画像を記憶することができる。次いで、GPU20は、フレームバッファの全体をディスプレイプロセッサ(図示せず)に出力することができる。ディスプレイプロセッサは、ディスプレイに、立体ビューを生成するために左目画像と右目画像とを表示させることができる。
グラフィックスドライバラッパー16は、左目画像を生成するためではあっても、右目画像を生成するための同じステップを繰り返してよい。たとえば、グラフィックスドライバラッパー16は、シェーダプロセッサ22に、修正された頂点シェーダ30のオブジェクトコードを実行させるための別の命令を発行する。さらに、グラフィックスドライバラッパー16は、右目画像用のクリッピング座標を生成するために、修正された頂点シェーダ30がgl_Position.x変数から減算するべき定数値を送信する。修正された頂点シェーダ30のオブジェクトコードを実行したことによる、シェーダプロセッサ22の出力は、右目画像の頂点についてのクリッピング座標である。
上述したように、グラフィックスドライバラッパー16は、命令gl_Position.x+=(znear*wworld/(R−L)/2)*X、または単にgl_Position.x+=Xを、頂点シェーダ28のソースコードに追加すればよい。左目画像に対して、変数Xの値は、+D(たとえば、閲覧者の目と目との間の距離の半分)であり得る。本開示の例では、右目画像に対して、変数Xの値は−Dであり得る。変数Xの値は−Dであるので、gl_Position.x+=コマンドは、シェーダプロセッサ22に、gl_Position.x変数に記憶された値からDの値を減算させる(たとえば、xclipの値から−Dを減算させる)。
グラフィックスドライバラッパー16は、右目画像用のビューポートも定義する。上述したように、左目画像に対して、グラフィックスドライバラッパー16は、左目画像をディスプレイの左半分に制限するために、ビューポートを、glViewport(0,0,width/2,length)になるように定義する。右目画像に対して、グラフィックスドライバラッパー16は、ビューポートを、glViewport(width/2,0,width/2,length)になるように定義すればよい。この例では、(width/2,0)座標は、右目画像がディスプレイの中央から始まり、右に伸びることを示す。また、glViewportコマンド中の(width/2,length)変数は、右目画像がディスプレイの幅の半分およびディスプレイの全長だけ伸びることを示す。
それゆえ、この例では、修正されたglViewportコマンド(たとえば、glViewport(width/2,0,width/2,length))は、右目画像をディスプレイの右半分に制限することになる。たとえば、修正されたglViewportコマンドは、右目画像がディスプレイの中央から始まり(たとえば、x軸上のwidth/2ポイントから始まり)、「width/2」の距離だけ右に伸びることを示し、その結果、右目画像をディスプレイの右半分に制限することになる。また、修正されたglViewportコマンドは、右目画像が、ディスプレイの下から始まり(たとえば、y軸上の0ポイントから始まり)、「length」の距離だけ上に伸びることを示し、その結果、画像をディスプレイの上および下に制限することになる。
グラフィックスドライバラッパー16は次いで、第2のglDrawコマンドをGPU20に発行すればよい。glDrawコマンドに応答して、GPU20は、固定機能パイプライン24とフラグメントシェーダとを介した、修正された頂点シェーダ30のオブジェクトコードの実行によって生成された右目画像についてのクリッピング座標を処理することができる。この例では、第2のglViewportコマンドは、右目画像をディスプレイの右半分に制限することができる。glDrawコマンドは次いで、GPU20に、右目画像を一時記憶のためにフレームバッファにレンダリングさせることができる。この場合、GPU20は、左目画像をフレームバッファにすでに記憶していてよく、GPU20は、立体ビューを生成するために、ディスプレイプロセッサに、記憶された左目画像と右目画像とをフレームバッファから取り出し、表示するよう命令することができる。
上述したように、グラフィックスドライバラッパー16は、命令gl_Position.x+=Xコマンドを、頂点シェーダ28のソースコードに追加すればよい。左目画像と右目画像との間のわずかなずれを引き起こして、立体ビューのポップアウトまたはプッシュ効果を引き起こす、頂点シェーダ28のソースコードに追加されるのは、gl_Position.x+=コマンドである。左目画像および右目画像をディスプレイの適切な部分(たとえば、それぞれ、ディスプレイの左半分および右半分)に制限するのは、モノビュー用のビューポートを定義する命令(たとえば、glViewport)を、右目画像および左目画像用のビューポートを定義する命令に修正することである。
理解をさらに助けるために、グラフィックスドライバラッパー16は、頂点シェーダ28の命令を、gl_Position.x+=コマンドを含むように修正していないが、グラフィックスドライバラッパー16は、glViewportコマンドを修正し、GPU20に、2つのglViewportコマンドと2つのglDrawコマンドとを実行させたと仮定する。この場合、GPU20は、2つのglDrawコマンドにより、2つの画像をレンダリングすることになる。ただし、この例では理解を助けるために、これらの2つの画像が互いの上に位置する場合、ずれはなく、2つの画像の内容は完全に整列することになる。2つの画像の内容にずれがないので、いかなる立体効果もなく、画像は、閲覧者には、ディスプレイの2Dエリアに制限された単一画像として見えることになる。gl_Position.x+=コマンドを含めると、2つの画像の内容にずれが引き起こされ得る。次いで、閲覧者が左目画像と右目画像とを同時に見ると、左目画像は右目から遮断され、右目画像は左目から遮断され、閲覧者の脳は、2つの画像の内容のずれを解消して、立体ビューのポップアウトまたはプッシュイン作用を生じさせる。
さらに、いくつかの例では、グラフィックスドライバラッパー16は、上述した修正に加え、ビューポートをさらに修正することができる。たとえば、上述したように、グラフィックスドライバラッパー16は、左目画像に対するglViewport命令をglViewport(0,0,width/2,length)に修正し、右目画像に対するglViewport命令をglViewport(width/2,0,width/2,length)に修正することができる。閲覧者がこれらの2つの画像(たとえば、立体ビュー)を見ると、閲覧者は、ゼロ視差平面(ZDP)上の3Dボリュームを取り囲む立体画像を知覚することができる。
ZDPは、ディスプレイからポップアウトされ、またはディスプレイにプッシュインされるように見え(たとえば、ディスプレイの前または後ろに見え)得る。ただし、ZDPの場所は、必ずしも所望の場所にはなくてよい。たとえば、ZDPがさらにポップアウトされ、それほどポップアウトされず、それほどプッシュインされず、またはさらにプッシュインされる場合、閲覧者は、豊かな、より現実的な視認体験を体験することができる。
ビューポートシフトまたはZDPのシフトと呼ばれ得るZDPを変更するために、グラフィックスラッパードライバ16は、左目画像および右目画像に対する左境界をシフトしてよい。たとえば、立体ビューがディスプレイからポップアウトされる量を変更するために、左目画像に対して、グラフィックスラッパー16は、glViewportコマンドを(0−Vps,0,width/2,length)に修正してよく、右目画像に対して、グラフィックスラッパー16は、glViewportコマンドを((width/2+Vps),0,width/2,length)に修正してよい。
これらの例では、Vps値は、ビューポートシフトを指し、左目画像のビューポートがシフトする量と、右目画像のビューポートがシフトする量とを示す。Vps値は、ユーザ選択可能であっても、あらかじめプログラムされてもよい。たとえば、閲覧者が、ZDPを現在の場所から(たとえば、ビューポートシフトに先立って)シフトすることを望む場合、閲覧者は、ZDPの所望の場所を実現するVps値を選択すればよい。あるいは、Vps値は、ZDPが最適に位置すると閲覧者が見なした場所の測定値を与えるテストに基づいて、あらかじめプログラムすることができる。たとえば、Vpsが正の値の場合、立体ビューがポップアウトされる量は減少し得る(たとえば、ZDP面は、ディスプレイに比較的近い)。Vpsが負の値の場合、立体ビューがポップアウトされる量は増大し得る(たとえば、ZDP面は、ディスプレイからさらに離れる)。
いくつかの例では、ビューポートシフトに加え、グラフィックスドライバラッパー16は、ビューポートストレッチのために、左目画像および右目画像用のglViewportコマンドを修正することができる。ビューポートストレッチは、ビューポートのサイズをストレッチすることと見なしてよく、左目画像および右目画像のストレッチを生じ得る。いくつかの事例では、ビューポートシフトおよびビューポートストレッチの結果、より良好な立体ビューが生じ得る。ビューポートシフトおよびビューポートストレッチは一般に、ビューポートの修正と呼ぶことができる。言い換えれば、グラフィックスドライバラッパー16は、アプリケーション32によって発行されたglViewportコマンドを、それぞれ、左目画像および右目画像用のビューポートを定義する、左目画像および右目画像用のglViewportコマンドを生成するように修正することができる。この例では、グラフィックスドライバラッパー16は、左目画像および右目画像のビューポートをさらに修正することができる(たとえば、ビューポートシフトまたはビューポートシフトおよびビューポートストレッチ)。
左目画像用のビューポートをストレッチするために、グラフィックスドライバラッパー16は、左目画像用のglViewportコマンドを、glViewport(0−Vps,0,width/2+Vps,length)となるように修正すればよい。右目画像用のビューポートをストレッチするために、グラフィックスドライバラッパー16は、右目画像用のglViewportコマンドを、glViewport(width/2,0,width/2+Vps,length)となるように修正すればよい。例示的技法において、ビューポートシフトおよびビューポートストレッチは、すべての事例において必要でなくてもよい。たとえば、いくつかの例では、グラフィックスドライバラッパー16は、アプリケーション32によって発行されたglViewportコマンドを、左目画像および右目画像用のglViewportコマンドに修正することができ、いかなる追加ビューポートシフトまたはストレッチも実施しなくてよい。いくつかの代替例では、グラフィックスドライバラッパー16は、アプリケーション32によって発行されたglViewportコマンドを修正し、左目画像および右目画像のビューポートをさらに修正することができる(たとえば、ビューポートシフト、またはビューポートシフトおよびビューポートストレッチ)。
いくつかの例では、ビューポートシフトおよびビューポートストレッチは、glViewportコマンドの修正と同時に実施することができる。たとえば、上述したように、グラフィックスドライバラッパー16は、左目画像に対するglViewportコマンドをglViewport(0,0,width/2,length)に修正し、右目画像用をglViewport(width/2,0,width/2,length)に修正することができる。いくつかの例では、ユーザがビューポートシフト値(たとえば、Vps)を入力することを望む場合、グラフィックスドライバラッパー16は、上述したように、ビューポートをシフトし、またはシフトおよびストレッチすることができる。代替例では、グラフィックスドライバラッパー16は、Vps値があらかじめプログラムされている例において、glViewportコマンドを修正するとき、Vps値を事前に加算または減算することができる。
一例として、ディスプレイのサイズが10x10ピクセルであり、Vps値は、立体ビューがポップアウトされる量を減らすために、2になるように選択され、またはあらかじめプログラムされると仮定する。この例では、ビューポートシフトに先立って、左目画像用のビューポートは(0,0,5,9)であってよく、右目画像用のビューポートは(5,0,5,9)であってよい。グラフィックスドライバラッパー16は、ZDPをシフトするために2(たとえば、Vpsの値)を減算することによって、左目画像用のビューポートをシフトすることができる。この例では、左目画像用のビューポートは(−2,0,5,9)になり得る。グラフィックスドライバラッパー16は、ZDPをシフトするために2(たとえば、Vpsの値)を加算することによって、右目画像用のビューポートをシフトすることができる。この例では、右目画像用のビューポートは(7,0,5,9)になり得る。同様の算出を実施して、ビューポートストレッチ後のビューポートを決定することができる。
ビューポートシフトされた左目画像に対して、GPU20は、左目画像のピクセルのうち一部をクロップすることができる。たとえば、ディスプレイの座標は、この例では(0,0,9,9)であり得る。ただし、ビューポートシフトされた左目画像についての座標は(−2,0,5,9)であってよく、これは、ビューポートシフトされた左目画像がディスプレイの左エッジよりもさらに左で始まることを意味する。GPU20の固定機能パイプライン24は、ディスプレイの左エッジよりも座標がさらに左であるピクセルをクロップすることができる。同様に、ビューポートシフトされた右目画像に対して、GPU20は、右目画像のピクセルのうち一部をクロップすることができる。たとえば、ビューポートシフトされた右目画像についての座標は(7,0,5,9)であってよく、これは、ビューポートシフトされた右目画像がディスプレイの右エッジよりもさらに右で終わることを意味する。GPU20の固定機能パイプライン24は、ディスプレイの右エッジよりも座標がさらに右であるピクセルをクロップすることができる。やはり、同様の算出を、ビューポートストレッチ用に実施することができる。
ビューポートシフトまたはシフトおよびストレッチされたZDP(たとえば、ビューポートシフトまたはシフトおよびストレッチされた左目画像および右目画像から得られたZDP)の場所は、以下の式によって決定することができる。
上式で、ZDP’は、ビューポートシフトされたZDPの場所に等しく、znearは、PRJ行列(式4)中で定義され、Dは、閲覧者の左目と右目との間の半分の距離であり、ZDPは、元の(たとえば、ビューポートシフトに先立つ)場所であり、Vpsは、左目画像および右目画像の左境界がシフトされる量である。
いくつかの事例では、znear、ZDP、D、またはVpsの値は、閲覧者にとって利用可能でない場合がある。これらの事例において、閲覧者が望ましいビューポートシフトされたZDPまたはシフトおよびストレッチされたZDPを見つけるまで、閲覧者は、依然としてVps値を修正する(たとえば、値を増分し、または値を減分する)ことができる。Vps値の修正は、すべての例において必要なわけではなく、あらかじめプログラムされたVps値により、適度に豊かであり現実的な視認体験がほとんどの閲覧者に提供される場合もある。
いくつかの例では、本開示に記載する技法は、モノビュー用の画像を生成するための命令を、実行またはランタイム中に、立体ビュー用の画像を生成するように修正してよい。たとえば、閲覧者は、アプリケーション32を実行用に選択することができ、アプリケーション32は、アプリケーション32の実行によって生成されたグラフィックスを処理するための頂点シェーダ28の実行を要求し得る。アプリケーション32がデバイス10上で実行または稼動している間、グラフィックスドライバ14、グラフィックスドライバラッパー16、およびコンパイラ18は、それぞれの機能を実施して、頂点シェーダ28のソースコードを修正し、修正された頂点シェーダ30用のオブジェクトコードを生成することができる。たとえば、グラフィックスドライバラッパー16は、ランタイム中に、アプリケーション32によって発行されたglViewportコマンドをインターセプトし、いくつかの例では、ランタイム中に、アプリケーション32によって発行されたglViewportコマンドの、GPU20への送信を阻止し、または他の例では、アプリケーション32によって発行されたglViewportコマンドの、GPU20への送信を許可することができる。いずれの例においても、グラフィックスドライバラッパー16は、アプリケーション32によって発行されたglViewportコマンドを修正することができ、そうすることによって、GPU20によって実行されるglViewportコマンドは、グラフィックスドライバラッパー16によって修正された、修正されたglViewportコマンドである。
さらに、アプリケーション32が描画コマンド(たとえば、glDraw)を発行すると、グラフィックスドライバラッパー16は、このglDrawを捕捉し、GPU20への送信を阻止すればよい。このglDrawコマンドは、アプリケーション32がランタイム中に発行したものであり、グラフィックスドライバラッパー16に、上述したように、左目画像および右目画像用のビューポートを定義する命令を含めさせ、GPU20に左目画像および右目画像用のグラフィックスコンテンツを生成させるための2つのglDrawコマンドを含めさせるトリガとして機能し得る。
また、上記の例は、グラフィックスドライバラッパー16が頂点シェーダ28に命令を追加し、頂点シェーダ28の命令を修正し、ビューポートを定義する命令を修正するコンテキストにおいて説明してあるが、本開示の態様は、そのように限定されるわけではない。代替例では、グラフィックスドライバラッパー16よりもむしろ、グラフィックスドライバ14またはコンパイラ18が、頂点シェーダ28の命令と、ビューポートを定義する命令とを修正することが可能な場合がある。ただし、これらの例は、グラフィックスドライバ14またはコンパイラ18に対する修正を要求するわけではない。
グラフィックスドライバ14またはコンパイラ18に対する修正は、GPU20が立体ビュー用の左目画像と右目画像とを生成するように、グラフィックスドライバラッパー16を開発し、グラフィックスドライバラッパー16に、本開示に記載する機能を実施させるよりも困難な場合がある。たとえば、デバイス10は、以前から存在するグラフィックスドライバ14およびコンパイラ18をロード済みである場合があり、グラフィックスドライバ14とコンパイラ18とを変更することは困難な場合がある。頂点シェーダ28に対する修正を実施するグラフィックスドライバラッパー16を追加することによって、例示的技法は、以前から存在するグラフィックスドライバ14およびコンパイラ18に対する修正を要求するわけではない。
さらに、上述した技法により、GPU20は、アプリケーション32に対する修正なしで、立体ビュー用の画像を生成することが可能になり得る。たとえば、立体ビューを生成するためのいくつかの他の技法は、アプリケーション32の開発者が、アプリケーション32のソースコードを、左目画像および右目画像用のピクセル値を生成するように修正することを要求する場合がある。これらの技法は、アプリケーション32の開発者に対して、立体ビュー用の開発者のアプリケーションを修正するための支援を要求しており、これは、アプリケーション32の開発者にとって面倒な作業になり得る。上述した例示的技法は、アプリケーション32の開発者からのいかなる支援もなしで、モノビュー用に開発されたアプリケーション32用の立体ビューを提供することができる。
また、上述した技法は、立体ビュー用の左目画像および右目画像を生成するための、システムメモリ26に対する複数の呼出しを要求するわけではない。たとえば、立体ビューを生成するためのいくつかの他の技法では、GPUは、左目画像を生成することになる。左目画像の生成が完了すると、GPUは、右目画像を生成するために、左目画像を生成する間、システムメモリ26に記憶された深度情報を使用することになる。ただし、深度情報を取り出すための、システムメモリ26に対する反復呼出しは、計算コストが高い場合があり、過度の電力消費を要求する場合がある。
上述した例示的技法は、右目画像を生成するために、左目画像についての深度情報を求める、システムメモリ26に対する、そのような複数の呼出しを要求するわけではない。たとえば、グラフィックスドライバラッパー16は、頂点シェーダ28のソースコードと、ビューポートを定義する命令とを修正して、左目画像および右目画像を互いから独立して生成することができ、一方の画像の深度情報を、他方の画像を生成するのには必ずしも必要としない。たとえば、上述した、頂点シェーダ28中に追加される命令およびglViewportコマンドの修正ならびに2つのglDrawコマンドの発行は、どの深度情報も要求するわけではなく、いくつかの例では、右目画像についての情報を要求することなく、左目画像を生成することができ、その逆も同様である。このように、本開示に記載する技法は、他の技法と比較して、立体ビューを生成するための、システムメモリ26へのアクセスの回数を減らすことができる。
さらに、上述したように、glViewportコマンドは、固定機能パイプライン24の固定機能ユニット(たとえば、固定機能パイプライン24のビューポート変換ユニット)によって使用されるのであって、シェーダプロセッサ22によって使用されるのではない。このように、頂点シェーダ28用のソースコードは、ディスプレイの第1の部分(たとえば、ディスプレイの左半分)への左目画像のレンダリングを強制し、ディスプレイの他の部分(たとえば、ディスプレイの右半分)への右目画像のレンダリングを強制するように修正される必要はなくてよい。そうではなく、固定機能パイプライン24の固定機能ユニットは、修正されたglViewportコマンドを適用して、左目画像をディスプレイの左目画像部分に、右目画像をディスプレイの右目画像部分に制限すればよい。こうすることにより、頂点シェーダ28に対する修正を削減および単純化することができ、シェーダプロセッサ22の計算効率を上げることができる。
たとえば、本開示の技法によると、グラフィックスドライバラッパー16は、頂点シェーダ28のソースコードを、左目画像と右目画像との間にずれを与えるように修正することができる。たとえば、左目画像および右目画像用のクリッピング頂点座標を生成するとき、修正された頂点シェーダ30のオブジェクトコードを実行中のシェーダプロセッサ22は、生成されたグラフィックスデータがどこに表示されるか気づかない場合がある。言い換えれば、シェーダプロセッサ22には、左目画像および右目画像についてのグラフィックスデータがどこに提示されるべきかを定義するタスクを課さなくてよい。シェーダプロセッサ22の外部のユニットである固定機能パイプライン24のビューポート変換ユニットに、左目画像および右目画像をディスプレイのそれぞれの部分に制限するタスクを課せばよい。このように、シェーダプロセッサ22は、左目画像および右目画像がどこに表示されるべきか判断する際、計算周期を浪費する必要がなくてよい。固定機能パイプライン24のビューポート変換ユニットのハードワイヤード機能性は、シェーダプロセッサ22と比較して、左目画像、右目画像をディスプレイ上のそれぞれの部分に制限するのにより適している可能性がある。
たとえば、頂点シェーダ28用のソースコードが、ゼロ視差平面(ZDP)を制御するように、左目画像および右目画像がどこに表示されるか判断するように修正されている場合、ソースコードは、シェーダプロセッサ22に、左目画像および右目画像中のプリミティブの各々の各頂点についての座標を決定するよう要求する場合がある。これにより、シェーダプロセッサ22は、複数の計算周期を実施することを要求される場合があり、その結果、シェーダプロセッサ22の効率が低下する可能性がある。固定機能パイプライン24のビューポート変換ユニットにおいて、ビューポート変換と、ビューポートシフトまたはシフトおよびストレッチとを実施する(たとえば、ZDPを調整するためにVps値に基づいてビューポートをさらに修正する)ことによって、本開示の態様は、シェーダプロセッサ22において計算周期を浪費させることなく、豊かな立体ビューを提供することができる。
上述したように、グラフィックスドライバラッパー16は、gl_Position.x変数の値を修正するgl_Position.x+=(znear*wworld/(R−L)/2)*Xまたは単にgl_Position.x+=Xコマンドを、頂点シェーダ28のソースコード中に含めればよい。以下に、このように頂点シェーダ28のソースコード中に命令を含める理由を挙げる。
式(1)において上で示したように、Vclip=PRJ*Veye=PRJ*MVT*Vworldである。Vclipについての式は、左目および右目についてのクリッピング座標を生成するように修正することができる。たとえば、左目および右目についてのクリッピング座標は、以下のようになり得る。
VTleft−eyeおよびVTright−eyeは、モノビューから離れている左目と右目の、仮定された距離に基づく4x4行列でよい。モノビューの座標は(0,0,0)であってよく、左目は、(−D,0,0)に位置するものと見なすことができ、右目は、(D,0,0)に位置するものと見なすことができる。言い換えると、(0,0,0)の場所は、閲覧者の右目と左目の中心にあるものとして見なすことができる。左目が、右目と左目の中心から−Dだけ離れて位置するように見なされ、右目が、右目と左目の中心から+Dだけ離れて位置するように見なされる場合、Dは、閲覧者の右目と左目との間の距離の半分を示す。
VTleft−eyeおよびVTright−eyeについての行列は、次のように定義することができる。
VTleft−eyeおよびVTright−eyeは、2つの行列の和として書き直すことができる。たとえば、VTleft−eyeは、次のように書き直すことができる。
VTright−eyeは、次のように書き直すことができる。
Vclip_left−eyeについての式(式7)にVTleft−eye行列を代入することによって、Vclip_left−eyeは、Vclip_left−eye=
と等しくなる。
Vclip_right−eyeについての式(式8)にVTright−eye行列を代入することによって、Vclip_right−eyeは、VTclip_right−eye=
と等しくなる。
式9と10の両方において、たとえば、Vclip_left−eyeおよびVclip_right−eyeに対して、
は、PRJ*MVT*Vworldに単純化することができ、それは、
が、ユニティ行列であり、1での乗算に等価であるからである。
式1において上述したように、PRJ*MVT*Vworldは、Vclipに等しい。それゆえ、Vclip_left−eyeおよびVclip_right−eyeの式(たとえば、それぞれ、式9および10)は、次のように書き直すことができる。
および
PRJおよびMVTについての行列(それぞれ、式4および5)を代入し、式11の行列乗算を実施することによって、Vclip_left−eyeについての式は、
に、より具体的には
に単純化することができる。
Vclip_left−eyeについても同様の代入を行い、Vclip_right−eyeの式は、
に、より具体的には
に単純化することができる。
式13および14から、定数
を、算出されたxclip座標に加算し、他のすべてのクリッピング座標を同じに保つことによって、頂点シェーダ28は、左目画像についてのクリッピング座標を生成し得ることがわかる。同様に、定数
をxclip座標から減算し、他のすべてのクリッピング座標を同じに保つことによって、頂点シェーダ28は、右目画像用のクリッピング座標を生成することができる。少なくともこれらの理由により、グラフィックスドライバラッパー16は、命令gl_Position.x+=znear*wworld/((R−L)/2)*Xを含むことができ、ここでXは、左目画像を生成するためには+Dに等しく、Xは、右目画像を生成するためには−Dに等しい。
いくつかの例では、gl_Position.x+=コマンドを、単なるgl_Position.x+=Xにさらに単純化することも可能な場合がある。たとえば、wworld変数が1にセットされることが一般的である。また、OpenGL、OpenGL ES、およびOpenGL ES2.0は、プログラマブルシェーダを用いて、錐台を、
となるように定義し、ここでfovxは、OpenGL、OpenGL ES、およびOpenGL ES2.0において定義される錐台である。視野角が45度にセットされることも一般的であり、これは、cot(fovx)が1に等しいことを意味する。これは、
が1に等しいことを意味する。それゆえ、これらの例では、
が単なるXに単純化する(たとえば、
が1に等しく、wworldが1に等しい)。これらの例では、gl_Position.x+=変数は、gl_Position.x+=Xに単純化し得る。
したがって、式7〜14は、命令gl_Position.x+=(znear*wworld/(R−L)/2)*X、またはgl_Position.x+=Xを頂点シェーダ28に追加することが、2回実行されたとき、およびXが、第1の実行では+Dに、第2の実行では−Dに等しい場合、モノビュー画像をずらして立体ビューを生成するのになぜ十分であり得るかという理由を示す数学的基礎を提供する。このように、本開示の技法は、モノビュー用に設計される頂点シェーダ28のソースコードに対するささいな修正を、修正されたソースコードがコンパイルされ実行される(たとえば、修正された頂点シェーダ30のオブジェクトコードの実行)と、得られた画像が閲覧者に立体ビューを提供し得るように、可能にすることができる。立体ビューは、閲覧者に3D体験を提供することができ、これは、ディスプレイの2Dエリアによって限定された画像を見るのと比較して、より豊かでありより十分な体験であり得る。
いくつかの例では、(znear*wworld/(R−L)/2)が1に単純化しない(たとえば、視野角が45度ではないのでcot(fovx)が1に等しくない、および/またはwworldが1に等しくない場合)ときであっても、グラフィックスドライバラッパー16は、コマンドgl_Position.x+=Xを含み得る。たとえば、znear、wworld、R、およびLは各々が定数なので、(znear*wworld/(R−L)/2)は、定数であり得る。(znear*wworld/(R−L)/2)は定数なので、(znear*wworld/(R−L)/2)*Xの値は、Xが定数なので定数である。この場合、(znear*wworld/(R−L)/2)*Xは、単にXであってよい、単一の定数を表すように縮小することができる。この場合、Xの値は、ユーザ指定されても、あらかじめプログラムされてもよい。たとえば、上記例において、Xは、左目画像に対しては+Dに、右目画像に対しては−Dに等しかった。本例において、Xは、左目画像に対しては(znear*wworld/(R−L)/2)*Dに、右目画像に対しては(znear*wworld/(R−L)/2)*−Dに等しくてよく、ここで(znear*wworld/(R−L)/2)およびDは、znear、wworld、R、およびL値がシェーダプロセッサ22にとって利用可能でない場合、あらかじめプログラムされた値に対して、ユーザ指定であってよい。
near、wworld、R、およびL値がシェーダプロセッサ22にとって利用可能な場合、シェーダプロセッサ22は、(znear*wworld/(R−L)/2)の値を決定し、その値を、GPU20が左目画像それとも右目画像用のグラフィックスコンテンツを生成中であるかに基づいて、+Dまたは−Dで乗算することができる。また、やはり、cot(fovx)およびwworldが両方とも1に等しい場合、(znear*wworld/(R−L)/2)は、1に単純化してよい。
図2は、本開示に記載する1つまたは複数の例示的技法を実装し得るグラフィックス処理ユニット(GPU)の例を示すブロック図である。たとえば、図2は、GPU20の構成要素をより詳細に示す。図2に示すように、GPU20は、コマンドプロセッサ54と、シェーダプロセッサ22と、固定機能パイプライン24とを含む。コマンドプロセッサ54は、GPU20とアプリケーションプロセッサ12との間のインターフェースとして機能することができる。たとえば、コマンドプロセッサ54は、アプリケーションプロセッサ12からコマンドを受信することができ、コマンドがシェーダプロセッサ22それとも固定機能パイプライン24に転送されるべきか判断することができる。
一例として、上述したように、アプリケーション32を実行するアプリケーションプロセッサ12は、GPU20に、修正された頂点シェーダ30のオブジェクトコードを実行するよう命令することができる。この例では、コマンドプロセッサ54は、アプリケーションプロセッサ12からコマンドを受信することができ、シェーダプロセッサ22に、修正された頂点シェーダ30のオブジェクトコードを実行するよう命令することができる。別の例として、上述したように、グラフィックスドライバラッパー16は、アプリケーション32によって発行されたglViewportコマンドを修正し、修正されたglViewportコマンドをGPU20に与えることができる。この例では、コマンドプロセッサ54は、修正されたglViewportコマンドを受信し、このコマンドが、固定機能パイプライン24のビューポート変換ユニット42向けであると判断することができる。コマンドプロセッサ54は、修正されたglViewportコマンドを、左目画像および右目画像用のビューポートを適用するためのビューポート変換ユニット42に転送すればよい。
たとえば、上述したように、アプリケーション32は、glDrawコマンドを発行することができ、このコマンドの、GPU20への送信を、グラフィックスドライバラッパー16が阻止する。glDrawコマンドは、修正された頂点シェーダ30のオブジェクトコードを実行するための第1の命令をシェーダプロセッサ22にグラフィックスドライバラッパー16が発行するのをトリガすることができる。次に、シェーダプロセッサ22は、修正された頂点シェーダ30のオブジェクトコードを実行し、得られたクリッピング座標を、そのローカルメモリまたはシステムメモリ26に記憶する。glDrawコマンドはまた、グラフィックスドライバラッパー16に、第1の修正glViewport命令を発行させ、この命令はコマンドプロセッサ54によって受信される。次いで、グラフィックスドライバラッパー16は、第1のglDrawコマンドを発行し、このコマンドはコマンドプロセッサ54によって受信される。コマンドプロセッサ54は、それに応答して、固定機能パイプライン24およびシェーダプロセッサ22の固定機能ユニットに、立体ビューの第1の画像(たとえば、左目画像)用のグラフィックスコンテンツを生成するための、それぞれの機能を実施させる。たとえば、より詳しく論じるように、第1のglDrawコマンドに応答して、ビューポート変換ユニット42は、第1の画像をディスプレイの第1の部分に制限し、フラグメント単位動作ユニット50は、第1の画像のグラフィックスコンテンツをフレームバッファ52に出力する。
立体ビューの第1の画像がフレームバッファ52に記憶された後、GPU20は、立体ビューの第2の画像用のグラフィックスコンテンツを生成するためのステップを繰り返す。たとえば、グラフィックスドライバラッパー16は、修正された頂点シェーダ30のオブジェクトコードを実行するための第2の命令をシェーダプロセッサ22に発行する。次に、シェーダプロセッサ22は、修正された頂点シェーダ30のオブジェクトコードを実行し、得られたクリッピング座標を、そのローカルメモリまたはシステムメモリ26に記憶する。グラフィックスドライバラッパー16はまた、第2の修正されたglViewport命令を発行し、この命令はコマンドプロセッサ54によって受信される。次いで、グラフィックスドライバラッパー16は、第2のglDrawコマンドを発行し、このコマンドはコマンドプロセッサ54によって受信される。コマンドプロセッサ54は、それに応答して、固定機能パイプライン24およびシェーダプロセッサ22の固定機能ユニットに、立体ビューの第2の画像(たとえば、右目画像)用のグラフィックスコンテンツを生成するための、それぞれの機能を実施させる。たとえば、第2のglDrawコマンドに応答して、ビューポート変換ユニット42は、第2の画像をディスプレイの第2の部分に制限し、フラグメント単位動作ユニット50は、第2の画像のグラフィックスコンテンツをフレームバッファ52に出力する。GPU20のこの機能性については、以下の例においてより詳しく説明する。
図2の破線ボックスに示すように、シェーダプロセッサ22は、修正された頂点シェーダ30とフラグメントシェーダ46とを含む。破線ボックスは、シェーダプロセッサ22が実際には修正された頂点シェーダ30とフラグメントシェーダ46とを含まなくてもよいことを示すためのものである。そうではなく、シェーダプロセッサ22は、修正された頂点シェーダ30およびフラグメントシェーダ46のオブジェクトコードを実行することができる。修正された頂点シェーダ30およびフラグメントシェーダ46のオブジェクトは、システムメモリ26に記憶することができる。
固定機能パイプライン24は、プリミティブアセンブリユニット36、錐台ユニット38、遠近除算ユニット40、ビューポート変換ユニット42、ラスター化ユニット44、およびフラグメント単位動作ユニット50など、1つまたは複数の固定機能ユニットを含み得る。固定機能パイプライン24のこれらの固定機能ユニットの各々は、特定のグラフィックス関連機能を実施するように配線接続されたハードウェアユニットでよい。固定機能パイプライン24のこれらの固定機能ユニットは、別個の構成要素として示してあるが、本開示の態様は、そのように限定されるわけではない。固定機能パイプライン24の固定機能ユニットのうち1つまたは複数は、互いに組み合わせて共通固定機能ユニットにすることができる。また、図2に示すものよりも多くの、固定機能パイプライン24の固定機能ユニットがあってもよい。固定機能パイプライン24の1つまたは複数の固定機能ユニットは、理解しやすくするために、別々に示してある。
さらに、固定機能パイプライン24の固定機能ユニットの具体的な順序は、例示目的のために示されており、限定的と見なされるべきではない。たとえば、固定機能パイプライン24の固定機能ユニットを並べ替えることが可能であり得る。一例として、フラグメント単位動作ユニット50の機能のうち1つは、重複ピクセルによって塞がれるピクセルを選別するためのものであってよい。この機能が、固定機能パイプライン24中でより早く実施されることが可能であってもよい。
固定機能パイプライン24のこれらの固定機能ユニットは、シェーダプロセッサ22と比較して、非常に限定された機能的柔軟性を提供することができる。たとえば、シェーダプロセッサ22は、修正された頂点シェーダ30およびフラグメントシェーダ46などのプログラマブルシェーダプログラムを実行するように特に設計され得る。これらのシェーダプログラムは、シェーダプロセッサ22を、シェーダプログラムによって定義されたように機能させる。言い換えれば、シェーダプログラムは、シェーダプロセッサ22の機能性を定義することができ、固定機能パイプライン24の固定機能ユニットの機能性は設定される。
上述したように、グラフィックスドライバラッパー16は、GPU20に、修正された頂点シェーダ30のオブジェクトコードを2回実行するよう命令することができ、ここで第1の実行は、立体ビューの画像のうち一方(たとえば、左目画像)の頂点についてのクリッピング座標の生成のためであり、第2の実行は、立体ビューの他方の画像(たとえば、右目画像)の頂点についてのクリッピング座標の生成のためである。修正された頂点シェーダ30のオブジェクトコードを実行するための、これらの命令の各々に応答して、コマンドプロセッサ54は、シェーダプロセッサ22に、修正された頂点シェーダ30のオブジェクトコードを取り出し、実行するよう命令することができる。上述したように、コンパイラ18は、修正された頂点シェーダのソースコードをコンパイルし、得られたオブジェクトコードを、修正された頂点シェーダ30のオブジェクトコードとして記憶することができる。図2に示すように、修正された頂点シェーダ30は、頂点アレイ34とテクスチャ48とを入力として受信することができる。頂点アレイ34は、上述したように、アプリケーション32によって生成された頂点についてのピクセル値を生成するための情報(たとえば、頂点の座標、頂点の色値、および頂点の透明度値)を含み得る。たとえば、頂点アレイ34の頂点の座標は、アプリケーション32によって定義される世界座標であり得る。テクスチャ48は、グラフィックスコンテンツのより現実的なビューを提供するように、生成されたグラフィックスに重なるテクスチャについてのピクセル値であり得る。
シェーダプロセッサ22上で実行する修正された頂点シェーダ30は、頂点の各々についてのクリッピング座標を生成することができる。たとえば、修正された頂点シェーダ30は、アプリケーション32によって定義されるとともに頂点アレイ34に記憶された頂点の世界座標を、図1を参照して上述した式1の行列乗算を実施することによって、頂点の各々についてのクリッピング座標にコンバートすることができる。さらに、シェーダプロセッサ22上で実行する修正された頂点シェーダ30は、頂点の各々のクリッピング座標用のgl_Position.x変数を更新して、修正された頂点シェーダ30のオブジェクトコードの第1の実行において、左目画像に対するずれを提供し、修正された頂点シェーダ30のオブジェクトコードの第2の実行において、右目画像に対するずれを提供することができる。また、修正された頂点シェーダ30は、追加的な従来の頂点シェーダタスクを実施することができる。たとえば、修正された頂点シェーダ30は、頂点に対して照明機能を実施することができる。
修正された頂点シェーダ30がモデルビュー変換(たとえば、gl_Position.x+=コマンドを用いた変位を含む、世界ビュー座標からクリッピング座標へのコンバージョン)を実施した後、修正された頂点シェーダ30は、頂点についてのクリッピング座標を、固定機能パイプライン24のプリミティブアセンブリユニット36に与える。プリミティブアセンブリユニット36は、頂点をプリミティブにアセンブルするのに、頂点についてのクリッピング座標を使用することができる。たとえば、プリミティブアセンブリユニット36は、頂点についてのクリッピング座標に基づいて複数の三角形をアセンブルすることができ、ここで三角形の各々の頂点は、修正された頂点シェーダ30から受信された頂点に対応する。複数の三角形は、プリミティブの一例である。概して、プリミティブアセンブリユニット36は、受信した頂点についてのクリッピング座標に基づいて、受信した頂点を、任意のポリゴンにアセンブルすることができる。
プリミティブアセンブリユニット36は、アセンブルされたプリミティブを錐台ユニット38に送信すればよい。錐台ユニット38は、アセンブルされたプリミティブがビューボリューム内にあるかどうか判断することができる。たとえば、上述したように、OpenGL、OpenGL ES、およびOpenGL ES2.0が、特定のビューボリュームを(fovx)として定義することができる。ただし、錐台は、たとえば、glFrustrum関数を使って、ユーザ定義可能であり得る。錐台ユニット38は、プリミティブ全体がビューボリューム内にあるか、全体がビューボリュームの外部にあるか、それとも部分的にビューボリューム内にあり、部分的にビューボリュームの外部にあるか判断することができる。錐台ユニット38は、さらなる処理から、全体がビューボリュームの外部にあるプリミティブと、ビューボリュームの外部にあるプリミティブの部分とを選別することができる。錐台ユニット38は、さらなる処理のために、全体がビューボリューム内にあるプリミティブと、ビューボリューム内にあるプリミティブの部分とを保つことができる。
錐台ユニット38は、残りのプリミティブと、プリミティブの部分とを、遠近除算ユニット40に送信すればよい。遠近除算ユニット40は、プリミティブの深度に基づいて、プリミティブを拡大または縮小してよい。たとえば、プリミティブの各々は、x、y、およびz座標によって定義され得る。z座標は、プリミティブがどれだけ近いか、または離れているかを示し得る。この段階で、GPU20は、立体ビュー用の画像のうち1つのためのグラフィックスコンテンツを生成中であることに留意されたい。それゆえ、プリミティブの近接の概念は、立体ビューではなくモノビューのコンテキストにおけるものである。
たとえば、遠近除算ユニット40は、一部のプリミティブを縮小し、他のプリミティブを拡大することができる。こうすることにより、モノビューにおける拡大プリミティブと比較して、縮小プリミティブがさらに離れているという知覚が生じられ得る。上述したように、閲覧者が立体ビューを知覚するのは、これらのモノビュー画像が表示されるときである。言い換えれば、遠近除算ユニット40は、左目画像と右目画像とを、ディスプレイの2Dエリアに表示される3D画像にさせることができる。閲覧者がこれらの3D画像を見ると、左目画像および右目画像における、gl_Position.x+=コマンドの追加によって引き起こされるずれにより、閲覧者は、3Dボリュームを取り囲む立体3D(S3D)画像を知覚する。
遠近除算ユニット40は、プリミティブをビューポート変換ユニット42に送信すればよい。ビューポート変換ユニット42は、画像のサイズと場所とを、定義されたビューポートに合うように修正する。たとえば、ビューポート変換ユニット42に先立って、修正された頂点シェーダ30および固定機能パイプライン24の固定機能ユニットが、画像がディスプレイ全体に表示されるべきであるかのように、グラフィックスデータを処理する。ビューポート変換ユニット42の機能は、定義されたビューポートに画像が制限されるように、画像のサイズと場所とを修正することであり得る。
たとえば、上述したように、左目画像用のグラフィックスコンテンツ(たとえば、頂点についてのクリッピング座標)を生成し得る、頂点シェーダ30のオブジェクトコードの第1の実行の後、グラフィックスドライバラッパー16は、左目画像のビューポートを、左目画像をディスプレイの左半分に制限するように修正すればよい。たとえば、頂点シェーダ30のオブジェクトコードの第1の実行の後、グラフィックスドライバラッパー16は、アプリケーション32によってあらかじめ発行され、GPU20から阻止されたglViewport(0,0,width,length)コマンドを、glViewport(0,0,width/2,length)に修正し、この第1の修正されたglViewportコマンドをGPU20に与えればよい。コマンドプロセッサ54は、第1の修正されたglViewportコマンドをビューポート変換ユニット42に与えればよい。ビューポート変換ユニット42は次いで、遠近除算ユニット40から受信したプリミティブのサイズを、この例では、これらのプリミティブがディスプレイの左半分に制限されるように修正すればよい。たとえば、遠近除算ユニット40は、一部のプリミティブが他のプリミティブよりも近くに見えるように、プリミティブのサイズを互いに相対して修正してよい。ビューポート変換ユニット42は、プリミティブがディスプレイの左半分に制限されるように、プリミティブのサイズと場所とを均等に修正することができる。
頂点シェーダ30のオブジェクトコードの第2の実行の後、ビューポート変換ユニット42は、同様の機能を、右目画像に対してではあるが実施することができる。たとえば、頂点シェーダ30のオブジェクトコードの第2の実行は、右目画像のグラフィックスコンテンツ(たとえば、頂点についてのクリッピング座標)を生成するためであってよい。頂点シェーダ30のオブジェクトコードのこの第2の実行の後、グラフィックスドライバラッパー16は、アプリケーション32によってあらかじめ発行され、GPU20から阻止されたglViewport(0,0,width,length)コマンドを、glViewport(width/2,0,width/2,length)に修正し、この第2の修正されたglViewportコマンドをGPU20に与えればよい。コマンドプロセッサ54は、第2の修正されたglViewportコマンドをビューポート変換ユニット42に転送すればよい。ビューポート変換ユニット42は、プリミティブがディスプレイの右半分に制限されるように、プリミティブのサイズと場所とを均等に修正することができる。このように、GPU20は、アプリケーション32のランタイム中にアプリケーション32によって生成されたモノビュー画像から、および左目画像から右目画像を生成するための深度情報に依拠することなく、立体ビュー用の左目画像および右目画像を生成するように動作可能であってよく、逆もまた同様である。
さらに、ビューポート変換ユニット42は、上述したように、ビューポートシフトまたはビューポートシフトおよびストレッチを実施することができる。たとえば、上述したように、閲覧者がVps値を与えることができ、またはVps値はあらかじめプログラムされてもよく、ここでVps値は、左目画像および右目画像用のビューポートがシフトされ、またはシフトおよびストレッチされるべき量を示す。この例では、ビューポート変換ユニット42は、ビューポートシフトおよびストレッチも実施するように動作可能であり得る。ビューポートシフト、またはシフトおよびストレッチにより、知覚される立体ビューは、ディスプレイからさらに離れてポップアウトさせ、あまりディスプレイからポップアウトさせず、ディスプレイにプッシュインさせず、またはディスプレイにさらにプッシュインさせることができる。
ビューポートシフト、またはシフトおよびストレッチのために、コマンドプロセッサ54は、ユーザ提供による、またはあらかじめプログラムされたVps値を取り出し、Vps値をビューポート変換ユニット42に与えればよい。この例では、ビューポート変換ユニット42は、修正されたglViewportコマンドを、左目画像用にはglViewport(0−Vps,0,width/2,length)またはglViewport(0−Vps,0,width/2+Vps,length)として、および右目画像用にはglViewport(width/2+Vps,0,width/2,length)またはglViewport(width/2,0,width/2+Vps,length)として受信することができる。ビューポート変換ユニット42は、左目画像および右目画像向けのシフトおよびストレッチのビューポートシフトを実施し、ビューポートがディスプレイの表示エリアの外側に拡張する場合はいかなる選別も実施することができる。上述したように、ビューポートシフト、またはシフトおよびストレッチは、閲覧者に豊かな立体ビューを提供することができる。
ビューポート変換ユニット42は、第1の修正されたglViewportコマンドおよび第2の修正されたglViewportコマンドの各々の後にビューポートを修正した後、プリミティブをラスター化ユニット44に転送してよい。ラスター化ユニット44は、プリミティブを、ディスプレイのピクセルにコンバートすればよい。たとえば、ラスター化ユニット44は、ディスプレイのどのピクセルがプリミティブの各々によって取り囲まれるか判断することができる。ラスター化ユニット44は、これらのピクセルの各々の、ディスプレイ上での場所を判断することもできる。
ラスター化ユニット44は、そのグラフィックスデータをフラグメントシェーダ46に出力することができる。フラグメントシェーダ46は、ピクセルシェーダと呼ばれることもあり、シェーダプロセッサ22上で実行するシェーダプログラムであってよい。たとえば、フラグメントシェーダ46用のソースコードはシステムメモリ26に記憶することができ、コンパイラ18は、フラグメントシェーダ46のソースコードをコンパイルして、フラグメントシェーダ46のオブジェクトコードを生成することができる。あるいは、システムメモリ26は、フラグメントシェーダ46用のオブジェクトコードを、必ずしもコンパイラ18によって生成させずに記憶することができる。
フラグメントシェーダ46は、ディスプレイ上のピクセルの各々についての色値を出力することができる。たとえば、フラグメントシェーダ46は、赤緑青(RGB)成分に基づいて、各ピクセルの色を定義することができる。フラグメントシェーダ46は、1つの説明のための例として、赤成分を定義するのに8ビット、緑成分を定義するのに8ビット、および青成分を定義するのに8ビットを使用することができる。フラグメントシェーダ46は、色値をフラグメント単位動作ユニット50に出力することができる。
フラグメント単位動作ユニット50は、可視でないピクセルを選別することができる。たとえば、さらに離れたオブジェクトのピクセルには、フラグメント単位動作ユニット50がzバッファから判断することができる、より近いオブジェクトのピクセルを重ねることができる。重複により、さらに離れたオブジェクトのピクセルは、全体が塞がれることになり得る。この場合、フラグメント単位動作ユニット50は、被重複ピクセルを選別することができる。フラグメント単位動作ユニット50は、ピクセルをブレンドすることもできる。たとえば、重複ピクセルは、被重複ピクセルを全体的には塞がないように、半透明でよい。この場合、フラグメント単位動作ユニット50は、これらのピクセルの色をブレンドすることができる。
フラグメント単位動作ユニット50の出力は、ディスプレイ上のピクセルについてのピクセル値(たとえば、色)であり得る。フラグメント単位動作ユニット50は、ピクセル値を、一時記憶のために、システムメモリ26のフレームバッファ52に出力すればよい。フレームバッファ52が一杯になると、フレームバッファ52は、ディスプレイ上のピクセルの各々についてのピクセル値を記憶すればよい。
フレームバッファ52は、記憶ロケーションの2Dアレイと見なすことができる。フレームバッファ52を有する記憶ロケーションの数は、少なくとも、ディスプレイのピクセルの数に等しくてよい。また、フレームバッファ52内の記憶ロケーションは、ディスプレイ上のロケーションに対応し得る。たとえば、フレームバッファ52内の左上記憶ロケーションは、ディスプレイの左上ピクセルに対応してよく、フレームバッファ52内の左上記憶ロケーションの右にある記憶ロケーションは、ディスプレイの左上ピクセルの右にあるピクセルに対応してよく、以下同様である。
第1のglDrawコマンドが完了した後、フレームバッファ52の左半分に位置する記憶ロケーションは、フレームバッファ52の左半分がディスプレイの左半分に対応し得るので、左目画像についてのピクセル値を記憶すればよい。同様に、第2のglDrawコマンドが完了した後、フレームバッファ52の右半分に位置する記憶ロケーションは、フレームバッファ52の右半分がディスプレイの右半分に対応し得るので、右目画像についてのピクセル値を記憶すればよい。それゆえ、第1および第2のglDrawコマンドが完了した後、フレームバッファ52は、左目画像についてのピクセル値と、右目画像についてのピクセル値とを記憶すればよい。
図3は、図1の例示的デバイスをさらに詳しく示すブロック図である。たとえば、図3は、図1のデバイス10をさらに詳しく示す。たとえば、上記のように、デバイス10の例には、限定はしないが、モバイルワイヤレス電話、PDA、ビデオディスプレイを含むビデオゲーミングコンソール、モバイルビデオ会議ユニット、ラップトップコンピュータ、デスクトップコンピュータ、テレビジョンセットトップボックス、などがある。
図3に示すように、デバイス10は、アプリケーションプロセッサ12と、GPU20と、フレームバッファ52を含むシステムメモリ26と、トランシーバモジュール56と、ユーザインターフェース58と、ディスプレイ60と、ディスプレイプロセッサ62とを含み得る。アプリケーションプロセッサ12、GPU、およびシステムメモリ26は、図1および図2のアプリケーションプロセッサ12、GPU20、およびシステムメモリ26と実質的に同様または同一でよい。簡潔のために、図3には示すが、図1および図2には示していない構成要素についてのみ、詳細に説明する。
デバイス10は、図3に示すように、明快のために図3に示されていない追加のモジュールまたはユニットを含み得る。たとえば、デバイス10は、デバイス10がモバイルワイヤレス電話である例において電話通信を実現するために、そのいずれも図3に示されていないスピーカおよびマイクロフォン、またはデバイス10がメディアプレーヤであるスピーカを含み得る。さらに、デバイス10に示す様々なモジュールおよびユニットは、デバイス10のすべての例において必要であるとは限らない。たとえば、ユーザインターフェース58およびディスプレイ60は、デバイス10がデスクトップコンピュータまたは外部のユーザインターフェースもしくはディスプレイとインターフェースするように備えられた他のデバイスである例において、デバイス10の外部にあってよい。
ユーザインターフェース58の例には、限定はしないが、トラックボール、マウス、キーボード、および他のタイプの入力デバイスがある。ユーザインターフェース58はまた、タッチスクリーンであり得、ディスプレイ60の一部として組み込まれ得る。トランシーバモジュール56は、デバイス10と別のデバイスまたはネットワークとの間のワイヤレスまたはワイヤード通信を可能にするための回路を含み得る。トランシーバモジュール56は、ワイヤードまたはワイヤレス通信のための1つまたは複数の変調器と、復調器と、増幅器と、アンテナと、他のそのような回路を含み得る。ディスプレイ60は、液晶ディスプレイ(LCD)、有機発光ダイオードディスプレイ(OLED)、陰極線管(CRT)ディスプレイ、プラズマディスプレイ、偏光ディスプレイ、または別のタイプのディスプレイデバイスを備え得る。
ディスプレイプロセッサ62は、ディスプレイ60に、立体ビューを表示させるように構成され得る。ディスプレイ60に、立体ビューを表示させるのにディスプレイプロセッサ62が使用することができる様々な技法があってよく、本開示の態様は、これらの技法のうちどれを使用してもよい。たとえば、ディスプレイプロセッサ62は、フレームバッファ52の左半分から左目画像を取り出し、フレームバッファ52の右半分から右目画像を取り出し、2つの画像をインターリーブして、立体ビューを提供することができる。
別の例として、ディスプレイプロセッサ62は、ディスプレイ60のリフレッシュレートを制御することができる。この例では、各リフレッシュ周期中に、ディスプレイプロセッサ62は、左目画像と右目画像との間を循環することができる。たとえば、ディスプレイプロセッサ62は、あるリフレッシュ周期の間、フレームバッファ52の左半分から左目画像を取り出し、左目画像をディスプレイ60全体に拡大し、左目画像をディスプレイ60上に表示することができる。次いで、次のリフレッシュ周期の間、ディスプレイプロセッサ62は、実質的に同様の機能を、今度はフレームバッファ52の右半分に記憶された右目画像に対して実施することができる。言い換えれば、ディスプレイ60は、左目画像、次いで右目画像、次いで左目画像、および以下同様に表示すればよい。
閲覧者は、ディスプレイプロセッサ62のリフレッシュレートと同期される特殊眼鏡を装着している場合がある。たとえば、ディスプレイ60が左目画像を表示している間、特殊眼鏡は、閲覧者の左目のみが左目画像をキャプチャするように、右レンズのシャッターを閉じればよい。次いで、ディスプレイ60が右目画像を表示している間、特殊眼鏡は、閲覧者の右目のみが右目画像をキャプチャするように、左レンズのシャッターを閉じればよく、以下同様である。リフレッシュレートが十分に高速である場合、閲覧者は、画像がディスプレイ60からポップアウトし、またはディスプレイにプッシュインし、3Dボリュームを取り囲む立体ビューを知覚する。
いくつかの例では、いくつかの従来のディスプレイプロセッサは、ディスプレイ60に立体ビューを表示させるように構成しなくてもよい。これらの例では、閲覧者は、ディスプレイに立体ビューを提示させるように構成された、ディスプレイプロセッサ62などのディスプレイプロセッサを含むディスプレイに、デバイス10を結合すればよい。たとえば、閲覧者は、トランシーバモジュール56を介して、デバイス10を立体ビュー対応テレビに結合すればよい。たとえば、閲覧者は、高精細マルチメディアインターフェース(HDMI(登録商標))ワイヤを介して、トランシーバモジュール56をテレビに結合してよい。この例では、アプリケーションプロセッサ12またはGPU20は、トランシーバモジュール56に、フレームバッファ52に記憶されたピクセル値をテレビのディスプレイプロセッサへ送信するよう命令することができる。このテレビのディスプレイプロセッサは次いで、テレビに、立体ビューを形成するために左目画像および右目画像を表示させればよい。
これらの例では、デバイス10のディスプレイが、左目画像および右目画像を表示することが依然として可能であり得る。ただし、デバイス10のディスプレイプロセッサ62は、デバイス10のディスプレイ60に立体ビューを提示させることができない場合があるので、この例では、ディスプレイ60は、左目画像と右目画像とを並べて表示してよい。たとえば、ディスプレイ60の左半分は左目画像を表示すればよく、ディスプレイ60の右半分は右目画像を表示すればよい。これは、上述したビューポート変換によるものであり得る。この場合、特殊眼鏡を用いても、閲覧者は、ディスプレイ60を見るだけでは、立体ビューを体験することはできないが、立体ビュー対応テレビを見ることによって立体ビューを体験することになる。
図4は、本開示に記載する1つまたは複数の例示的技法による例示的動作を示すフローチャートである。説明のために、図1および図2への参照を行う。
プロセッサが、モノビューの画像を生成するように設計されておりグラフィックス処理ユニット(GPU)のシェーダプロセッサ上で実行されるべき頂点シェーダ向けの命令を受信し得る(64)。たとえば、アプリケーションプロセッサ12は、グラフィックスドライバラッパー16の実行により、頂点シェーダ28向けの命令を受信することができる。上述したように、頂点シェーダ28は、モノビュー用のグラフィックスコンテンツを生成するように設計してよく、GPU20のシェーダプロセッサ22上で実行されるように設計してよい。
プロセッサは、頂点シェーダの命令を、頂点シェーダがGPUのシェーダプロセッサ上で実行されると頂点シェーダに、立体ビューの頂点シェーダの第1の実行の後に立体ビューの第1の画像用のグラフィックスコンテンツを、また頂点シェーダの第2の実行の後に立体ビューの第2の画像用のグラフィックスコンテンツを生成させる1つまたは複数の命令を含むように修正することができる(66)。第1の画像は左目画像でよく、第2の画像は右目画像でよい。
たとえば、グラフィックスドライバラッパー16は頂点シェーダ28のソースコードを受信することができ、gl_Position.x+=Xコマンドを頂点シェーダ28のソースコードに含めることができる。コンパイラ18は、頂点シェーダ28の修正されたソースコードをコンパイルして、修正された頂点シェーダ30のコーディングされたオブジェクトを生成することができる。グラフィックスドライバラッパー16は、シェーダプロセッサ22に修正された頂点シェーダ30のオブジェクトコードを実行させることができ、シェーダプロセッサ22にXについての+Dという値を与えることができる。グラフィックスドライバラッパー16が第1のglDrawコマンドを発行した後、グラフィックスドライバラッパー16は、シェーダプロセッサ22に修正された頂点シェーダ30のオブジェクトコードを再度実行させることができ、シェーダプロセッサ22にXについての−Dという値を与えることができる。
プロセッサは、モノビューの画像用のビューポートを定義するコマンドを、第1の画像用のビューポートを定義する、シェーダプロセッサとは異なるGPUの固定機能ユニット向けの第1のコマンドと、第2の画像用のビューポートを定義する、GPUの固定機能ユニット向けの第2のコマンドとに修正することができる(68)。この例では、固定機能ユニットは、図2のビューポート変換ユニット42であり得る。図に示し、上述したように、ビューポート変換ユニット42は、シェーダプロセッサ22とは異なる。
一例として、グラフィックスドライバラッパー16は、アプリケーション32によってあらかじめ発行されたglViewport(0,0,width,length)コマンドを、左目画像をレンダリングするためのglViewport(0,0,width/2,length)コマンドに修正することができ、右目画像をレンダリングするために、グラフィックスドライバラッパー16は、glViewport(0,0,width,length)コマンドをglViewport(width/2,0,width/2,length)コマンドに修正することができる。いくつかの例では、グラフィックスドライバラッパー16は、上述したように、第1および第2の画像用のビューポートをシフトし、またはシフトおよびストレッチすることができる。いくつかの例では、グラフィックスドライバラッパー16は、第1および第2の画像用のビューポートをシフトし、またはシフトおよびストレッチすることができるとともに、モノビュー用のビューポートを定義する命令を、第1および第2の画像用のビューポートを定義するように修正する。
以下の擬似コードは、グラフィックスドライバラッパー16およびアプリケーション32の機能性の例を挙げる。この擬似コードは、理解を助けることを意図しており、限定的と見なされるべきではない。
1. グラフィックドライバラッパー16が、アプリケーション32によって発行されたglShaderSourceコマンドをインターセプトして、頂点シェーダ28のソースコードをインターセプトする。
2. グラフィックスドライバラッパー16が、「uniform float X」を頂点シェーダ28の命令に挿入し、「uniform」とは、プログラマブルシェーダを有するOpenGLおよびOpenGL ESにおけるユーザ定義の標準属性変数である。
3. グラフィックスドライバラッパー16が、「gl_Position.x+=X」コマンドを頂点シェーダ28のソースコードに挿入する。
4. アプリケーション32が、コンパイラ18に、頂点シェーダ28の修正されたソースコード命令をコンパイルさせて修正された頂点シェーダ30のオブジェクトコードを生成するglCompileShaderコマンドを実行する。
5. アプリケーション32が、以下のコマンドを実行して、修正された頂点シェーダ30のオブジェクトコードにリンクする。
programObject=glCreateProgram();
glAttachShader(programObject,vertexShader);
glAttachShader(programObject,fragmentShader);
glLinkProgram(programObject)
6. グラフィックスドライバラッパー16が、アプリケーション32によって呼び出されると、glDrawコマンド(たとえば、glDrawArraysおよびglDrawElements)をインターセプトし、コマンドがGPU20に送信されるのを阻止する。
7. グラフィックスドライバラッパー16が、以下のコマンドを発行する。
glGetInteger(GL_CURRENT_PROGRAM,&program);//現在の頂点シェーダに対するポインタを得るため
glViewportコマンドを、上述したように、左目画像用のビューポートを生成するように修正する。
p=glGetUniformLocation(program,X);uniform Xに対するポインタを得るため
glUniform1f(p,D);//Dに等しいXの値をセットするため。
glDrawコマンド//GPU20に、左目画像用のグラフィックスコンテンツを生成させるため
8. 7から続くステップを、右目画像用のグラフィックスコンテンツを生成するための以下の修正を施して繰り返す。
glViewportコマンドを、上述したように、右目画像用のビューポートを生成するように修正する。
glUniform1f(p,−D);//−Dに等しいXの値をセットするため。
glDrawコマンド//GPU20に、右目画像用のグラフィックスコンテンツを生成させるため。
1つまたは複数の例では、説明した機能は、ハードウェア、ソフトウェア、ファームウェア、またはそれらの任意の組合せで実装され得る。ソフトウェアで実装する場合、機能は、1つまたは複数の命令またはコードとしてコンピュータ可読媒体上に記憶することができる。コンピュータ可読媒体はコンピュータデータ記憶媒体を含み得る。データ記憶媒体は、本開示で説明した技法の実装のための命令、コードおよび/またはデータ構造を取り出すために1つまたは複数のコンピュータあるいは1つまたは複数のプロセッサによってアクセスされ得る任意の利用可能な媒体であり得る。限定ではなく、例として、そのようなコンピュータ可読媒体は、ランダムアクセスメモリ(RAM)、読取り専用メモリ(ROM)、EEPROM、CD−ROMまたは他の光ディスクストレージ、磁気ディスクストレージまたは他の磁気ストレージデバイス、あるいは命令またはデータ構造の形態の所望のプログラムコードを記憶するために使用され得、コンピュータによってアクセスされ得る、任意の他の媒体を備えることができる。本明細書で使用するディスク(disk)およびディスク(disc)は、コンパクトディスク(disc)(CD)、レーザディスク(disc)、光ディスク(disc)、デジタル多用途ディスク(disc)(DVD)、フロッピー(登録商標)ディスク(disk)およびブルーレイ(登録商標)ディスク(disc)を含み、ディスク(disk)は、通常、データを磁気的に再生し、ディスク(disc)は、データをレーザで光学的に再生する。上記の組合せもコンピュータ可読媒体の範囲内に含めるべきである。
コードは、1つまたは複数のデジタル信号プロセッサ(DSP)などの1つまたは複数のプロセッサ、汎用マイクロプロセッサ、特定用途向け集積回路(ASIC)、フィールドプログラマブル論理アレイ(FPGA)、あるいは他の等価な集積回路またはディスクリート論理回路によって実行され得る。したがって、本明細書で使用する「プロセッサ」という用語は、前述の構造、または本明細書で説明する技法の実施に好適な任意の他の構造のいずれかを指す。また、本技法は、1つまたは複数の回路または論理要素中に十分に実装され得る。
本開示の技法は、ワイヤレスハンドセット、集積回路(IC)、またはICのセット(すなわち、チップセット)を含む、多種多様なデバイスまたは装置において実装され得る。本開示では、開示する技法を実行するように構成されたデバイスの機能的態様を強調するために様々な構成要素、モジュール、またはユニットについて説明したが、それらの構成要素、モジュール、またはユニットを、必ずしも異なるハードウェアユニットによって実現する必要はない。むしろ、上記で説明したように、様々なユニットが、好適なソフトウェアおよび/またはファームウェアとともに、上記で説明した1つまたは複数のプロセッサを含めて、ハードウェアユニットにおいて組み合わせられるか、または相互動作ハードウェアユニットの集合によって与えられ得る。
様々な例について説明した。これらおよび他の例は以下の特許請求の範囲内に入る。
本開示に記載する例示的技法は、修正されたシェーダプログラムがシェーダプロセッサ22上で実行されると、GPU20がS3D画像(たとえば、立体ビュー)についてのグラフィックスデータを生成するように、単一3次元(3D)画像(たとえば、モノビュー用)を生成するように設計されたシェーダプログラムを修正することができる。やはり、上述したように、立体ビューは、左目画像と右目画像とを含む。左目画像および右目画像は、モノビュー画像と実質的に同様のグラフィックスコンテンツを含むが、左目画像および右目画像の1つまたは複数の対応するピクセルは、互いに対して、水平軸に沿ってずらされ得る。たとえば、右目画像は左目画像の上に位置することを想像されたい。この場合、右目画像中の内容すべてが、左目画像中の同一の内容と完全に整列するわけではない。そうではなく、右目画像中の1つまたは複数のオブジェクトは、左目画像中の同一のオブジェクトの左または右にあってよい。
ただし、いずれの場合にも(たとえば、頂点シェーダ28がクリッピング座標を決定する場合、または頂点シェーダ28がクリッピング座標を受信する場合)、頂点シェーダ28は、クリッピング座標を記憶するのに固有変数を使用することができる。固有変数は、頂点シェーダ28がそのために設計されるAPIに固有であり得る。たとえば、頂点シェーダ28が、プログラマブルシェーダとともにOpenGL、OpenGL ES、またはOpenGL ES2.0APIに従って設計される場合、頂点シェーダ28は、クリッピング座標をgl_Position変数に記憶することができる。他のグラフィックスAPIにも、同様の変数があり得る。たとえば、頂点シェーダ28が、プログラマブルシェーダとともに、OpenGL、OpenGL ES、またはOpenGL ES2.0APIに従って設計される場合、頂点シェーダ28は、gl_Position.x=xclip、gl_Postion.y=yclip、gl_Position.z=zclip、およびgl_Position.w=wclipなどの命令を含んでよく、ここで、式2において上で示したとおり、次のようになる。
上述したように、グラフィックスドライバラッパー16は、命令gl_Position.x+=(znear*wworld/(R−L)/2)*X、または単にgl_Position.x+=Xを、頂点シェーダ28のソースコードに追加すればよい。左目画像に対して、変数Xの値は、+D(たとえば、閲覧者の目と目との間の距離の半分)であり得る。本開示の例では、右目画像に対して、変数Xの値は−Dであり得る。変数Xの値は−Dであるので、gl_Position.x+=コマンドは、シェーダプロセッサ22に、gl_Position.x変数に記憶された値からDの値を減算させる(たとえば、xclipの値からDを減算させる)。
ビューポートシフトまたはZDPのシフトと呼ばれ得るZDPを変更するために、グラフィックスドライバラッパー16は、左目画像および右目画像に対する左境界をシフトしてよい。たとえば、立体ビューがディスプレイからポップアウトされる量を変更するために、左目画像に対して、グラフィックスドライバラッパー16は、glViewportコマンドを(0−Vps,0,width/2,length)に修正してよく、右目画像に対して、グラフィックスドライバラッパー16は、glViewportコマンドを((width/2+Vps),0,width/2,length)に修正してよい。
図2の破線ボックスに示すように、シェーダプロセッサ22は、修正された頂点シェーダ30とフラグメントシェーダ46とを含む。破線ボックスは、シェーダプロセッサ22が実際には修正された頂点シェーダ30とフラグメントシェーダ46とを含まなくてもよいことを示すためのものである。そうではなく、シェーダプロセッサ22は、修正された頂点シェーダ30およびフラグメントシェーダ46のオブジェクトコードを実行することができる。修正された頂点シェーダ30およびフラグメントシェーダ46のオブジェクトコードは、システムメモリ26に記憶することができる。
ビューポートシフト、またはシフトおよびストレッチのために、コマンドプロセッサ54は、ユーザ提供による、またはあらかじめプログラムされたVps値を取り出し、Vps値をビューポート変換ユニット42に与えればよい。この例では、ビューポート変換ユニット42は、修正されたglViewportコマンドを、左目画像用にはglViewport(0−Vps,0,width/2,length)またはglViewport(0−Vps,0,width/2+Vps,length)として、および右目画像用にはglViewport(width/2+Vps,0,width/2,length)またはglViewport(width/2,0,width/2+Vps,length)として受信することができる。ビューポート変換ユニット42は、左目画像および右目画像向けのビューポートシフト、またはシフトおよびストレッチを実施し、ビューポートがディスプレイの表示エリアの外側に拡張する場合はいかなる選別も実施することができる。上述したように、ビューポートシフト、またはシフトおよびストレッチは、閲覧者に豊かな立体ビューを提供することができる。
たとえば、グラフィックスドライバラッパー16は頂点シェーダ28のソースコードを受信することができ、gl_Position.x+=Xコマンドを頂点シェーダ28のソースコードに含めることができる。コンパイラ18は、頂点シェーダ28の修正されたソースコードをコンパイルして、修正された頂点シェーダ30のオブジェクトコードを生成することができる。グラフィックスドライバラッパー16は、シェーダプロセッサ22に修正された頂点シェーダ30のオブジェクトコードを実行させることができ、シェーダプロセッサ22にXについての+Dという値を与えることができる。グラフィックスドライバラッパー16が第1のglDrawコマンドを発行した後、グラフィックスドライバラッパー16は、シェーダプロセッサ22に修正された頂点シェーダ30のオブジェクトコードを再度実行させることができ、シェーダプロセッサ22にXについての−Dという値を与えることができる。
様々な例について説明した。これらおよび他の例は以下の特許請求の範囲内に入る。
なお、以下に、出願当初の特許請求の範囲に記載された発明を付記する。
[C1]プロセッサを用いて、モノビューの画像を生成するように構成されておりグラフィックス処理ユニット(GPU)のシェーダプロセッサ上で実行されるべき頂点シェーダに対する命令を受信することと、
前記プロセッサを用いて、前記頂点シェーダの前記命令を、前記頂点シェーダが前記GPUの前記シェーダプロセッサ上で実行されると前記頂点シェーダに、前記頂点シェーダの第1の実行の後に立体ビューの第1の画像用のグラフィックスコンテンツを、また前記頂点シェーダの第2の実行の後に前記立体ビューの第2の画像用のグラフィックスコンテンツを生成させる1つまたは複数の命令を含むように修正することと、
前記プロセッサを用いて、前記モノビューの前記画像用のビューポートを定義するコマンドを、前記第1の画像用のビューポートを定義する、前記シェーダプロセッサとは異なる前記GPUの固定機能ユニット向けの第1のコマンド、および前記第2の画像用のビューポートを定義する、前記GPUの前記固定機能ユニット向けの第2のコマンドに修正することとを備える方法。
[C2]前記GPUの前記シェーダプロセッサを用いて、前記頂点シェーダの前記修正された命令のオブジェクトコードを実行することと、
前記GPUの前記固定機能ユニットを用いて、前記第1の画像用の前記ビューポートを定義する前記第1のコマンド、および前記第2の画像用の前記ビューポートを定義する前記第2のコマンドを実行することとをさらに備える、C1に記載の方法。
[C3]前記画像用の前記ビューポートを定義する前記コマンドを、前記第1のコマンドが前記第1の画像をディスプレイの第1の部分に制限するように構成され、前記第2のコマンドが前記第2の画像を前記ディスプレイの第2の部分に制限するように構成されるように修正する、C1に記載の方法。
[C4]前記画像用の前記ビューポートを定義する前記コマンドを修正することが、前記第1の画像用の前記ビューポートをシフトし、またはシフトおよびストレッチすることと、前記第2の画像用の前記ビューポートをシフトし、またはシフトおよびストレッチすることとをさらに備える、C1に記載の方法。
[C5]前記画像用の前記ビューポートを定義する前記コマンドを修正することが、glViewport(0,0,width,length)コマンドを、glViewport(0,0,width/2,length)コマンドを備える前記第1のコマンド、およびglViewport(width/2,0,width/2,length)コマンドを備える前記第2のコマンドに修正することを備え、widthがディスプレイの幅に等しく、lengthが前記ディスプレイの長さに等しい、C1に記載の方法。
[C6]前記画像用の前記ビューポートを定義する前記コマンドを修正することが、glViewport(0,0,width,length)コマンドを、glViewport(0−Vps,0,width/2,length)コマンドまたはglViewport(0−Vps,0,width/2+Vps,length)コマンドを備える前記第1のコマンド、およびglViewport(width/2+Vps,0,width/2,length)コマンドまたはglViewport(width/2,0,width/2+Vps,length)コマンドを備える前記第2のコマンドに修正することを備え、widthがディスプレイの幅に等しく、lengthが前記ディスプレイの長さに等しく、Vpsが、前記立体ビューが前記ディスプレイからポップアウトまたは前記ディスプレイにプッシュインする量を定義する、C1に記載の方法。
[C7]前記固定機能ユニットが、前記GPUの固定機能パイプラインのビューポート変換ユニットを備える、C1に記載の方法。
[C8]前記頂点シェーダの命令を受信することが、前記プロセッサ上で実行するグラフィックスドライバラッパーを用いて前記頂点シェーダの前記命令を受信することを備え、前記頂点シェーダの前記命令を修正することが、前記プロセッサ上で実行する前記グラフィックスドライバラッパーを用いて前記頂点シェーダの前記命令を修正することを備え、前記ビューポートを定義する前記コマンドを修正することが、前記プロセッサ上で実行する前記グラフィックスドライバラッパーを用いて、前記ビューポートを定義する前記コマンドを修正することを備える、C1に記載の方法。
[C9]前記頂点シェーダの前記命令を修正することが、前記モノビューの前記画像についての少なくとも1つのクリッピング座標を修正する命令を前記頂点シェーダに追加することを備える、C1に記載の方法。
[C10]少なくとも1つのクリッピング座標を修正する前記命令を前記頂点シェーダに追加することが、前記少なくとも1つのクリッピング座標を記憶する変数を更新する命令を前記頂点シェーダに追加することを備える、C9に記載の方法。
[C11]前記少なくとも1つのクリッピング座標を記憶する前記変数を更新する前記命令を前記頂点シェーダに追加することが、前記第1の実行において前記少なくとも1つのクリッピング座標に定数値を加算するための命令を追加することと、前記第2の実行において前記少なくとも1つのクリッピング座標から前記定数値を減算するための命令を追加することとを備える、C10に記載の方法。
[C12]前記モノビューの前記画像についての前記少なくとも1つのクリッピング座標を修正する前記命令を前記頂点シェーダに追加することが、gl.Position.x+=Xコマンドを追加することを備え、Xが、前記第1の実行では+Dに、および前記第2の実行では−Dに等しく、Dが、閲覧者の左目と右目との間の距離の半分の推定値に等しい、C10に記載の方法。
[C13]前記頂点シェーダの前記命令を1つまたは複数の命令を含むように修正することが、前記モノビューの前記画像についての1つのクリッピング座標を修正する命令を前記頂点シェーダに追加することのみを備える、C1に記載の方法。
[C14]シェーダプロセッサ、および固定機能パイプラインの、前記シェーダプロセッサとは異なる固定機能ユニットを含むグラフィックス処理ユニット(GPU)と、
プロセッサとを備え、前記プロセッサが、
モノビューの画像を生成するように構成されており前記GPUの前記シェーダプロセッサ上で実行されるべき頂点シェーダについての命令を受信し、
前記頂点シェーダの前記命令を、前記頂点シェーダが前記GPUの前記シェーダプロセッサ上で実行されると前記頂点シェーダに、前記頂点シェーダの第1の実行の後に立体ビューの第1の画像用のグラフィックスコンテンツと、前記頂点シェーダの第2の実行の後に前記立体ビューの第2の画像用のグラフィックスコンテンツとを生成させる1つまたは複数の命令を含むように修正し、
前記モノビューの前記画像用のビューポートを定義するコマンドを、前記第1の画像用のビューポートを定義する、前記シェーダプロセッサとは異なる前記GPUの前記固定機能ユニット向けの第1のコマンドと、前記第2の画像用のビューポートを定義する、前記GPUの前記固定機能ユニット向けの第2のコマンドとに修正するように動作可能である、装置。
[C15]前記GPUの前記シェーダプロセッサが、前記頂点シェーダの前記修正された命令のオブジェクトコードを実行するように構成され、前記GPUの前記固定機能ユニットが、前記第1の画像用の前記ビューポートを定義する前記第1のコマンドと、前記第2の画像用の前記ビューポートを定義する前記第2のコマンドとを実行するように構成される、C14に記載の装置。
[C16]前記プロセッサが、前記画像用の前記ビューポートを定義する前記コマンドを、前記第1のコマンドが前記第1の画像をディスプレイの第1の部分に制限するように構成され、前記第2のコマンドが前記第2の画像を前記ディスプレイの第2の部分に制限するように構成されるように修正するように動作可能である、C14に記載の装置。
[C17]前記プロセッサが、前記画像用の前記ビューポートを定義する前記コマンドを、前記第1の画像用の前記ビューポートをシフトし、またはシフトおよびストレッチし、前記第2の画像用の前記ビューポートをシフトし、またはシフトおよびストレッチするように修正するようにさらに動作可能である、C14に記載の装置。
[C18]前記画像用の前記ビューポートを定義する前記コマンドを修正するために、前記プロセッサが、glViewport(0,0,width,length)コマンドを、glViewport(0,0,width/2,length)コマンドを備える前記第1のコマンド、およびglViewport(width/2,0,width/2,length)コマンドを備える前記第2のコマンドに修正するように動作可能であり、widthがディスプレイの幅に等しく、lengthが前記ディスプレイの長さに等しい、C14に記載の装置。
[C19]前記画像用の前記ビューポートを定義する前記コマンドを修正するために、前記プロセッサが、glViewport(0,0,width,length)コマンドを、glViewport(0−Vps,0,width/2,length)コマンドまたはglViewport(0−Vps,0,width/2+Vps,length)コマンドを備える前記第1のコマンド、およびglViewport(width/2+Vps,0,width/2,length)コマンドまたはglViewport(width/2,0,width/2+Vps,length)コマンドを備える前記第2のコマンドに修正するように動作可能であり、widthがディスプレイの幅に等しく、lengthが前記ディスプレイの長さに等しく、Vpsが、前記立体ビューが前記ディスプレイからポップアウトする量を定義する、C14に記載の装置。
[C20]前記固定機能ユニットがビューポート変換ユニットを備える、C14に記載の装置。
[C21]前記プロセッサが、グラフィックスドライバラッパーを実行して、頂点シェーダに対する命令を受信し、前記頂点シェーダの前記命令を修正し、前記画像用のビューポートを定義する前記コマンドを修正するように動作可能である、C14に記載の装置。
[C22]前記頂点シェーダの前記命令を修正するために、前記プロセッサが、前記モノビューの前記画像についての少なくとも1つのクリッピング座標を修正する命令を前記頂点シェーダに追加するように動作可能である、C14に記載の装置。
[C23]少なくとも1つのクリッピング座標を修正する前記命令を前記頂点シェーダに追加するために、前記プロセッサが、前記少なくとも1つのクリッピング座標を記憶する変数を更新する命令を前記頂点シェーダに追加するように動作可能である、C22に記載の装置。
[C24]前記少なくとも1つのクリッピング座標を記憶する前記変数を更新する前記命令を前記頂点シェーダに追加するために、前記プロセッサが、前記第1の実行において前記少なくとも1つのクリッピング座標に定数値を加算するための命令を追加し、前記第2の実行において前記少なくとも1つのクリッピング座標から前記定数値を減算するための命令を追加するように動作可能である、C23に記載の装置。
[C25]前記モノビューの前記画像についての前記少なくとも1つのクリッピング座標を修正する前記命令を前記頂点シェーダに追加するために、前記プロセッサが、gl.Position.x+=Xコマンドを追加するように動作可能であり、Xが、前記第1の実行では+Dに、および前記第2の実行では−Dに等しく、Dが、閲覧者の左目と右目との間の距離の半分の推定値に等しい、C23に記載の装置。
[C26]前記頂点シェーダの前記命令を、1つまたは複数の命令を含むように修正するために、前記プロセッサが、前記モノビューの前記画像についての1つのクリッピング座標を修正する命令を前記頂点シェーダに追加するように動作可能である、C14に記載の装置。
[C27]シェーダプロセッサ、および固定機能パイプラインの、前記シェーダプロセッサとは異なる固定機能ユニットを含むグラフィックス処理ユニット(GPU)と、
プロセッサとを備え、前記プロセッサが、
モノビューの画像を生成するように構成されており前記GPUの前記シェーダプロセッサ上で実行されるべき頂点シェーダについての命令を受信するための手段と、
前記頂点シェーダの前記命令を、前記頂点シェーダが前記GPUの前記シェーダプロセッサ上で実行されると前記頂点シェーダに、前記頂点シェーダの第1の実行の後に立体ビューの第1の画像用のグラフィックスコンテンツを、また前記頂点シェーダの第2の実行の後に前記立体ビューの第2の画像用のグラフィックスコンテンツを生成させる1つまたは複数の命令を含むように修正するための手段と、
前記モノビューの前記画像用のビューポートを定義するコマンドを、前記第1の画像用のビューポートを定義する、前記シェーダプロセッサとは異なる前記GPUの固定機能ユニット向けの第1のコマンド、および前記第2の画像用のビューポートを定義する、前記GPUの前記固定機能ユニット向けの第2のコマンドに修正するための手段とを含む、装置。
[C28]前記GPUの前記シェーダプロセッサが、前記頂点シェーダの前記修正された命令のオブジェクトコードを実行するように構成され、前記GPUの前記固定機能ユニットが、前記第1の画像用の前記ビューポートを定義する前記第1のコマンドと、前記第2の画像用の前記ビューポートを定義する前記第2のコマンドとを実行するように構成される、C27に記載の装置。
[C29]前記画像用の前記ビューポートを定義する前記コマンドを、前記第1のコマンドが前記第1の画像をディスプレイの第1の部分に制限するように構成され、前記第2のコマンドが前記第2の画像を前記ディスプレイの第2の部分に制限するように構成されるように修正するための前記手段、C27に記載の装置。
[C30]前記画像用の前記ビューポートを定義する前記コマンドを修正するための手段が、前記第1の画像用の前記ビューポートをシフトし、またはシフトおよびストレッチするための手段と、前記第2の画像用の前記ビューポートをシフトし、またはシフトおよびストレッチするための手段とをさらに備える、C27に記載の装置。
[C31]前記頂点シェーダの前記命令を修正するための手段が、前記モノビューの前記画像についての少なくとも1つのクリッピング座標を修正する命令を前記頂点シェーダに追加するための手段を備える、C27に記載の装置。
[C32]前記頂点シェーダの前記命令を1つまたは複数の命令を含むように修正するための手段が、前記モノビューの前記画像についての1つのクリッピング座標を修正する命令を前記頂点シェーダに追加するためだけの手段を備える、C27に記載の装置。
[C33]命令を備える非一時的コンピュータ可読記憶媒体であって、前記命令が、実行されたとき、1つまたは複数のプロセッサに、
モノビューの画像を生成するように設計されておりグラフィックス処理ユニット(GPU)のシェーダプロセッサ上で実行されるべき頂点シェーダについての命令を受信させ、
前記頂点シェーダの前記命令を、前記頂点シェーダが前記GPUの前記シェーダプロセッサ上で実行されると前記頂点シェーダに、前記頂点シェーダの第1の実行の後に立体ビューの第1の画像用のグラフィックスコンテンツと、前記頂点シェーダの第2の実行の後に前記立体ビューの第2の画像用のグラフィックスコンテンツとを生成させる1つまたは複数の命令を含むように修正させ、
前記モノビューの前記画像用のビューポートを定義するコマンドを、前記第1の画像用のビューポートを定義する、前記シェーダプロセッサとは異なる前記GPUの固定機能ユニット向けの第1のコマンドと、前記第2の画像用のビューポートを定義する、前記GPUの前記固定機能ユニット向けの第2のコマンドとに修正させる、非一時的コンピュータ可読記憶媒体。
[C34]前記GPUの前記シェーダプロセッサを用いて、前記頂点シェーダの前記修正された命令のオブジェクトコードを実行させ、
前記GPUの前記固定機能ユニットを用いて、前記第1の画像用の前記ビューポートを定義する前記第1のコマンドと、前記第2の画像用の前記ビューポートを定義する前記第2のコマンドとを実行させるための命令をさらに備える、C33に記載の非一時的コンピュータ可読記憶媒体。
[C35]前記画像用の前記ビューポートを定義する前記コマンドを修正するための前記命令が、前記モノビューの前記画像用の前記ビューポートを定義する前記コマンドを、前記第1の画像をディスプレイの第1の部分に制限する前記第1のコマンドと、前記第2の画像を前記ディスプレイの第2の部分に制限する前記第2のコマンドとに修正するための命令を備える、C33に記載の非一時的コンピュータ可読記憶媒体。
[C36]前記画像用の前記ビューポートを定義する前記コマンドを修正するための前記命令が、前記第1の画像用の前記ビューポートをシフトし、またはシフトおよびストレッチし、前記第2の画像用の前記ビューポートをシフトし、またはシフトおよびストレッチするための命令をさらに備える、C33に記載の非一時的コンピュータ可読記憶媒体。
[C37]前記頂点シェーダの前記命令を修正するための前記命令が、前記モノビューの前記画像についての少なくとも1つのクリッピング座標を修正する命令を、前記頂点シェーダに追加するための命令を備える、C33に記載の非一時的コンピュータ可読記憶媒体。
[C38]前記頂点シェーダの前記命令を、1つまたは複数の命令を含むように修正するための前記命令が、前記モノビューの前記画像についての1つのクリッピング座標を修正する命令を前記頂点シェーダに追加するだけのための命令を備える、C33に記載の非一時的コンピュータ可読記憶媒体。

Claims (38)

  1. プロセッサを用いて、モノビューの画像を生成するように構成されておりグラフィックス処理ユニット(GPU)のシェーダプロセッサ上で実行されるべき頂点シェーダに対する命令を受信することと、
    前記プロセッサを用いて、前記頂点シェーダの前記命令を、前記頂点シェーダが前記GPUの前記シェーダプロセッサ上で実行されると前記頂点シェーダに、前記頂点シェーダの第1の実行の後に立体ビューの第1の画像用のグラフィックスコンテンツを、また前記頂点シェーダの第2の実行の後に前記立体ビューの第2の画像用のグラフィックスコンテンツを生成させる1つまたは複数の命令を含むように修正することと、
    前記プロセッサを用いて、前記モノビューの前記画像用のビューポートを定義するコマンドを、前記第1の画像用のビューポートを定義する、前記シェーダプロセッサとは異なる前記GPUの固定機能ユニット向けの第1のコマンド、および前記第2の画像用のビューポートを定義する、前記GPUの前記固定機能ユニット向けの第2のコマンドに修正することとを備える方法。
  2. 前記GPUの前記シェーダプロセッサを用いて、前記頂点シェーダの前記修正された命令のオブジェクトコードを実行することと、
    前記GPUの前記固定機能ユニットを用いて、前記第1の画像用の前記ビューポートを定義する前記第1のコマンド、および前記第2の画像用の前記ビューポートを定義する前記第2のコマンドを実行することとをさらに備える、請求項1に記載の方法。
  3. 前記画像用の前記ビューポートを定義する前記コマンドを、前記第1のコマンドが前記第1の画像をディスプレイの第1の部分に制限するように構成され、前記第2のコマンドが前記第2の画像を前記ディスプレイの第2の部分に制限するように構成されるように修正する、請求項1に記載の方法。
  4. 前記画像用の前記ビューポートを定義する前記コマンドを修正することが、前記第1の画像用の前記ビューポートをシフトし、またはシフトおよびストレッチすることと、前記第2の画像用の前記ビューポートをシフトし、またはシフトおよびストレッチすることとをさらに備える、請求項1に記載の方法。
  5. 前記画像用の前記ビューポートを定義する前記コマンドを修正することが、glViewport(0,0,width,length)コマンドを、glViewport(0,0,width/2,length)コマンドを備える前記第1のコマンド、およびglViewport(width/2,0,width/2,length)コマンドを備える前記第2のコマンドに修正することを備え、widthがディスプレイの幅に等しく、lengthが前記ディスプレイの長さに等しい、請求項1に記載の方法。
  6. 前記画像用の前記ビューポートを定義する前記コマンドを修正することが、glViewport(0,0,width,length)コマンドを、glViewport(0−Vps,0,width/2,length)コマンドまたはglViewport(0−Vps,0,width/2+Vps,length)コマンドを備える前記第1のコマンド、およびglViewport(width/2+Vps,0,width/2,length)コマンドまたはglViewport(width/2,0,width/2+Vps,length)コマンドを備える前記第2のコマンドに修正することを備え、widthがディスプレイの幅に等しく、lengthが前記ディスプレイの長さに等しく、Vpsが、前記立体ビューが前記ディスプレイからポップアウトまたは前記ディスプレイにプッシュインする量を定義する、請求項1に記載の方法。
  7. 前記固定機能ユニットが、前記GPUの固定機能パイプラインのビューポート変換ユニットを備える、請求項1に記載の方法。
  8. 前記頂点シェーダの命令を受信することが、前記プロセッサ上で実行するグラフィックスドライバラッパーを用いて前記頂点シェーダの前記命令を受信することを備え、前記頂点シェーダの前記命令を修正することが、前記プロセッサ上で実行する前記グラフィックスドライバラッパーを用いて前記頂点シェーダの前記命令を修正することを備え、前記ビューポートを定義する前記コマンドを修正することが、前記プロセッサ上で実行する前記グラフィックスドライバラッパーを用いて、前記ビューポートを定義する前記コマンドを修正することを備える、請求項1に記載の方法。
  9. 前記頂点シェーダの前記命令を修正することが、前記モノビューの前記画像についての少なくとも1つのクリッピング座標を修正する命令を前記頂点シェーダに追加することを備える、請求項1に記載の方法。
  10. 少なくとも1つのクリッピング座標を修正する前記命令を前記頂点シェーダに追加することが、前記少なくとも1つのクリッピング座標を記憶する変数を更新する命令を前記頂点シェーダに追加することを備える、請求項9に記載の方法。
  11. 前記少なくとも1つのクリッピング座標を記憶する前記変数を更新する前記命令を前記頂点シェーダに追加することが、前記第1の実行において前記少なくとも1つのクリッピング座標に定数値を加算するための命令を追加することと、前記第2の実行において前記少なくとも1つのクリッピング座標から前記定数値を減算するための命令を追加することとを備える、請求項10に記載の方法。
  12. 前記モノビューの前記画像についての前記少なくとも1つのクリッピング座標を修正する前記命令を前記頂点シェーダに追加することが、gl.Position.x+=Xコマンドを追加することを備え、Xが、前記第1の実行では+Dに、および前記第2の実行では−Dに等しく、Dが、閲覧者の左目と右目との間の距離の半分の推定値に等しい、請求項10に記載の方法。
  13. 前記頂点シェーダの前記命令を1つまたは複数の命令を含むように修正することが、前記モノビューの前記画像についての1つのクリッピング座標を修正する命令を前記頂点シェーダに追加することのみを備える、請求項1に記載の方法。
  14. シェーダプロセッサ、および固定機能パイプラインの、前記シェーダプロセッサとは異なる固定機能ユニットを含むグラフィックス処理ユニット(GPU)と、
    プロセッサとを備え、前記プロセッサが、
    モノビューの画像を生成するように構成されており前記GPUの前記シェーダプロセッサ上で実行されるべき頂点シェーダについての命令を受信し、
    前記頂点シェーダの前記命令を、前記頂点シェーダが前記GPUの前記シェーダプロセッサ上で実行されると前記頂点シェーダに、前記頂点シェーダの第1の実行の後に立体ビューの第1の画像用のグラフィックスコンテンツと、前記頂点シェーダの第2の実行の後に前記立体ビューの第2の画像用のグラフィックスコンテンツとを生成させる1つまたは複数の命令を含むように修正し、
    前記モノビューの前記画像用のビューポートを定義するコマンドを、前記第1の画像用のビューポートを定義する、前記シェーダプロセッサとは異なる前記GPUの前記固定機能ユニット向けの第1のコマンドと、前記第2の画像用のビューポートを定義する、前記GPUの前記固定機能ユニット向けの第2のコマンドとに修正するように動作可能である、装置。
  15. 前記GPUの前記シェーダプロセッサが、前記頂点シェーダの前記修正された命令のオブジェクトコードを実行するように構成され、前記GPUの前記固定機能ユニットが、前記第1の画像用の前記ビューポートを定義する前記第1のコマンドと、前記第2の画像用の前記ビューポートを定義する前記第2のコマンドとを実行するように構成される、請求項14に記載の装置。
  16. 前記プロセッサが、前記画像用の前記ビューポートを定義する前記コマンドを、前記第1のコマンドが前記第1の画像をディスプレイの第1の部分に制限するように構成され、前記第2のコマンドが前記第2の画像を前記ディスプレイの第2の部分に制限するように構成されるように修正するように動作可能である、請求項14に記載の装置。
  17. 前記プロセッサが、前記画像用の前記ビューポートを定義する前記コマンドを、前記第1の画像用の前記ビューポートをシフトし、またはシフトおよびストレッチし、前記第2の画像用の前記ビューポートをシフトし、またはシフトおよびストレッチするように修正するようにさらに動作可能である、請求項14に記載の装置。
  18. 前記画像用の前記ビューポートを定義する前記コマンドを修正するために、前記プロセッサが、glViewport(0,0,width,length)コマンドを、glViewport(0,0,width/2,length)コマンドを備える前記第1のコマンド、およびglViewport(width/2,0,width/2,length)コマンドを備える前記第2のコマンドに修正するように動作可能であり、widthがディスプレイの幅に等しく、lengthが前記ディスプレイの長さに等しい、請求項14に記載の装置。
  19. 前記画像用の前記ビューポートを定義する前記コマンドを修正するために、前記プロセッサが、glViewport(0,0,width,length)コマンドを、glViewport(0−Vps,0,width/2,length)コマンドまたはglViewport(0−Vps,0,width/2+Vps,length)コマンドを備える前記第1のコマンド、およびglViewport(width/2+Vps,0,width/2,length)コマンドまたはglViewport(width/2,0,width/2+Vps,length)コマンドを備える前記第2のコマンドに修正するように動作可能であり、widthがディスプレイの幅に等しく、lengthが前記ディスプレイの長さに等しく、Vpsが、前記立体ビューが前記ディスプレイからポップアウトする量を定義する、請求項14に記載の装置。
  20. 前記固定機能ユニットがビューポート変換ユニットを備える、請求項14に記載の装置。
  21. 前記プロセッサが、グラフィックスドライバラッパーを実行して、頂点シェーダに対する命令を受信し、前記頂点シェーダの前記命令を修正し、前記画像用のビューポートを定義する前記コマンドを修正するように動作可能である、請求項14に記載の装置。
  22. 前記頂点シェーダの前記命令を修正するために、前記プロセッサが、前記モノビューの前記画像についての少なくとも1つのクリッピング座標を修正する命令を前記頂点シェーダに追加するように動作可能である、請求項14に記載の装置。
  23. 少なくとも1つのクリッピング座標を修正する前記命令を前記頂点シェーダに追加するために、前記プロセッサが、前記少なくとも1つのクリッピング座標を記憶する変数を更新する命令を前記頂点シェーダに追加するように動作可能である、請求項22に記載の装置。
  24. 前記少なくとも1つのクリッピング座標を記憶する前記変数を更新する前記命令を前記頂点シェーダに追加するために、前記プロセッサが、前記第1の実行において前記少なくとも1つのクリッピング座標に定数値を加算するための命令を追加し、前記第2の実行において前記少なくとも1つのクリッピング座標から前記定数値を減算するための命令を追加するように動作可能である、請求項23に記載の装置。
  25. 前記モノビューの前記画像についての前記少なくとも1つのクリッピング座標を修正する前記命令を前記頂点シェーダに追加するために、前記プロセッサが、gl.Position.x+=Xコマンドを追加するように動作可能であり、Xが、前記第1の実行では+Dに、および前記第2の実行では−Dに等しく、Dが、閲覧者の左目と右目との間の距離の半分の推定値に等しい、請求項23に記載の装置。
  26. 前記頂点シェーダの前記命令を、1つまたは複数の命令を含むように修正するために、前記プロセッサが、前記モノビューの前記画像についての1つのクリッピング座標を修正する命令を前記頂点シェーダに追加するように動作可能である、請求項14に記載の装置。
  27. シェーダプロセッサ、および固定機能パイプラインの、前記シェーダプロセッサとは異なる固定機能ユニットを含むグラフィックス処理ユニット(GPU)と、
    プロセッサとを備え、前記プロセッサが、
    モノビューの画像を生成するように構成されており前記GPUの前記シェーダプロセッサ上で実行されるべき頂点シェーダについての命令を受信するための手段と、
    前記頂点シェーダの前記命令を、前記頂点シェーダが前記GPUの前記シェーダプロセッサ上で実行されると前記頂点シェーダに、前記頂点シェーダの第1の実行の後に立体ビューの第1の画像用のグラフィックスコンテンツを、また前記頂点シェーダの第2の実行の後に前記立体ビューの第2の画像用のグラフィックスコンテンツを生成させる1つまたは複数の命令を含むように修正するための手段と、
    前記モノビューの前記画像用のビューポートを定義するコマンドを、前記第1の画像用のビューポートを定義する、前記シェーダプロセッサとは異なる前記GPUの固定機能ユニット向けの第1のコマンド、および前記第2の画像用のビューポートを定義する、前記GPUの前記固定機能ユニット向けの第2のコマンドに修正するための手段とを含む、装置。
  28. 前記GPUの前記シェーダプロセッサが、前記頂点シェーダの前記修正された命令のオブジェクトコードを実行するように構成され、前記GPUの前記固定機能ユニットが、前記第1の画像用の前記ビューポートを定義する前記第1のコマンドと、前記第2の画像用の前記ビューポートを定義する前記第2のコマンドとを実行するように構成される、請求項27に記載の装置。
  29. 前記画像用の前記ビューポートを定義する前記コマンドを、前記第1のコマンドが前記第1の画像をディスプレイの第1の部分に制限するように構成され、前記第2のコマンドが前記第2の画像を前記ディスプレイの第2の部分に制限するように構成されるように修正するための前記手段、請求項27に記載の装置。
  30. 前記画像用の前記ビューポートを定義する前記コマンドを修正するための手段が、前記第1の画像用の前記ビューポートをシフトし、またはシフトおよびストレッチするための手段と、前記第2の画像用の前記ビューポートをシフトし、またはシフトおよびストレッチするための手段とをさらに備える、請求項27に記載の装置。
  31. 前記頂点シェーダの前記命令を修正するための手段が、前記モノビューの前記画像についての少なくとも1つのクリッピング座標を修正する命令を前記頂点シェーダに追加するための手段を備える、請求項27に記載の装置。
  32. 前記頂点シェーダの前記命令を1つまたは複数の命令を含むように修正するための手段が、前記モノビューの前記画像についての1つのクリッピング座標を修正する命令を前記頂点シェーダに追加するためだけの手段を備える、請求項27に記載の装置。
  33. 命令を備える非一時的コンピュータ可読記憶媒体であって、前記命令が、実行されたとき、1つまたは複数のプロセッサに、
    モノビューの画像を生成するように設計されておりグラフィックス処理ユニット(GPU)のシェーダプロセッサ上で実行されるべき頂点シェーダについての命令を受信させ、
    前記頂点シェーダの前記命令を、前記頂点シェーダが前記GPUの前記シェーダプロセッサ上で実行されると前記頂点シェーダに、前記頂点シェーダの第1の実行の後に立体ビューの第1の画像用のグラフィックスコンテンツと、前記頂点シェーダの第2の実行の後に前記立体ビューの第2の画像用のグラフィックスコンテンツとを生成させる1つまたは複数の命令を含むように修正させ、
    前記モノビューの前記画像用のビューポートを定義するコマンドを、前記第1の画像用のビューポートを定義する、前記シェーダプロセッサとは異なる前記GPUの固定機能ユニット向けの第1のコマンドと、前記第2の画像用のビューポートを定義する、前記GPUの前記固定機能ユニット向けの第2のコマンドとに修正させる、非一時的コンピュータ可読記憶媒体。
  34. 前記GPUの前記シェーダプロセッサを用いて、前記頂点シェーダの前記修正された命令のオブジェクトコードを実行させ、
    前記GPUの前記固定機能ユニットを用いて、前記第1の画像用の前記ビューポートを定義する前記第1のコマンドと、前記第2の画像用の前記ビューポートを定義する前記第2のコマンドとを実行させるための命令をさらに備える、請求項33に記載の非一時的コンピュータ可読記憶媒体。
  35. 前記画像用の前記ビューポートを定義する前記コマンドを修正するための前記命令が、前記モノビューの前記画像用の前記ビューポートを定義する前記コマンドを、前記第1の画像をディスプレイの第1の部分に制限する前記第1のコマンドと、前記第2の画像を前記ディスプレイの第2の部分に制限する前記第2のコマンドとに修正するための命令を備える、請求項33に記載の非一時的コンピュータ可読記憶媒体。
  36. 前記画像用の前記ビューポートを定義する前記コマンドを修正するための前記命令が、前記第1の画像用の前記ビューポートをシフトし、またはシフトおよびストレッチし、前記第2の画像用の前記ビューポートをシフトし、またはシフトおよびストレッチするための命令をさらに備える、請求項33に記載の非一時的コンピュータ可読記憶媒体。
  37. 前記頂点シェーダの前記命令を修正するための前記命令が、前記モノビューの前記画像についての少なくとも1つのクリッピング座標を修正する命令を、前記頂点シェーダに追加するための命令を備える、請求項33に記載の非一時的コンピュータ可読記憶媒体。
  38. 前記頂点シェーダの前記命令を、1つまたは複数の命令を含むように修正するための前記命令が、前記モノビューの前記画像についての1つのクリッピング座標を修正する命令を前記頂点シェーダに追加するだけのための命令を備える、請求項33に記載の非一時的コンピュータ可読記憶媒体。
JP2013558086A 2011-03-14 2012-03-12 シェーダベースのグラフィックスコンテンツのための立体視コンバージョン Expired - Fee Related JP5694577B2 (ja)

Applications Claiming Priority (7)

Application Number Priority Date Filing Date Title
US201161452289P 2011-03-14 2011-03-14
US61/452,289 2011-03-14
US201161474638P 2011-04-12 2011-04-12
US61/474,638 2011-04-12
US13/350,467 US9578299B2 (en) 2011-03-14 2012-01-13 Stereoscopic conversion for shader based graphics content
US13/350,467 2012-01-13
PCT/US2012/028749 WO2012125545A1 (en) 2011-03-14 2012-03-12 Stereoscopic conversion for shader based graphics content

Publications (2)

Publication Number Publication Date
JP2014512032A true JP2014512032A (ja) 2014-05-19
JP5694577B2 JP5694577B2 (ja) 2015-04-01

Family

ID=46828080

Family Applications (2)

Application Number Title Priority Date Filing Date
JP2013558086A Expired - Fee Related JP5694577B2 (ja) 2011-03-14 2012-03-12 シェーダベースのグラフィックスコンテンツのための立体視コンバージョン
JP2013558122A Expired - Fee Related JP5882367B2 (ja) 2011-03-14 2012-03-13 立体視3dへの平面視3dのランタイム変換

Family Applications After (1)

Application Number Title Priority Date Filing Date
JP2013558122A Expired - Fee Related JP5882367B2 (ja) 2011-03-14 2012-03-13 立体視3dへの平面視3dのランタイム変換

Country Status (6)

Country Link
US (2) US9578299B2 (ja)
EP (2) EP2686833B1 (ja)
JP (2) JP5694577B2 (ja)
KR (2) KR101556835B1 (ja)
CN (2) CN103493102B (ja)
WO (2) WO2012125545A1 (ja)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2016196290A (ja) * 2015-04-02 2016-11-24 ジーイー・アビエイション・システムズ・リミテッドGe Aviation Systems Limited アビオニクス表示システム

Families Citing this family (23)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8938093B2 (en) * 2009-04-21 2015-01-20 International Business Machines Corporation Addition of immersive interaction capabilities to otherwise unmodified 3D graphics applications
KR20130081569A (ko) * 2012-01-09 2013-07-17 삼성전자주식회사 3d 영상을 출력하기 위한 장치 및 방법
US9538164B2 (en) 2013-01-10 2017-01-03 Qualcomm Incorporated Stereoscopic conversion with viewing orientation for shader based graphics content
JP2016511979A (ja) * 2013-03-13 2016-04-21 インテル コーポレイション 3次元画像編集のための改善された技術
US20140375663A1 (en) * 2013-06-24 2014-12-25 Alexander Pfaffe Interleaved tiled rendering of stereoscopic scenes
US10134170B2 (en) * 2013-09-26 2018-11-20 Intel Corporation Stereoscopic rendering using vertix shader instancing
KR102082132B1 (ko) * 2014-01-28 2020-02-28 한국전자통신연구원 2d 동영상으로부터 새로운 3d 입체 동영상 제작을 위한 장치 및 방법
US20150281679A1 (en) 2014-03-28 2015-10-01 Qualcomm Incorporated Pixel data generation for autostereoscopy images
CN104134231B (zh) * 2014-07-11 2017-02-01 南京乐飞航空技术有限公司 一种基于图像识别的海岸线构造方法
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
CN104486611A (zh) * 2014-12-29 2015-04-01 北京极维客科技有限公司 一种图像转换方法及装置
US10186008B2 (en) * 2015-05-28 2019-01-22 Qualcomm Incorporated Stereoscopic view processing
KR102459850B1 (ko) 2015-12-03 2022-10-27 삼성전자주식회사 3d 이미지 처리 방법 및 장치, 및 그래픽 처리 장치
US10860499B2 (en) 2016-03-22 2020-12-08 Lenovo Enterprise Solutions (Singapore) Pte. Ltd Dynamic memory management in workload acceleration
US10884761B2 (en) 2016-03-22 2021-01-05 Lenovo Enterprise Solutions (Singapore) Pte. Ltd Best performance delivery in heterogeneous computing unit environment
US10203747B2 (en) 2016-03-22 2019-02-12 Lenovo Enterprise Solutions (Singapore) Pte. Ltd. Workload placement based on heterogeneous compute performance per watt
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
CN106993179A (zh) * 2017-02-24 2017-07-28 杭州电子科技大学 一种3d模型转立体双视点视图的方法
US20240070959A1 (en) * 2022-08-25 2024-02-29 Acer Incorporated Method and computer device for 3d scene generation
CN115457200B (zh) * 2022-08-31 2023-04-14 北京四维远见信息技术有限公司 2.5维图像自动真立体显示方法、装置、设备及存储介质

Citations (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH1173523A (ja) * 1997-06-20 1999-03-16 Sun Microsyst Inc シングルパス・ステレオ性能を含む3次元グラフィックス・アクセラレータ用浮動小数点プロセッサ
JP2002519792A (ja) * 1998-06-30 2002-07-02 コーニンクレッカ フィリップス エレクトロニクス エヌ ヴィ ハードウェア・アクセラレーティド・レンダリング・アーキテクチャにおいて3dデータを変換するフィルタ
JP2007141156A (ja) * 2005-11-22 2007-06-07 Sharp Corp 立体視画像装置、ゲーム装置、立体視画像映写装置、立体視画像データ生成方法、制御プログラムおよび可読記録媒体
JP2007538427A (ja) * 2004-05-12 2007-12-27 セットレッド エーエス 三次元表示方法および装置
US20080007559A1 (en) * 2006-06-30 2008-01-10 Nokia Corporation Apparatus, method and a computer program product for providing a unified graphics pipeline for stereoscopic rendering
JP2009064356A (ja) * 2007-09-07 2009-03-26 Cellius Inc プログラム、情報記憶媒体及び画像生成システム
JP2009064355A (ja) * 2007-09-07 2009-03-26 Cellius Inc プログラム、情報記憶媒体及び画像生成システム
WO2011013030A1 (en) * 2009-07-27 2011-02-03 Koninklijke Philips Electronics N.V. Combining 3d video and auxiliary data

Family Cites Families (24)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
FR2532267B1 (fr) 1982-08-31 1988-05-27 Lely Nv C Van Der Tracteur comportant une pluralite de roues motrices
US6104405A (en) 1997-02-26 2000-08-15 Alternate Realities Corporation Systems, methods and computer program products for converting image data to nonplanar image data
GB2358980B (en) 2000-02-07 2004-09-01 British Broadcasting Corp Processing of images for 3D display
GB0010685D0 (en) 2000-05-03 2000-06-28 Koninkl Philips Electronics Nv Autostereoscopic display driver
US20020154214A1 (en) 2000-11-02 2002-10-24 Laurent Scallie Virtual reality game system using pseudo 3D display driver
US20040085310A1 (en) 2002-11-04 2004-05-06 Snuffer John T. System and method of extracting 3-D data generated for 2-D display applications for use in 3-D volumetric displays
AU2002952872A0 (en) 2002-11-25 2002-12-12 Dynamic Digital Depth Research Pty Ltd Image generation
US20040212612A1 (en) 2003-04-28 2004-10-28 Michael Epstein Method and apparatus for converting two-dimensional images into three-dimensional images
US8004515B1 (en) * 2005-03-15 2011-08-23 Nvidia Corporation Stereoscopic vertex shader override
WO2007017834A2 (en) * 2005-08-09 2007-02-15 Koninklijke Philips Electronics N.V. Disparity value generator
US8237739B2 (en) * 2006-09-12 2012-08-07 Qualcomm Incorporated Method and device for performing user-defined clipping in object space
US8149242B2 (en) * 2006-11-10 2012-04-03 Sony Computer Entertainment Inc. Graphics processing apparatus, graphics library module and graphics processing method
US7982733B2 (en) 2007-01-05 2011-07-19 Qualcomm Incorporated Rendering 3D video images on a stereo-enabled display
JP4836814B2 (ja) 2007-01-30 2011-12-14 株式会社東芝 3dディスプレイ用cg画像生成装置、3dディスプレイ用cg画像生成方法、及びプログラム
US7884823B2 (en) 2007-06-12 2011-02-08 Microsoft Corporation Three dimensional rendering of display information using viewer eye coordinates
US7675513B2 (en) * 2008-03-14 2010-03-09 Evans & Sutherland Computer Corp. System and method for displaying stereo images
US8279222B2 (en) 2008-03-14 2012-10-02 Seiko Epson Corporation Processing graphics data for a stereoscopic display
KR101619450B1 (ko) 2009-01-12 2016-05-10 엘지전자 주식회사 뎁스 정보를 이용한 비디오 신호 처리 방법 및 장치
US9001157B2 (en) 2009-03-25 2015-04-07 Nvidia Corporation Techniques for displaying a selection marquee in stereographic content
US8938093B2 (en) 2009-04-21 2015-01-20 International Business Machines Corporation Addition of immersive interaction capabilities to otherwise unmodified 3D graphics applications
GB2470759A (en) 2009-06-03 2010-12-08 Sony Comp Entertainment Europe Displaying videogame on 3D display by generating stereoscopic version of game without modifying source code
US8773449B2 (en) 2009-09-14 2014-07-08 International Business Machines Corporation Rendering of stereoscopic images with multithreaded rendering software pipeline
KR101631514B1 (ko) 2009-11-19 2016-06-17 삼성전자주식회사 전자기기에서 3차원 컨텐츠 생성 방법 및 장치
US8964013B2 (en) 2009-12-31 2015-02-24 Broadcom Corporation Display with elastic light manipulator

Patent Citations (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH1173523A (ja) * 1997-06-20 1999-03-16 Sun Microsyst Inc シングルパス・ステレオ性能を含む3次元グラフィックス・アクセラレータ用浮動小数点プロセッサ
JP2002519792A (ja) * 1998-06-30 2002-07-02 コーニンクレッカ フィリップス エレクトロニクス エヌ ヴィ ハードウェア・アクセラレーティド・レンダリング・アーキテクチャにおいて3dデータを変換するフィルタ
JP2007538427A (ja) * 2004-05-12 2007-12-27 セットレッド エーエス 三次元表示方法および装置
JP2007141156A (ja) * 2005-11-22 2007-06-07 Sharp Corp 立体視画像装置、ゲーム装置、立体視画像映写装置、立体視画像データ生成方法、制御プログラムおよび可読記録媒体
US20080007559A1 (en) * 2006-06-30 2008-01-10 Nokia Corporation Apparatus, method and a computer program product for providing a unified graphics pipeline for stereoscopic rendering
JP2009064356A (ja) * 2007-09-07 2009-03-26 Cellius Inc プログラム、情報記憶媒体及び画像生成システム
JP2009064355A (ja) * 2007-09-07 2009-03-26 Cellius Inc プログラム、情報記憶媒体及び画像生成システム
WO2011013030A1 (en) * 2009-07-27 2011-02-03 Koninklijke Philips Electronics N.V. Combining 3d video and auxiliary data

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2016196290A (ja) * 2015-04-02 2016-11-24 ジーイー・アビエイション・システムズ・リミテッドGe Aviation Systems Limited アビオニクス表示システム
US9892551B2 (en) 2015-04-02 2018-02-13 Ge Aviation Systems Limited Avionics display system

Also Published As

Publication number Publication date
KR20130131480A (ko) 2013-12-03
KR101556835B1 (ko) 2015-10-01
CN103444190A (zh) 2013-12-11
US9219902B2 (en) 2015-12-22
CN103493102A (zh) 2014-01-01
CN103493102B (zh) 2016-11-09
EP2686833A1 (en) 2014-01-22
KR101529812B1 (ko) 2015-06-17
US20120235999A1 (en) 2012-09-20
US9578299B2 (en) 2017-02-21
EP2686833B1 (en) 2018-06-20
WO2012125648A1 (en) 2012-09-20
EP2687018A1 (en) 2014-01-22
WO2012125545A1 (en) 2012-09-20
KR20130136536A (ko) 2013-12-12
CN103444190B (zh) 2016-06-08
US20120236002A1 (en) 2012-09-20
JP2014516427A (ja) 2014-07-10
JP5694577B2 (ja) 2015-04-01
JP5882367B2 (ja) 2016-03-09

Similar Documents

Publication Publication Date Title
JP5694577B2 (ja) シェーダベースのグラフィックスコンテンツのための立体視コンバージョン
JP6227668B2 (ja) シェーダベースのグラフィックスコンテンツのための視線方向による立体視変換
JP5891425B2 (ja) 追体験映像を提供することができる映像提供装置、映像提供方法、映像提供プログラム
EP3304896B1 (en) Stereoscopic view processing
US20110273437A1 (en) Data Dependent Method of Configuring Stereoscopic Rendering Parameters
US20130293547A1 (en) Graphics rendering technique for autostereoscopic three dimensional display
WO2012094076A9 (en) Morphological anti-aliasing (mlaa) of a re-projection of a two-dimensional image
KR20120012858A (ko) 3차원 그래픽 기반 단말기에서 객체 렌더링 장치 및 방법
US8619094B2 (en) Morphological anti-aliasing (MLAA) of a re-projection of a two-dimensional image
JP2014211871A (ja) 立体視レンダリングシステム
KR101227155B1 (ko) 저해상도 그래픽 영상을 고해상도 그래픽 영상으로 실시간 변환하는 그래픽 영상 처리 장치 및 방법
KR101227183B1 (ko) 3d 그래픽 모델 입체 렌더링 장치 및 입체 렌더링 방법
Sankaralingam Unified Graphics API for a Display-Agnostic Rendering System

Legal Events

Date Code Title Description
A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20140804

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20140819

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20141118

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20150106

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20150204

R150 Certificate of patent or registration of utility model

Ref document number: 5694577

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

LAPS Cancellation because of no payment of annual fees