[0024]本開示で説明される例示的な技法は、実行またはランタイム中の立体3次元(S3D)グラフィックスのレンダリングを対象とする。たとえば、アプリケーションは、表示のためにグラフィックス処理ユニット(GPU)によってレンダリングされるべきモノビュー画像を生成し得る。本開示で説明される技法は、アプリケーションの実行の間(すなわち、ランタイムの間)に、モノビュー画像を立体視ビュー画像に変換することができる。
[0025]いくつかの例では、本技法は、グラフィックスを作成したアプリケーションまたはGPUに対する修正を何ら必要とせずに、S3Dグラフィックスをレンダリングすることができる。いくつかの例では、本開示で説明される技法は、グラフィックスドライバに対してラッパーを実行するアプリケーションプロセッサによって実施され得る。本開示で説明される技法によれば、グラフィックスドライバに対するラッパーは、事前に作成されたグラフィックスドライバへの入力を修正する、または、事前に作成されたグラフィックスドライバの出力を修正する、プログラムであると見なされ得る。このようにして、本開示で説明される技法は、アプリケーションプロセッサ上で実行されるグラフィックスドライバを修正する必要なくS3Dグラフィックスを生成するためのGPUを与え得る。しかしながら、アプリケーションプロセッサがグラフィックスドライバの実行に応答して本開示で説明される例示的な技法を実施するように、新しいグラフィックスドライバを作成すること、または、事前に作成されたグラフィックスドライバを修正することが可能であり得る。例示を目的に、本技法は、グラフィックスドライバラッパーを実行するアプリケーションプロセッサによって実行されるものとして説明される。
[0026]アプリケーションの観点からは、アプリケーションを実行するアプリケーションプロセッサは、GPUによる従来の3Dグラフィックスレンダリングのための、グラフィックスデータとアプリケーションのコマンドとを出力することができる。アプリケーションプロセッサ上で実行されるグラフィックスドライバラッパーは、GPUがS3Dディスプレイ上でS3Dグラフィックスをレンダリングするように、それらのコマンド、ならびにGPUによって実行される命令を修正することができる。本開示では、「コマンド」と「命令」という用語は互換的に使用され得る。こうして、GPUは、グラフィックスを生成したアプリケーションまたはGPUに対する変更を何ら必要とせずに、S3Dグラフィックスをレンダリングすることができる。したがって、本開示で説明される技法は、閲覧者が、S3Dグラフィックスを生成するように設計されていないアプリケーションによって生成された画像コンテンツについて、S3Dグラフィックスを体験することを可能にし得る。
[0027]さらに、本開示で説明される技法は、GPUによって実行される命令をアプリケーションプロセッサがグラフィックスドライバラッパーを介して修正する方式を決定するために、視線角度(すなわち、閲覧者がディスプレイを見ている角度)を考慮することができる。視線角度を考慮することによって、閲覧者は、ディスプレイが傾いている場合、または閲覧者の頭が傾いている場合であっても、高品質のS3Dグラフィックスを体験することができる。
[0028]従来の3Dグラフィックスレンダリングでは、GPUが、単一視点(たとえば、モノビュー)から3Dグラフィックスを生成する。この単一視点は、閲覧者の右眼と左眼の両方によって閲覧可能である単一の画像を意味し得る。S3Dグラフィックスは、S3Dグラフィックスが立体視ビューを生成するという点で、3Dグラフィックスとは異なる。立体視ビューという用語は、両眼視点から生成される画像を指す。両眼視点には、2つの画像があってよく、1つの画像は一方の眼によって閲覧可能であり他方の眼によって閲覧可能でなく、その逆も同様である。たとえば、閲覧者が特別な眼鏡を着用すると、眼鏡の左レンズを通って入る光は左眼によって閲覧可能であり右眼によって閲覧可能でなく、その逆も同様である。両眼視点は立体視ビューと呼ばれることがある。
[0029]たとえば、S3Dグラフィックスでは、GPUは、左眼のための画像と右眼のための別の画像とを(すなわち、立体視ビューを)生成し得る。左眼画像は、閲覧者の右眼から遮断され、左眼のみに向けられる。右眼画像は、閲覧者の左眼から遮断され、右眼のみに向けられる。立体視ビューという用語は、ディスプレイ上にそれぞれ表示される2つの画像(たとえば、左眼画像および右眼画像)を指すが、モノビューは、ディスプレイ上に表示される単一の画像を指す。左眼画像と右眼画像との組合せは、閲覧者にとっては、画像が、画像を表示しているディスプレイから飛び出している、またはディスプレイに押し込まれているかのように見え得る。これは、より現実的でより豊かな閲覧体験をもたらし得る。
[0030]本開示では、S3D画像(たとえば、立体視ビュー)および3D画像(たとえば、モノビュー)の概念は、混同されるべきでない。3D画像は、ディスプレイの2次元(2D)エリアに制限される画像である。たとえば、3Dグラフィックス処理では、アプリケーションは3Dプリミティブを定義し、プリミティブはアプリケーションコンテンツの様々な物体を形成する。これらの物体は、ディスプレイの2Dエリアに制限される単一の画像(たとえば、モノビュー)を形成する。
[0031]たとえば、3D画像内の物体は、3D画像内の他の物体よりも遠く離れているか、または近接しているように見え得る。しかしながら、これらの物体のすべてが、ディスプレイの2Dエリアに限定される。S3D画像は、閲覧者の脳が右眼画像と左眼画像とを組み合わせることから生じる知覚される画像である。得られた画像(すなわち、S3D画像)は、ディスプレイの2Dエリアに制限されないように見える。むしろ、S3D画像は、画像がディスプレイから飛び出している、ディスプレイに押し込まれているように見える3Dボリュームを包含するように見える。たとえば、S3D画像内の物体は、3Dボリューム内の他の物体よりも遠く離れているか、または近接しているように見え、3D画像の場合のように2Dエリアではないように見える。
[0032]言い換えると、3Dグラフィックス処理は、ディスプレイの2Dエリアに制限されているように見える3D画像を(たとえば、アプリケーションによって定義される3Dプリミティブによって)生成することを指す。3D画像はモノビューと呼ばれる。S3Dは、モノビューではなく立体視ビューの作成のためのレンダリングを指す。立体視ビューでは、右眼画像と左眼画像は2Dディスプレイに制限されるが、閲覧者が立体視ビューを見るとき、画像は3Dボリュームを包含するように見える。
[0033]S3D画像を一緒に形成する右眼画像および左眼画像は、3D画像であり得る。3D右眼画像と3D左眼画像とを組み合わせるときに閲覧者にS3D画像を知覚させるのは、閲覧者の脳である。たとえば、閲覧者が右眼画像と左眼画像の両方を同時に見ると、閲覧者は、人の両眼視に基づいて風景の奥行きを知覚することができる。右眼画像と左眼画像とのコンテンツは、単一の3D画像のコンテンツと実質的に同様であり得る。
[0034]高品質の立体視効果のために、左眼画像と右眼画像との間には水平視差のみがあり得る。たとえば、左眼画像における物体の位置と右眼画像におけるその物体の位置は異なり得る。しかしながら、差は水平方向にしかないことがあり、垂直方向にはないことがある。物体がディスプレイから飛び出しているように、またはディスプレイに押し込まれているように見えるように、閲覧者の両眼視に左眼画像と右眼画像とを合成させるのは、物体間の水平視差である。物体間の任意の垂直視差は、S3D効果を減衰させ得る。
[0035]グラフィックスドライバまたはグラフィックスドライバラッパーを実行する、本開示アプリケーションプロセッサで説明される技法は、モノビューのためのグラフィックスコンテンツをGPUに生成させる命令を、立体視ビューのためのグラフィックスコンテンツをGPUに生成させる命令に修正することができる。言い換えると、修正の前に、命令は、GPUに単一3D画像を生成させることができる。修正の後に、命令は、GPUに、立体視ビューの2つの3D画像(たとえば、3D左眼画像および3D右眼画像)を生成させることができる。
[0036]本開示で説明される技法は全般に、3D画像のために開示されるが、本開示の態様は、そのように限定されないことに留意されたい。本開示の技法は、2Dグラフィックスにも拡張され得る。たとえば、モノビューの単一の画像は2D画像であってよく、本開示の技法は、立体視ビューのための2つの2D画像をGPUに生成させるように、命令を修正することができる。この場合、閲覧者は、立体視ビューのための2つの画像を表示しているディスプレイから飛び出している、またはディスプレイに押し込まれている、単一の画像を知覚する。混同を避けるために、以下で説明される技法は、モノビューのための単一の画像と、立体視ビューのための左眼画像と右眼画像とに言及するが、これらの画像は3D画像または2D画像であり得ることを理解されたい。
[0037]本開示アプリケーションプロセッサで説明される例示的な技法は、グラフィックスドライバまたはグラフィックスドライバラッパーを介して、アプリケーションによって発行された、GPUによって実行されるべき命令と、GPUによって実行されるべき頂点シェーダプログラムの命令とを修正することができる。たとえば、アプリケーションプロセッサがアプリケーションを実行することができる。アプリケーションは、単一の画像(たとえば、モノビュー)を生成するように設計されていることがあり、単一の画像のグラフィックスコンテンツを複数のプリミティブとして生成することができる。加えて、アプリケーションは、プリミティブの各頂点について、色、透明度、および座標値などのピクセル値を決定することができる。
[0038]アプリケーションの実行の間(たとえば、ランタイム中)、アプリケーションは、アプリケーションプロセッサを介して、頂点シェーダプログラムの命令を取り出すためのコマンドを発行する。頂点シェーダプログラムの出力は、実行されると、単一の画像(たとえば、モノビュー)のためにアプリケーションによって生成されたプリミティブの頂点のクリッピング座標であってよい。例示的な技法は、左眼画像および右眼画像(たとえば、立体視ビュー)のためのプリミティブの頂点のクリッピング座標を生成するように、頂点シェーダプログラムの命令を修正することができる。左眼画像および右眼画像のためのプリミティブの頂点のクリッピング座標は、視線角度に基づき得る。
[0039]視線角度は、アプリケーションの実行の間に左眼画像および右眼画像が表示されているディスプレイを閲覧者が見ている角度(すなわち、ディスプレイに対する閲覧者の視線方向)を指す。視線角度を決定するために多くの異なる方法が存在し得る。本開示で説明される技法は、視線角度を決定するためのいずれの特定の方式にも限定されない。
[0040]また、アプリケーションの実行中、アプリケーションは、アプリケーションプロセッサを介して、単一画像内のプリミティブの1つまたは複数を描画するようにGPUに命令するための描画命令をGPUへ発行する。たとえば、本開示の技法において、アプリケーションプロセッサ上で実行されるアプリケーションは、単一の画像のためのグラフィックスコンテンツをGPUが生成する予定であるかのように、命令を出力する。本明細書で説明される技法は、描画命令のようなアプリケーションによって発行された命令の1つまたは複数を、左眼画像および右眼画像用のためのグラフィックスコンテンツを生成するように修正する。このように、アプリケーションの観点からの、命令に対する修正はない。
[0041]たとえば、アプリケーションプロセッサは、グラフィックスドライバラッパーを介して、アプリケーションによって発行される命令を監視する。アプリケーションが描画命令を発行すると、グラフィックスドライバラッパーは、そのような描画命令を捕捉し、2つの描画命令を発行し、ここで、1つの命令は、視線角度に基づいて左眼画像のためのグラフィックコンテンツを生成するためのものであり、1つの命令は、視線角度に基づいて右眼画像のためのグラフィックスコンテンツを生成するためのものである。
[0042]視線角度は一定のままではないことがある。たとえば、アプリケーションの実行の間に、閲覧者はデバイスを傾けることがあり、自分の頭を傾けることがあり、またはその両方を行うことがある。視線角度の変化の可能性を考慮するために、アプリケーションプロセッサは、視線角度を定期的に決定し得る。一例として、GPUが左眼画像と右眼画像の1つの組合せを出力した後で、本技法は視線角度を決定し得る。この例では、グラフィックスドライバラッパーは、GPUによってレンダリングされる左眼画像と右眼画像の次の組合せのための視線角度の変化を考慮するために、頂点シェーダの命令を修正することができる。あるいは、プロセッサは、視線角度を継続的に決定することができ、グラフィックスドライバラッパーは、頂点シェーダの命令を修正する方式を決定するために、現在の視線角度を利用することができる。
[0043]上で説明されたように、グラフィックスドライバラッパーは、左眼画像と右眼画像の両方のためのプリミティブの頂点を作成するように、頂点シェーダの命令を修正することができる。たとえば、本技法は、修正された頂点シェーダを2回実行させることができる。1回目の実行では、修正された頂点シェーダは、視線角度に基づいて第1の向きに頂点のクリッピング座標をずらすことができ、2回目の実行では、修正された頂点シェーダは、視線角度に基づいて第2の向きに頂点のクリッピング座標をずらすことができる。GPUは、左眼画像をレンダリングするために、第1の向きにずらされた頂点を処理することができ、右眼画像をレンダリングするために、第2の向きにずらされた頂点を処理することができる。
[0044]しかしながら、第1の向きにクリッピング座標のすべてをずらし、次いで第2の向きにクリッピング座標のすべてをずらすことは、アプリケーションによって生成される単一の画像のすべての物体が、左眼画像と右眼画像とを表示しているディスプレイから飛び出している、またはディスプレイに押し込まれている、立体視ビューをもたらし得る。たとえば、アプリケーションによって生成されるプリミティブは、異なる物体を形成し得る。左眼画像を生成するために第1の向きにプリミティブのすべてのクリッピング座標をずらし、右眼画像を生成するために第2の向きにプリミティブのすべてのクリッピング座標をずらすことによって、物体のすべてが、ディスプレイから飛び出しているように、またはディスプレイに押し込まれているように見え得る。
[0045]そのような結果は、人の両眼視に対して最適ではないことがある。たとえば、閲覧者は、一部の物体が、他の物体よりも飛び出ることを望み得る。別の例として、物体のすべてが同じ量だけディスプレイから飛び出している、またはディスプレイに押し込まれている場合であっても、閲覧者は、物体がディスプレイから飛び出る量またはディスプレイに押し込まれる量を調節することを望み得る。
[0046]より詳細に説明されるように、アプリケーションプロセッサは、グラフィックスドライバラッパーを介して、一部の物体が他の物体よりもディスプレイから飛び出る、またはディスプレイに押し込まれるように、頂点シェーダの命令を修正することもできる。いくつかの例では、一部の物体が他の物体よりもディスプレイから飛び出ることまたはディスプレイに押し込まれることを可能にするように頂点シェーダの命令を修正することに加えて、またはその代わりに、アプリケーションプロセッサは、グラフィックスドライバラッパーを介して、左眼画像と右眼画像との間の水平視差を増やす、または減らす、命令を修正することができる。このようにして、閲覧者は、立体視ビューがディスプレイから飛び出る量またはディスプレイに押し込まれる量を調節することが可能になり得る。
[0047]図1は、本開示で説明される1つまたは複数の例による、立体視ビューを表示しているディスプレイを示す概念図である。図1はデバイス10を示す。デバイス10の例は、限定はされないが、モバイルワイヤレス電話、携帯情報端末(PDA)、ビデオディスプレイを含むビデオゲーミングコンソール、モバイルビデオ会議ユニット、ラップトップコンピュータ、デスクトップコンピュータ、テレビジョンセットトップボックス、デジタルメディアプレーヤ、タブレットコンピューティングデバイス、スマートフォンなどを含む。デバイス10はディスプレイ12を含む。ディスプレイ12の例は、限定はされないが、液晶ディスプレイ(LCD)、有機発光ダイオードディスプレイ(OLED)、陰極線管(CRT)ディスプレイ、プラズマディスプレイ、偏光ディスプレイ、または別のタイプのディスプレイデバイスを含む。ディスプレイ12は、立体視ビュー(たとえば、左眼画像と右眼画像)を表示するように構成される任意のタイプのディスプレイであり得る。
[0048]示されるように、ディスプレイ12は3D画像14Aと3D画像14Bとを表示する。図1は、実線の箱として画像14Aを示し、点線の箱として画像14Bを示す。画像14Aおよび画像14Bは各々3D画像であり得る。たとえば、画像14Aと14Bの各々1つが個々に見られる場合、画像14Aおよび14Bは、ディスプレイ12から飛び出しているまたはディスプレイ12に押し込まれているようには見えないであろう(たとえば、モノビューであるように見える)。
[0049]しかしながら、画像14Aと画像14Bが一緒に見られると、画像14Aおよび画像14Bは一緒に立体視ビューを形成する。たとえば、画像14Aおよび画像14Bは同様の画像コンテンツを含み得るが、ディスプレイ12上ではずれている。閲覧者により装着される特別な眼鏡は、閲覧者の右眼が画像14Aを見るのを妨げ、閲覧者の左眼が画像14Bを見ることを可能にし得る。特別な眼鏡はまた、閲覧者の左眼が画像14Bを見るのを妨げ、閲覧者の右眼が画像14Aを見ることを可能にし得る。閲覧者が画像14Aと14Bとを一緒に見るとき、画像14Aと14Bとの間の水平視差は、閲覧者がS3D画像(すなわち、ディスプレイ12の後方またはディスプレイ12の前方にあるように見え3Dボリュームを包含する画像)を知覚することをもたらし得る。言い換えると、画像14Aは立体視ビューの左眼画像であり、画像14Bは立体視ビューの右眼画像である。
[0050]デバイス10のプロセッサ上で実行されるアプリケーションは、単一の画像(たとえば、モノビュー)を生成することができる。たとえば、アプリケーションを実行するプロセッサは、単一の画像の画像コンテンツを複数のプリミティブとして生成することができる。この単一の画像の画像コンテンツは、画像14Aおよび画像14Bの画像コンテンツと同様であり得る。加えて、アプリケーションを実行するプロセッサは、プリミティブの各頂点について、色、透明度、および座標値などのピクセル値を決定することができる。プリミティブのピクセル値は、画像データと呼ばれ得る。アプリケーションを実行するプロセッサは、画像データと、単一の画像をレンダリングするようにグラフィックス処理ユニット(GPU)に命令する命令とを、デバイス10のGPUに出力することができる。
[0051]本開示で説明される技法によれば、プロセッサは、単一の画像をレンダリングするようにGPUに命じる、GPUに対するコマンドを捕捉することができる。たとえば、プロセッサは、グラフィックスドライバまたはグラフィックスドライバラッパーを実行することができ、プロセッサは、グラフィックスドライバまたはグラフィックスドライバラッパーを介して、単一の画像をレンダリングするためのGPUに対するコマンドを捕捉することができる。例示を目的に、本技法は、グラフィックスドライバラッパーを実行するプロセッサによって実行されるものとして説明される。一般に、本技法は、説明を簡単にするために、様々な機能を実行するグラフィックスドライバラッパーを説明する。しかしながら、プロセッサは、グラフィックスドライバラッパーの実行を介して本技法を実施していることを理解されたい。
[0052]たとえば、グラフィックスドライバラッパーは、プロセッサ上で実行されるプログラムであり得る。グラフィックスドライバラッパーは、修正された命令がGPUに立体視ビューをレンダリングさせるように、グラフィックスドライバが受け取る命令またはグラフィックスドライバの出力先の命令を、修正することができる。したがって、本開示で説明される技法は、グラフィックスドライバに対する修正を何ら必要としないことがある。むしろ、プロセッサは、グラフィックスドライバラッパーを実行し、以前に開発されたグラフィックスドライバを実行することができる。しかしながら、本開示で説明される技法を実施するために、既存のグラフィックスドライバを修正すること、または新たなグラフィックスドライバを作成することが可能であり得る。
[0053]グラフィックスドライバラッパーを実行するプロセッサは、プロセッサによって発行されたコマンドを修正し、立体視ビュー(たとえば、画像14Aおよび画像14B)を形成する2つの画像をGPUにレンダリングさせることができる。加えて、グラフィックスドライバラッパーを実行するプロセッサは、GPU上で実行されるシェーダプログラム(たとえば、頂点シェーダ)の命令を修正することができる。たとえば、グラフィックスドライバラッパーは、修正された頂点シェーダが、GPU上で実行されると、プログラム上で実行されるアプリケーションによって生成された単一の画像中のピクセルの位置をずらすように、頂点シェーダの命令を修正することができる。グラフィックスドライバラッパーは、GPUに修正された頂点シェーダを2回実行させることができる。修正された頂点シェーダの1回目の実行では、修正された頂点シェーダは、単一の画像中のピクセルの位置をある向きにずらす。修正された頂点シェーダの2回目の実行では、修正された頂点シェーダは、単一の画像中のピクセルの位置を2回目の実行において別の向きにずらす。画像14Aは、頂点シェーダが単一の画像のピクセルをある向きにずらしたことで得られる画像であり得る。画像14Bは、頂点シェーダが単一の画像のピクセルを別の向きにずらしたことで得られる画像であり得る。
[0054]頂点シェーダの命令を修正する際、グラフィックスドライバラッパーを実行するプロセッサは、視線角度を考慮することができる。視線角度は、閲覧者がディスプレイ12を見ている角度である。たとえば、図1において、ディスプレイ12は、横向きモードにあると考えられ得る。閲覧者がディスプレイ12を正面で見ている(すなわち、閲覧者が自分の頭を傾けていない)場合、視線角度は0であると考えられ得る。しかしながら、閲覧者がデバイス10または自分の頭を傾けると、視線角度はもはや0ではなくなり得る。たとえば、閲覧者がデバイス10を縦向きモードとなるように回転する(たとえば、デバイス10を90°傾ける)と、視線角度は90°であり得る。
[0055]視線角度が横向きモードでは0であり、縦向きモードでは90°であることは、例示を目的に与えられており、限定的であると見なされるべきではないことを、理解されたい。本開示で説明される技法は、視線角度が縦向きモードで0となり横向きモードで90°となる、または横向きモードと縦向きモードの間の任意のモードで90°となる状況にも、適用され得る。
[0056]一般に、デバイス10のプロセッサは、視線角度を決定することができ、プロセッサは、プロセッサ上で実行されるグラフィックスドライバラッパーを介して、アプリケーションによってGPUに出力される命令と、GPU上で実行されるシェーダプログラムの命令とを、視線角度に基づいて修正することができる。グラフィックスドライバラッパーは、モノビューを形成する単一の画像ではなく立体視ビューを形成する2つの画像をGPUがレンダリングするように、命令を修正することができる。
[0057]図2は、様々な視線角度を示す概念図である。例示を目的に、図2は、閲覧者がデバイス10を傾け得る様々な角度を示す。しかしながら、本開示で説明される技法は、閲覧者がデバイス10を傾けないが自分の頭を傾ける例、またはこれらの2つの組合せにも、拡張可能であり得る。
[0058]大半の立体視3Dディスプレイは、デバイス方向についての制約とともに使用されなければならない。たとえば、ほとんどすべての3Dテレビは、横向きモードで見られる。これは、水平な面(TVキャビネット、机上など)での使用のために準備された多くのデバイスには理にかなっている。しかしながら、電話およびタブレットのようなハンドヘルドデバイスでは、閲覧者は、横向きモードと縦向きモードのいずれかで、またさらには任意の角度方向で、ディスプレイを見ることがある。
[0059]たとえば、位置18Aにおいて、デバイス10は横向きモードにある。説明を簡単にするために、図2は、デバイス10が横向きモードにあるときの、方向点16を示し、それはデバイス10の右上の角に位置する。閲覧者は、デバイス10を45°だけ(すなわち、位置18Aから位置18Bに)傾け得る。この場合、図2は、位置18Bにおける方向点16が、位置18Aの方向点に対して、右下の向きに移動したことを示す。この例では、視線角度は45°であると考えられ得る。
[0060]別の例として、閲覧者は、デバイス10を−45°だけ(すなわち、位置18Aから位置18Cに)傾け得る。この場合、図2は、位置18Cにおける方向点16が、位置18Aの方向点に対して、左上の向きに移動したことを示す。この例では、視線角度は−45°であると考えられ得る。閲覧者はデバイス10を任意の量だけ傾け得るので、視線角度は−180°から180°にわたり得る。
[0061]たとえば、横向きおよび縦向きは、2つの典型的なディスプレイモードである(たとえば、閲覧者は、横向きモアから縦向きモードへと、またはその逆方向にデバイス10を回転する)。これらの場合、デバイス10は、デバイス10が横向きモードにあるか縦向きモードにあるかを決定することができ、プロセッサは、グラフィックスドライバラッパーを介して、横向きモードまたは縦向きモードのための左眼画像と右眼画像とをGPUにレンダリングさせるように、命令を修正することができる。しかしながら、閲覧者は、横向きモードまたは縦向きモードだけではなく、任意の角度にデバイス10を向けることがある。したがって、プロセッサは、視線角度を考慮して、GPU上で実行される命令を修正する方式を決定することができる。
[0062]視線角度を決定するために様々な方法が存在し得る。たとえば、デバイス10は、横向きモードから縦向きモードへと切り替えるかどうかを決定するためにデバイス10が使用する、加速度計を含み得る。デバイス10はまた、適切な加速度の大きさと向きとを検出するための、単一軸モデルと複数軸モデルのいずれかの加速度計を含み得る。そのような加速度計は、重力の向きの変化に基づいて、方向を出力することができる。デバイス10のプロセッサは、出力された方向に基づいて、視線角度を決定することができる。
[0063]別の例として、デバイス10はジャイロスコープを含み得る。ジャイロスコープは、角運動量の保存の原理に基づいて方向の測定結果を与え得る。デバイス10のプロセッサは、ジャイロスコープによって与えられた方向の測定結果に基づいて、視線角度を決定することができる。消費者向け電子デバイスで使用される、電子式のマイクロチップにパッケージングされたMEMSジャイロスコープデバイスのような、他の動作原理に基づくジャイロスコープも存在する。ジャイロスコープは、加速度計よりも、3D空間内での運動のより正確な認識を提供することができる。
[0064]加速度計またはジャイロスコープの出力は、プロセッサが視線角度の理にかなった推定値を決定することを可能にし得る。しかしながら、視線角度の推定値は、閲覧者が特定の方式で方向付けられている、たとえば垂直に方向付けられている(たとえば、閲覧者が自分の頭を傾けていない)という仮定に基づき得る。言い換えると、加速度計またはジャイロスコープは、ディスプレイ方向の正確な測定結果を与え得、それは視線角度の理にかなった推定値を決定するのに十分であり得るが、閲覧者の方向の正確な測定結果を与えないことがある。
[0065]いくつかの例では、デバイス10のプロセッサが、閲覧者の方向(たとえば、閲覧者が垂直に方向付けられているかどうか、または閲覧者が自分の頭を傾けているかどうか)を決定することが可能であり得る。たとえば、ディスプレイ12とデバイス10のいずれかが、内蔵の前面カメラを含み得る。前面カメラによって、カメラプロセッサは、ディスプレイ12に対する閲覧者の目または閲覧者の頭の方向を検出することができる。デバイス10のプロセッサは、カメラプロセッサによって検出されるような、検出された目または頭の方向に基づいて、視線角度を決定することができる。
[0066]通常の光学カメラ以外に、他のセンサも、閲覧者の目または頭の方向を検出するように構成され得る。一般に、本開示で説明される技法は、ユーザの目または頭を検出することに必ずしも依存しない技法を含む、視線角度を決定するための任意の技法を利用することができる。本開示で説明される技法は、視線角度を決定するための上で説明された例に限定されるものと見なされるべきではない。
[0067]たとえば、本開示で説明される技法は、加速度計および/またはジャイロスコープの出力のみに基づいて、視線角度を決定することができる。別の例として、本開示で説明される技法は、ユーザの検出された目または頭のみに基づいて、視線角度を決定することができる。別の例として、本開示で説明される技法は、加速度計および/またはジャイロスコープの出力に基づいて、また、ユーザの検出された目または頭に基づいて、視線角度を決定することができる。別の例として、本技法は、加速度計および/またはジャイロスコープの出力に基づいて、また、ユーザの視線方向を決定するように構成される1つまたは複数の他のセンサに基づいて、視線角度を決定することができる。上記の任意の置換および組合せ、ならびに任意の他の技法が、視線角度を決定するために使用され得る。
[0068]図3は、閲覧者の目と頭の方向の検出を示す概念図である。図3において、デバイス10のディスプレイ12は、デバイス10のカメラによって撮影された顔を表示する。ディスプレイ12は、視線角度を決定するためにカメラによって撮影された画像を表示する必要はなく、図3は、説明を簡単にするために、カメラによって撮影された顔を表示するディスプレイ12を示すことを理解されたい。
[0069]図3に示されるように、デバイス10は横向きモードにあるが、閲覧者の頭は傾いている。この場合、デバイス10のカメラプロセッサは、目20Aおよび20Bの方向を検出し、目20Aおよび20Bの方向をデバイス10のプロセッサに送信することができる。目20Aおよび20Bの方向に基づいて、デバイス10のプロセッサは視線角度を決定することができる。本開示で説明される技法に従って、グラフィックスドライバラッパーは、決定された視線角度に基づいてGPU上で実行される命令を修正することができる。
[0070]図4は、視線角度の例を示す概念図である。図4において、視線角度はアルファ(α)と標識される。視線角度は、閲覧者の視線方向とディスプレイの方向との関係である。たとえば、アルファは、目の水平な向きとディスプレイの水平な向きによって形成される角度の尺度である。ディスプレイの水平な向きは、ディスプレイの方向に対する水平な面を指し、目の水平な向きは、閲覧者の目20Aおよび20Bの方向に対する水平な面を指す。図4では、閲覧者はディスプレイ12をまっすぐ見ている(たとえば、閲覧者の頭に傾きはない)。したがって、目の水平な向きは水平線である。図4では、デバイス10はある角度傾けられており、横向きモードまたは縦向きモードにはない。したがって、ディスプレイの水平な向きは、デバイス10に対しては水平であるが、目の水平な向きに対しては角度がつけられた線である。
[0071]図5は、本開示で説明される1つまたは複数の例示的な技法を実施し得るデバイスの例を示すブロック図である。たとえば、図5は、デバイス10をさらに詳細に示す。図5に示されるように、デバイス10は、アプリケーションプロセッサ22と、グラフィックス処理ユニット(GPU)30と、システムメモリ36と、1つまたは複数のセンサ42と、カメラプロセッサ44とを含み得る。デバイス10は、図5に示されるものに加えて、コンポーネントを含み得る。
[0072]その上、いくつかの例では、アプリケーションプロセッサ22、GPU 30、およびカメラプロセッサ44は、単一の回路パッケージ内に収容される共通の集積回路として形成され得る(たとえば、共通のプロセッサとして形成され得る)。しかしながら、本開示の態様はそのようには限定されず、アプリケーションプロセッサ22、GPU 30、およびカメラプロセッサ44の1つまたは複数は、別々の回路パッケージに収容された別々の集積回路であり得る。
[0073]1つまたは複数のセンサ42は、デバイス10の方向の測定結果をアプリケーションプロセッサ22に出力するように構成され得る。1つまたは複数のセンサ42の例は、加速度計とジャイロスコープとを含む。カメラプロセッサ44は、デバイス10のカメラ(図示されず)またはディスプレイ12のカメラ(図示されず)によって撮影された画像から画像データを受け取ることができる。本開示で説明される技法では、カメラは、ユーザの意図を伴わずに、バックグラウンドで、画像を継続的に撮影するように構成され得る。たとえば、撮影された画像は、表示される必要はなく、または後で取り出すために記憶される必要はない。撮影された画像から、カメラプロセッサ44は、閲覧者の方向を決定することができる。
[0074]カメラプロセッサ44は、閲覧者の方向を決定するために、閲覧者の目の方向を決定することができる。カメラプロセッサ44は、カメラプロセッサ44が閲覧者の目の方向を決定する際に用いる閲覧者の目を特定するために、任意の技法を実施することができる。多くの現在のカメラプロセッサは、閲覧者の目を特定するように構成され、これらの現在のカメラプロセッサは、カメラプロセッサ44の一例であり得る。
[0075]1つまたは複数のセンサ42は、デバイス10の方向の測定結果をアプリケーションプロセッサ22に出力することができる。カメラプロセッサ44は、閲覧者の方向の測定結果をアプリケーションプロセッサ22に出力することができる。アプリケーションプロセッサ22は、デバイス10の方向の測定結果および閲覧者の方向の測定結果に少なくとも一部基づいて、視線角度を決定することができる。たとえば、アプリケーションプロセッサ22は、デバイス10の方向と閲覧者の方向との間の角度となるように視線角度を決定することができる。より詳細に説明されるように、アプリケーションプロセッサ22は、頂点シェーダ38の命令を修正する方式を決定するために、視線角度を利用することができる。
[0076]カメラプロセッサ44は、あらゆる例において必須であるとは限らない。たとえば、アプリケーションプロセッサ22が視線角度を決定するには、デバイス10の方向の測定結果で十分であり得る。これらの例では、アプリケーションプロセッサ22は、視線角度の測定結果により事前構成され得る。アプリケーションプロセッサ22は、デバイス10の方向の測定結果および閲覧者の方向の事前構成された測定結果に基づいて、視線角度を決定することができる。別の例として、アプリケーションプロセッサ22は、1つまたは複数のセンサ42の出力を使用することなく、閲覧者の方向の測定結果に基づいて視線角度を決定することができる。この例では、アプリケーションプロセッサ22は、デバイス10の方向により事前構成され得る(たとえば、1つまたは複数のセンサ42の出力を使用しないとき、デバイス10の方向は横向きであると決定するように事前構成され得る)。
[0077]視線角度を決定するために1つまたは複数のセンサ42とカメラプロセッサ44とを利用することは、例示のみを目的に与えられており、限定するものと見なされるべきではない。アプリケーションプロセッサ22が視線角度を決定できる多くの他の方法があり、本開示で説明される技法はそのような他の技法に拡張可能である。
[0078]いくつかの例では、アプリケーションプロセッサ22は、閲覧者が視線角度を変更できるので、立体視ビューの生成ごとに1回、視線角度を決定することができる。たとえば、GPU 30は、立体視ビューの左眼画像と右眼画像のような、レンダリングされた画像を出力することができる。左眼画像と右眼画像の両方のすべての出力の後で、アプリケーションプロセッサ22は視線角度を決定することができる。別の例として、アプリケーションプロセッサ22は、視線角度を継続的に決定することができる。より詳細に説明されるように、アプリケーションプロセッサ22は、グラフィックスドライバラッパー26を介して、頂点シェーダ38が次の画像を処理するときに頂点シェーダ38がアプリケーションプロセッサ22によって決定されるような次の左眼画像および次の右眼画像のクリッピング座標を生成できるように、現在の決定された視線角度に基づいて頂点シェーダ38の命令を修正することができる。
[0079]アプリケーションプロセッサ22は、デバイス10の中央処理ユニット(CPU)であり得る。GPU 30は、ディスプレイ上での提示のためにグラフィックスデータを出力するように動作可能な処理ユニットであり得る。アプリケーションプロセッサ22、GPU 30、およびカメラプロセッサ44の例は、限定はされないが、デジタル信号プロセッサ(DSP)、汎用マイクロプロセッサ、特定用途向け集積回路(ASIC)、フィールドプログラマブル論理アレイ(FPGA)、または他の等価な集積回路もしくはディスクリート論理回路を含む。
[0080]いくつかの例では、GPU 30は、グラフィックス処理のために特に設計された特別なハードウェアであり得る。たとえば、グラフィックス処理は高速な並列処理を必要とすることがあり、GPU 30はそのような高速な並列処理のために特別に設計されることがある。GPU 30が、一般的な処理タスクのような、グラフィックス処理以外のタスクを実行することが可能であり得る。したがって、GPU 30は、汎用処理GPU(GPGPU)と見なされ得る。本開示で説明される技法は、GPU 30がグラフィックス関連のタスクのみを実行する例、またはGPU 30がGPGPUである例に適用され得る。
[0081]システムメモリ36は、コンピュータ可読記憶媒体の例であり得る。たとえば、システムメモリ36は、アプリケーションプロセッサ22とGPU 30とに、本開示において各々に起因する機能を実行させる命令を記憶し得る。システムメモリ36は、1つまたは複数のプロセッサ(たとえば、アプリケーションプロセッサ22またはGPU 30)に様々な機能を実行させる命令を備える、コンピュータ可読記憶媒体であると見なされ得る。
[0082]システムメモリ36の例は、限定はされないが、ランダムアクセスメモリ(RAM)、読取り専用メモリ(ROM)、電気的消去可能プログラマブル読取り専用メモリ(EEPROM(登録商標))、CD−ROMまたは他の光ディスクストレージ、磁気ディスクストレージもしくは他の磁気ストレージデバイス、フラッシュメモリ、または、命令もしくはデータ構造の形態の所望のプログラムコードを搬送または記憶するために使用されコンピュータもしくはプロセッサによってアクセスされ得る、任意の他の媒体を含む。システムメモリ36は、いくつかの例では、非一時的記憶媒体と見なされ得る。「非一時的」という用語は、記憶媒体が、搬送波または伝搬される信号で具現化されないことを示し得る。しかしながら、「非一時的」という用語は、システムメモリ36が非可動であることを意味するものと解釈されるべきでない。一例として、システムメモリ36は、デバイス10から取り外され、別のデバイスに移され得る。別の例として、システムメモリ36と実質的に同様のストレージデバイスが、デバイス10に挿入され得る。いくつかの例では、非一時的記憶媒体は、経時的に変化し得るデータを(たとえば、RAMに)記憶し得る。
[0083]GPU 30は、シェーダプロセッサ32と固定機能パイプライン34とを含み得る。シェーダコアと呼ばれることもあるシェーダプロセッサ32は、頂点シェーダおよびフラグメントシェーダのようなシェーダプログラムがその上で実行されるGPU 30のコアであり得る。固定機能パイプライン34は、固定された機能を実施するハードウェアユニットを含み得る。言い換えると、頂点シェーダおよびフラグメントシェーダのようなシェーダプログラムは、シェーダプロセッサ32上で実行され、機能的な柔軟性を可能にするソフトウェアユニットであってよく、固定機能パイプライン34は、固定された機能と最低限の機能的な柔軟性とを伴うハードウェアユニットを含む。
[0084]たとえば、GPUのいくつかの以前のバージョンは、グラフィックスパイプラインにおいて固定機能ユニットのみを含んでいた。GPU 30では、GPUの以前のバージョンの固定機能グラフィックスパイプラインは、頂点シェーダ38およびフラグメントシェーダのような頂点シェーダによって部分的に置き換えられる。たとえば、頂点シェーダ38は固定機能ユニットモデルビュー変換、照明、および投影のような機能を実行し得、それらはGPUの以前のバージョンでは固定機能ユニットによって実行されていた。フラグメントシェーダは、GPUの以前のバージョンにおいて、固定機能ユニットのフラグメント段階の機能を実行することができる。
[0085]本開示で説明される例示的な技法は、修正されたシェーダプログラムがシェーダプロセッサ32上で実行されると、GPU 30が視線角度に基づいてS3D画像(たとえば、立体視ビュー)のためのグラフィックスデータを生成するように、単一の3次元(3D)画像(たとえば、モノビューのための)を生成するように設計されたシェーダプログラムを修正することができる。やはり、上で論じられたように、立体視ビューは、左眼画像と右眼画像とを含む。左眼画像および右眼画像は、モノビュー画像と実質的に同様のグラフィックスコンテンツを含むが、左眼画像および右眼画像の1つまたは複数の対応するピクセルは、互いに対して、水平軸に沿ってずらされ得る。
[0086]たとえば、右眼画像が左眼画像の上に配置されることを考える。この場合、右眼画像中のコンテンツのすべてが、左眼画像中の同一のコンテンツに対して完全には整列しないことがある。むしろ、右眼における1つまたは複数の物体は、左眼画像における同一の物体の左または右にあり得る(たとえば、右眼画像における物体と左眼画像における物体との間に水平視差があり得る)。高品質の立体視効果のために、右眼画像における物体と左眼画像における物体との間には垂直視差はないことがある。
[0087]左眼画像は閲覧者の左眼によって閲覧可能であり、右眼画像は閲覧者の左眼から遮断される。右眼画像は閲覧者の右眼によって閲覧可能であり、左眼画像は閲覧者の右眼から遮断される。いくつかの例では、閲覧者は、左眼画像が右眼によって閲覧可能であることを阻止し、右眼画像が左眼によって閲覧可能であることを阻止する特殊な眼鏡を着用し得る。しかしながら、本開示の態様は、必ずしも、閲覧者に特殊な眼鏡を着用するように要求するとは限らない。たとえば、いくつかのディスプレイは、立体視ビューを体験するために、閲覧者に特殊な眼鏡を着用するように要求しない。本開示の技法は、そのようなディスプレイに拡張され得る。
[0088]GPU 30は、閲覧者が左眼画像と右眼画像の両方を同時に見るとき、2つの画像を表示しているディスプレイから飛び出し、またはディスプレイに押し込まれる(たとえば、ディスプレイの前または後にあるように見える)画像を、閲覧者の脳が閲覧者に知覚させるように、左眼画像および右眼画像のためのグラフィックスデータを生成することができる。この飛び出し、または押し込みは、閲覧者の脳が、実質的に同様のコンテンツを伴う立体視ビューの2つの画像における水平方向の不一致を解決することによる。たとえば、閲覧者の両眼視は、左眼画像と右眼画像の両方を同時に閲覧者に見させ、閲覧者は、奥行きを知覚することによって、左眼画像と右眼画像の水平視差を解決する。
[0089]ある例として、アプリケーションプロセッサ22は、システムメモリ36に記憶されたアプリケーション42のような、1つまたは複数のアプリケーションを実行し得る。アプリケーション32の例は、限定はされないが、ウェブブラウザ、ユーザインターフェース、eメールアプリケーション、表計算アプリケーション、文書処理アプリケーション、グラフィックス編集アプリケーション、ビデオゲーム、または可視オブジェクトを表示のために生成する他のアプリケーションを含む。たとえば、アプリケーション42は、実行されると、ディスプレイ上に表示されるグラフィカルコンテンツを出力するビデオゲームであってよい。
[0090]アプリケーション42は、モノビューのために開発者によって設計され得る。たとえば、アプリケーション42は、実行されると、3Dグラフィックスコンテンツを生成することができ、3Dグラフィックスコンテンツは、ディスプレイの2Dエリアに制限される。アプリケーション42は、アプリケーションプロセッサ22上で実行されると、生成された3Dグラフィックスコンテンツを、三角形、矩形、または他のタイプの多角形のようなプリミティブに分割し得る。これらのプリミティブの各々は、ディスプレイ上に表示されるべきピクセルを含み得る。たとえば、これらのプリミティブは、画像内の物体を形成し得る。アプリケーション42は、アプリケーションプロセッサ22上で実行されると、プリミティブの頂点の各々にピクセル値を割り当てることもできる。たとえば、ピクセル値は、頂点の3D座標と、頂点の色値と、頂点の透明度値とを含み得る。ピクセル値は、本開示のすべての態様において、上記の例示的な成分のすべてを含む必要はない。
[0091]アプリケーションプロセッサ22は次いで、頂点のピクセル値を、さらなる処理のためにGPU 30に転送することができる。たとえば、アプリケーションプロセッサ22は、グラフィックスドライバ24を含み得、それはアプリケーションプロセッサ22上で実行されるソフトウェアであり得る。アプリケーションプロセッサは、グラフィックスドライバ24を介して、コマンドをGPU 30に送るように構成されてよく、それに応答して、GPU 30は、受け取られたコマンドに従って機能を実行し得る。たとえば、グラフィックスドライバ24は、GPU 30とアプリケーションプロセッサ22との間のインターフェースとして機能する。アプリケーションプロセッサ22がコマンドをGPU 30に発行するとき、GPU 30がコマンドを受信するのは、グラフィックスドライバ24を通してである。たとえば、アプリケーションプロセッサ22上で実行されるアプリケーション42は、GPU 30に、特定のタスクを実行するように命令し得る。この場合、グラフィックスドライバ24は、アプリケーション42から特定のタスクのための命令を受け取ることができ、アプリケーションプロセッサ22は、その命令をGPU 30に与えることができる。それに応答して、GPU 30はタスクを実行することができる。
[0092]いくつかの例では、グラフィックスドライバ24は、特定のアプリケーションプログラミングインターフェース(API)に従って設計され得る。たとえば、グラフィックスドライバ24は、OpenGLまたはOpenGL ES(組込みシステム)APIに従って設計され得、それらは、KhronosグループのAPIであり、それらの仕様は公的に入手可能である。しかしながら、本開示の技法は、DirectX 9、10、もしくは11のようなMicrosoft DirectXシステム、または任意の他のシェーダベースのグラフィックスシステムおよびAPIにも拡張可能であり得る。説明のために、本開示の技法は、APIがOpenGL ES 2.0 APIである文脈において説明される。しかしながら、本開示の態様はそのようには限定されず、他のAPIまたはシェーダベースのグラフィックスシステムにも拡張され得る。
[0093]アプリケーションプロセッサ22から受け取られたプリミティブをレンダリングするために、GPU 30のシェーダプロセッサ32は、頂点シェーダおよびフラグメントシェーダのような、1つまたは複数のシェーダプログラムを実行して、ディスプレイのピクセルのピクセル値を生成することができる。開発者は、これらの頂点シェーダとフラグメントシェーダとを、本開示において説明の目的で使用されるOpenGL ES 2.0 APIのようなAPIに従って、開発することができる。これらの頂点シェーダおよびフラグメントシェーダに関するソースコードは、システムメモリ36に記憶され得る。
[0094]たとえば、アプリケーション42は、頂点シェーダ38を利用し得、それはアプリケーション42によって生成されるモノビューの画像に対して動作するように構成され得る。アプリケーション42によって生成されたモノビューの画像のピクセル値は、頂点シェーダ38を使用して、シェーダプロセッサ32によって処理される必要があり得る。一例として、頂点シェーダ38は、アプリケーションプロセッサ22上でのアプリケーション42の実行中にアプリケーション42によって特に呼び出される頂点シェーダであり得る。頂点シェーダ38は、GPU 20のシェーダプロセッサ32上で実行され得、アプリケーション42は、アプリケーションプロセッサ22上で実行され得るが、頂点シェーダ38およびアプリケーション42は、アプリケーション42によって生成された画像を表示する目的のために、相互に関係し得る。
[0095]頂点シェーダ38のソースコードは、システムメモリ36に記憶され得る。アプリケーションプロセッサ22は、グラフィックスドライバ24を介して、頂点シェーダ38のソースコードを取り出し、頂点シェーダ38のためのソースコードをコンパイラ28に与えることができる。コンパイラ28は、頂点シェーダ38のソースコードをコンパイルして、頂点シェーダ38のオブジェクトコードを生成し、オブジェクトコードをシステムメモリ38に記憶することができる。アプリケーションプロセッサ22は、グラフィックスドライバ34を介して、GPU 30に、頂点シェーダ38のオブジェクトコードをシステムメモリ36から取り出すよう命令し、GPU 30に、頂点シェーダ 38のオブジェクトコードをシェーダプロセッサ32上で実行するよう命令することができる。シェーダプロセッサ32は次いで、頂点シェーダ38のオブジェクトコードを実行して、アプリケーション42の実行によって生成された、頂点のピクセル値を処理することができる。GPU 30は、固定機能パイプライン34およびシェーダプロセッサ32とともに、表示用のアプリケーション42のためのグラフィックスコンテンツを生成することができる。
[0096]システムメモリ36は、ただ1つの頂点シェーダ38のためのソースコードを記憶するように示されているが、本開示の態様は、そのようには限定されない。たとえば、アプリケーション42は、場合によっては、複数の異なる頂点シェーダを利用することができ、これらの頂点シェーダの各々のためのソースコードは、システムメモリ36に記憶され得る。たとえば、頂点シェーダは、コンテンツに依存するもの、またさらにはシーンに依存するものであってよく、アプリケーション42は、レンダリングされるべき画像のコンテンツまたはシーンに基づいて特定のシェーダを利用することができる。また、アプリケーション42は、頂点シェーダ38の複数のインスタンス化の実行を要求し得る。たとえば、シェーダプロセッサ32は、頂点シェーダ38の複数のインスタンス化を同時に(たとえば、並行して)実行することができ、この場合、頂点シェーダ38の各インスタンス化は、実質的に同様の機能を、しかし異なるピクセル値に対して実行する。システムメモリ36は同様に、フラグメントシェーダに関するソースコードを記憶することができる。グラフィックスドライバ34は、フラグメントシェーダに関するソースコードを取り出すことができ、コンパイラ28は、ソースコードをコンパイルして、フラグメントシェーダに関するオブジェクトコードを、頂点シェーダ38について上で説明されたのと同様の方式で生成することができる。
[0097]さらに詳細に説明されるように、本開示の1つまたは複数の例示的な技法は、コンパイルの前に、視線角度に基づいて頂点シェーダ38(たとえば、頂点シェーダ38のソースコード)を修正することができる。コンパイラ28は、修正されたソースコードをコンパイルして、修正された頂点シェーダ40のオブジェクトコードを生成することができる。シェーダプロセッサ32は、修正された頂点シェーダ40のオブジェクトコードを実行することができ、このことは、GPU 30に、立体視3Dグラフィックスコンテンツ(たとえば、S3Dの左眼画像および右眼画像用のグラフィックスコンテンツ)を生成させ得る。しかしながら、頂点シェーダ38に対する修正について説明する前に、以下では、頂点シェーダ38の例示的な機能を説明し、この説明は、頂点シェーダ38のソースコードに適用される修正の理解を助け得る。さらに、本開示では、「コマンド」と「命令」という用語は互換的に使用され得る。
[0098]上で説明されたように、アプリケーションプロセッサ22は、アプリケーション42を介して、プリミティブの頂点の座標を生成することができる。これらの座標は、ワールド座標と呼ばれることがあり、アプリケーション42に固有であり得る。言い換えると、アプリケーション42によって定義された頂点の座標は、必ずしも、その上にプリミティブが表示されるディスプレイの座標であるとは限らないことがあり、場合によっては、可視領域の外部にある頂点の座標であり得る。頂点シェーダ38は、3Dであり得るワールド座標を、ディスプレイの2D座標(たとえば、ディスプレイ座標)に変換するように設計され得る。この機能を実行するために、頂点シェーダ38は、ワールド座標を視点座標に、次いで、クリッピング座標に変換することができる。たとえば、頂点シェーダ38の出力は、実行されるとき、頂点のクリッピング座標であり得る。最終的なディスプレイ座標(たとえば、ディスプレイの座標)は、その後、固定機能パイプライン34の一部として決定され得る。
[0099]クリッピング座標は視錐台(view frustum)を定義し得る。視錐台は、3Dグラフィックスコンテンツの可視領域を定義し得る。GPU 30は、視錐台の外部に存在するピクセルを選別するために、視錐台を利用し得る。たとえば、固定機能パイプライン34の固定機能ユニット(たとえば、固定機能パイプライン24の錐台(frustum)ユニット)は、頂点シェーダ38によって生成されたクリッピング座標によって定義されるような、視錐台の外にあるピクセルを選別することができる。
[0100]ワールド座標からクリッピング座標を計算する式は、次の通りであり得る。
上式で、Vclipは頂点クリップ座標であり、Veyeは頂点視点座標であり、Vworldは、アプリケーション42によって与えられる頂点ワールド座標であり、PRJは投影行列であり、MVTはモデルビュー変換行列(またはワールドビュー変換行列)である。いくつかの例では、PRJおよびMVT行列は、単一の行列へと組み合わされ得る。しかしながら、理解しやすくするために、これらの行列は別々に記述される。
[0101]投影行列(PRJ)およびモデルビュー、またはワールドビュー、変換行列(MVT)は、APIによって定義され得る。モデルビューおよびワールドビューという用語は、互換的に使用され得る。Vclip、Veye、およびVworldは、4つの成分(たとえば、x座標、y座標、z座標、およびw座標)を含み得る。
[0102]Vclip行列、Veye行列、およびVworld行列は、次のように表され得る。
[0103]プログラマブルシェーダを伴うOpenGL、OpenGL ES、およびOpenGL ES 2.0 APIは、PRJ行列を次のように定義する。
上式で、LおよびRは、それぞれ、左および右の垂直クリッピング面のための座標を規定し、BおよびTは、それぞれ、下および上の水平クリッピング面のための座標を規定し、znearおよびzfarは、それぞれ、近深度クリッピング面および遠深度クリッピング面までの距離を規定する。
[0104]いくつかの例では、クリッピング面は対称的であってよい。たとえば、−LはRに等しくてよく、−BはTに等しくてよい。これらの例では、PRJ行列は次のように簡略化され得る。
[0105]プログラマブルシェーダを伴うOpenGL、OpenGL ES、およびOpenGL ES 2.0 APIは、MVT行列を次のように定義する。
[0106]PRJ行列およびMVT行列の変数はすべて、アプリケーションプロセッサ22上で実行されるアプリケーション42によって定義されてよく、グラフィックスドライバ24は、これらの変数を、頂点シェーダ38のオブジェクトコードを実行しているシェーダプロセッサ32に与えることができる。これらの変数を有する式1、4、および5から理解され得るように、頂点シェーダ38は、頂点の各々のVclip座標を決定することができる。GPU 30は、頂点のクリップ座標を利用し、固定機能パイプライン34およびフラグメントシェーダの機能とともに、さらなる機能を実行して、画像を表示のためにレンダリングすることができる。このようにして、GPU 30は、アプリケーション42によって生成されたグラフィックスコンテンツのためのモノビューを生成することができる。
[0107]本開示の技法によると、頂点シェーダ38は、MVT行列およびPRJ行列のための変数を使用して、Vclip座標を決定することができるが、MVT行列およびPRJ行列は、立体ビューを生成するように頂点シェーダ38を修正する(たとえば、頂点シェーダ38のソースコードを修正する)のに必要とされないことがある。言い換えると、本開示で説明される技法が修正する命令は、MVT行列およびPRJ行列の特定の値を必要としないことがある。
[0108]たとえば、頂点シェーダ38を設計するための多くの方法があってよく、頂点シェーダ38は、コンテンツ開発者が頂点シェーダ38をプログラムするために多くの異なる方法を利用することを可能にする、コンテンツに依存したもの、さらにはシーンに依存したものであり得る。したがって、MVT行列およびPRJ行列が開発者によって定義される具体的な方法を決定することは可能ではないことがある。しかしながら、本開示で説明される技法は、開発者が頂点シェーダ38を開発した方式、または開発者がMVT行列とPRJ行列とを定義した方式についての知識を必要としない。
[0109]上の例は、モノビューのVclip座標を決定するための1つの方法を説明する。クリッピング座標を計算するための多くの異なる技法があってよく、一般に、クリッピング座標を計算するのに利用される具体的な技法は重要ではないことがある。しかしながら、いずれにしても、3Dグラフィックスコンテンツの場合、クリッピング座標(Vclip)は、クリッピング座標を計算するのに使用される技法にかかわらず、計算される必要があり得る。たとえば、アプリケーションプロセッサ22がクリッピング座標を決定することさえも可能であってよく、グラフィックスドライバ24は、頂点シェーダ38のオブジェクトコードを実行しているシェーダプロセッサ32にクリッピング座標を与えることができる。この例では、PRJ行列およびMVT行列は、単位行列であり得る。たとえば、アプリケーションプロセッサ22は、式1の行列乗算を実行し、結果をシェーダプロセッサ32に与えることができる。この例では、シェーダプロセッサ32は、受け取られた値を単位行列で乗算して、アプリケーション42によって生成された頂点の各々のVclip座標を生成することができる。
[0110]しかしながら、いずれの場合にも(たとえば、頂点シェーダ38を実行するシェーダプロセッサ32がクリッピング座標を決定する場合、または頂点シェーダ38を実行するシェーダプロセッサ32がクリッピング座標を受け取る場合)、頂点シェーダ38は、クリッピング座標を記憶するために固有の変数を利用することができる。固有の変数は、頂点シェーダ38がそのために設計されるAPIに特有であり得る。たとえば、頂点シェーダ38が、プログラマブルシェーダとともにOpenGL、OpenGL ES、またはOpenGL ES 2.0 APIに従って設計される場合、頂点シェーダ38は、クリッピング座標をgl_Position変数に記憶することができる。gl_Position変数は自動的に宣言され得る。他のグラフィックスAPIにも、同様の変数があり得る。頂点シェーダ38が、プログラマブルシェーダとともに、OpenGL、OpenGL ES、またはOpenGL ES 2.0 APIに従って設計される場合、頂点シェーダ38は、gl_Position.x=x
clip、gl_Postion.y=y
clip、gl_Position.z=z
clip、およびgl_Position.w=w
clipのような命令を含んでよく、ここで、式2において上で示されたように、
である。
[0111]本開示で説明される1つまたは複数の例示的な技法において、アプリケーションプロセッサ22上で実行されるソフトウェアであり得るグラフィックスドライバラッパー26は、モノビューのクリッピング座標を定義する頂点シェーダ38の命令を、立体視ビューのクリッピング座標(たとえば、左眼画像のクリッピング座標および右眼画像のクリッピング座標)を定義するように修正することができる。たとえば、グラフィックスドライバラッパー26は、アプリケーションプロセッサ22から決定された視線角度を受け取ることができる。アプリケーションプロセッサ22は、グラフィックスドライバラッパー26の実行が原因で、立体視ビューのクリッピング座標を定義するように、アプリケーションプロセッサ22によって決定された視線角度に基づいて頂点シェーダ38の命令を修正するように構成され得る。
[0112]たとえば、頂点シェーダ38の修正された命令がシェーダプロセッサ32によって初めて実行されるときに、頂点シェーダ38の修正された命令が視線角度に基づいてある向きにクリッピング座標をずらし、頂点シェーダ38の修正された命令がシェーダプロセッサ32によって2回目に実行されるときに、頂点シェーダの修正された命令が視線角度に基づいて別の向きに同じクリッピング座標をずらすように、アプリケーションプロセッサ22は、グラフィックスドライバラッパー26を介して、頂点シェーダ38の命令を修正することができる。しかしながら、クリッピング座標を異なる向きに単にずらすこと、および得られる画像をレンダリングすることは、立体視ビューを、ある一定の量だけディスプレイ12から常に飛び出るように、またはディスプレイ12へと常に押し込まれるようにし得る。そのような結果は、閲覧者にとって快適ではないことがある。
[0113]たとえば、立体視ビューがディスプレイ12から飛び出すことを仮定する。この場合、閲覧者は、ディスプレイ12の前方のある距離にある平面上で、立体視ビューを知覚し得る。閲覧者が立体視ビューを知覚するこの平面は、ゼロ視差平面(ZDP)と呼ばれ得る。しかしながら、閲覧者は、現在のゼロ視差平面とは異なる距離において、ゼロ視差平面を知覚することを望むことがある。
[0114]ゼロ視差平面の調整のために、アプリケーションプロセッサ22は、グラフィックスドライバラッパー26を介して、左眼画像と右眼画像との間の水平視差を、増やし、または減らし得る。たとえば、アプリケーション42は、単一の画像のビューポートを定義するコマンドを出力し得る。「ビューポート」という用語は、画像がディスプレイ12上で包含するエリアを指す。たとえば、アプリケーション42は、ディスプレイ12上の単一の画像(たとえば、モノビュー)のサイズと位置とを定義し得る。単一の画像のサイズおよび位置のこの定義は、単一の画像のためのビューポートと見なされ得る。ビューポートを定義するために、アプリケーションプロセッサ22は、アプリケーション42を介して、ディスプレイ12上でのモノビュー画像のサイズと位置とをその変数が定義する、glViewportコマンドを発行することができる。アプリケーションプロセッサ22は、グラフィックスドライバラッパー26を介して、視線角度に基づいて、単一の画像のサイズと位置とを定義するコマンド(たとえば、アプリケーション32によって発行されたglViewportコマンド)を、左眼画像および右眼画像のサイズと位置とを定義するコマンド(たとえば、左眼画像のためのビューポートと、右眼画像のためのビューポートとを定義するglViewportコマンド)に修正することができる。左眼画像のためのglViewportコマンドは、視線角度に基づいて左眼画像をディスプレイの一部分に制限することができ、右眼画像のためのglViewportコマンドは、視線角度に基づいて右眼画像をディスプレイの別の部分に制限することができる。これらの2つの部分が少なくとも部分的に重複することが可能であり得る。
[0115]いくつかの例では、アプリケーションプロセッサ22は、グラフィックスドライバラッパー26を介して、左眼画像と右眼画像との間の水平視差を、増やし、または減らすように、glViewportコマンドを修正することができる。たとえば、左眼画像がある部分に制限され、右眼画像が別の部分に制限されるとき、左眼画像中の同様の物体のすべてと右眼画像中の同様の物体のすべてとの間に、ある固定された水平視差があり得る。言い換えると、左眼画像および右眼画像における対応する頂点の各々の間の水平視差の量は、同じであり得る。説明のための例として、アプリケーション42によって生成される画像はボールとブロックとを含んでいたと仮定する。この例では、左眼画像中のボールの頂点と右眼画像中のボールの頂点との間の水平視差は、左眼画像中のブロックの頂点と右眼画像中のブロックの頂点との間の水平視差と同じであり得る。したがって、得られる立体視ビュー、ボールおよびブロックは、ゼロ視差平面に現れることがあり、ゼロ視差平面はディスプレイ12の前または後にある。ボールおよびブロックがゼロ視差平面に現れるとき、そのボールおよびブロックは、ゼロ視差平面に押し込まれているように、またはゼロ視差平面から飛び出しているようには見えないことがある。
[0116]ゼロ視差平面の位置(たとえば、ゼロ視差平面がディスプレイ12に対してどの程度の量だけ前または後にあるか)を調整するために、アプリケーションプロセッサ22は、グラフィックスドライバラッパー26を介して、左眼画像中の同様の物体と右眼画像中の同様の物体との間の水平視差を閲覧者が定義することを可能にするように、glViewportコマンドの命令を修正することができる。たとえば、閲覧者は、左眼画像中の同様の物体と右眼画像中の同様の物体との間の水平視差を定義する、水平視差値を与えることができる。
[0117]このようにして、閲覧者はさらに、左眼画像中のすべての同様の物体と右眼画像中のすべての同様の物体が水平方向にずらされる量を定義できるので、閲覧者は、左眼画像と右眼画像との間の水平視差を定義するものと見なされ得る。上で説明されたように、左眼画像と右眼画像との間の水平視差の量は、立体視ビューがその分だけディスプレイ12の前または後にあるように見える量を定義する。したがって、左眼画像と右眼画像との間の水平視差を定義することによって、閲覧者は、ゼロ視差平面の位置を定義することができる。
[0118]いくつかの例では、閲覧者が左眼画像と右眼画像との間の水平視差を定義する代わりに、アプリケーションプロセッサ22が、左眼画像と右眼画像との間の水平視差を推定することができる。一例として、アプリケーションプロセッサ22またはグラフィックスドライバラッパー26は、左眼画像と右眼画像との間の水平視差を、増やし、または減らすためにグラフィックスドライバラッパー26が使用する、水平視差値によってプリロードされ得る。この水平視差値は、閲覧者が一般にディスプレイ12を見るときのディスプレイ12からの一般的な距離の仮定に基づき得る。たとえば、デバイス10がモバイルデバイスである例では、大半の閲覧者は、自分の顔からほぼ同じ距離において、デバイス10を持つ。したがって、大半の閲覧者は、ディスプレイ12からほぼ同じ距離だけ前方に、ゼロ視差平面が現れることを好み得る。アプリケーションプロセッサ22またはグラフィックスドライバラッパー26は、ディスプレイ12から一般に好まれる距離だけ前方にあるゼロ視差平面を作成する、水平視差値によってプリロードされ得る。
[0119]別の例として、カメラプロセッサ44は、ディスプレイ12からの閲覧者の距離の推定値を決定するように構成され得る。たとえば、カメラプロセッサ44は、閲覧者の頭を特定することができ、頭のサイズの測定結果に基づいて、カメラプロセッサ44は、ディスプレイ12に対する閲覧者の距離を推定することができる。この例では、アプリケーションプロセッサ22は、水平視差値を決定するために閲覧者の距離のこの推定値を利用することができ、水平視差値は、左眼画像と右眼画像との間の水平視差の量を定義する。
[0120]本開示で説明される技法では、glViewportコマンドは、頂点シェーダ38の命令ではなくてよい。むしろ、固定機能パイプライン34のビューポート変換ユニットは、glViewportコマンドに基づいて、左眼画像をある部分へと制限し、右眼画像を別の部分へと制限することができる。これらの例では、GPU 30は、ゼロ視差平面がディスプレイ12に対して所望の位置にあるように、視線角度に基づいて左眼画像をディスプレイ12のある部分に制限し、視線角度に基づいて右眼画像をディスプレイ12の別の部分に制限するために、glViewportコマンドを固定機能パイプライン34のビューポート変換ユニットに提供することができる。
[0121]glViewportコマンドの修正の上の例では、アプリケーションプロセッサ22は、グラフィックスドライバラッパー26を介して、閲覧者が所望のゼロ視差平面において立体視ビューを知覚するように、左眼画像と右眼画像との間の水平視差を定義することができる。いくつかの例では、同様の物体の間の水平視差を閲覧者が異なる量だけ増やしまたは減らすことを可能にすることによって、さらに良好な閲覧体験が実現され得る。たとえば、glViewportコマンドの修正において、アプリケーションプロセッサ22は、グラフィックスドライバラッパー26を介して、左眼画像中の同様の物体と右眼画像中の同様の物体が同じ量だけずらされるように、glViewportコマンドを修正することができる。このことは、立体視ビューがゼロ視差平面においてディスプレイ12の前または後に現れることをもたらす。しかしながら、閲覧者はまた、一部の物体をゼロ視差平面の前に出現させ、一部の物体をゼロ視差平面の後に出現させ、一部の物体をゼロ視差平面に出現させることを望むことがある。
[0122]いくつかの例では、閲覧者またはアプリケーションプロセッサ22がゼロ視差平面の位置を定義する水平視差値を決定するのではなく、閲覧者がゼロ視差平面の位置を定義することができ、または、プロセッサ22がゼロ視差平面の位置を決定することができる。これらの例では、アプリケーションプロセッサ22は、グラフィックスドライバラッパー26を介して、glViewportコマンドを2回、すなわち左眼画像に対して1回、および右眼画像に対してもう1回実行させるため以外に、アプリケーション42によって発行されるglViewportコマンドを修正する必要は必ずしもないことがある。むしろ、アプリケーションプロセッサ22は、グラフィックスドライバラッパー26を介して、アプリケーション42によって出力されるプリミティブの頂点が左眼画像および右眼画像において異なる量だけずらされるように、頂点シェーダ38の命令をさらに修正することができる。
[0123]たとえば、グラフィックスドライバラッパー26がglViewportコマンドを修正する例では、グラフィックスドライバラッパー26は、画像レベルで水平視差(たとえば、右眼画像と左眼画像との間の水平視差)を定義するものとして見なされ得る。たとえば、グラフィックスドライバラッパー26は、2つのglViewportコマンド、すなわち、視線角度に基づいて左眼画像をある部分に制限するための1つのコマンドと、視線角度に基づいて右眼画像を別の部分に制限するためのもう1つのコマンドとを、作成することができる。たとえば、アプリケーション42は、単一の画像のビューポートを定義するglViewportコマンドを発行し得る。グラフィックスドライバラッパー26は、左眼画像のビューポートを1回目の実行インスタンスにおいて定義するようにアプリケーション42によって発行されたglViewportコマンドを修正し、右眼画像のビューポートを2回目の実行インスタンスにおいて定義するようにアプリケーション42によって発行されたglViewportコマンドを修正することができる。
[0124]アプリケーションプリミティブ22がグラフィックスドライバラッパー26を介して頂点シェーダ38の命令をさらに修正する例では、グラフィックスドライバラッパー26は、頂点レベルで水平視差(たとえば、左眼画像における頂点と右眼画像における頂点との間の水平視差)を定義するものとして見なされ得る。したがって、視差を調整するために頂点シェーダ38の命令を修正することは、視差を調整するためにglViewportコマンドの命令を修正することと比較して、より精密なレベルの視差の調整を行うことができる。グラフィックスドライバラッパー26が頂点シェーダ38の命令をさらに調整する例では、GPU 30は、左眼画像および右眼画像のためのビューポートを定義するために、アプリケーション42によって発行されたglViewportコマンドを利用することができる(たとえば、glViewportコマンドの修正は必要とされないことがある)。たとえば、グラフィックスドライバラッパー26は、glViewportコマンドを2回、すなわち、左眼画像と右眼画像の各々に対して1回ずつ実行させ得る。しかしながら、この例では、グラフィックスドライバラッパー26は、アプリケーション42によって発行されたglViewportコマンドを修正しなくてよく、一部の物体がゼロ視差平面の前に現れ、一部の物体がゼロ視差平面より後に現れ、一部の物体がゼロ視差平面において現れるように、頂点が異なる量だけずらされることを、頂点シェーダ38の命令に対する追加の修正が可能にし得る。
[0125]たとえば、アプリケーション42は、3次元(たとえば、x、y、z、w座標)においてプリミティブの頂点を定義することができ、w座標は同次座標である。本開示で説明される技法では、アプリケーション22は、グラフィックスドライバラッパー26を介して、頂点が左眼画像および右眼画像においてずらされる量を決定するために、頂点のz座標の値を利用することができる。たとえば、z座標の値がz視差平面の位置に等しい場合、頂点シェーダ38の修正された命令は、左眼画像および右眼画像において頂点をずらさなくてよい。しかしながら、z座標の値がz視差平面の位置に等しくない場合、頂点シェーダ38の修正された命令は、左眼画像および右眼画像において頂点の位置をずらすことができる。頂点シェーダ38の修正された命令が頂点の位置をずらす量は、z座標の値に基づき得る。
[0126]グラフィックスドライバラッパー26が画像レベルにおいて視差を調整するためにglViewportコマンドを修正する例では、グラフィックスドライバラッパー26はさらに、頂点レベルにおいて視差を調整するために頂点シェーダ38の命令を修正しなくてよい。グラフィックスドライバラッパー26が頂点レベルにおいて視差を調整するために頂点シェーダ38の命令をさらに修正する例では、グラフィックスドライバラッパー26は、画像レベルにおいて視差を調整するためにglViewportコマンドを修正しなくてよい。しかしながら、本開示の態様はそのようには限定されず、グラフィックスドライバラッパー26が、画像レベルにおいて視差を調整するためにglViewportコマンドを修正することと、頂点レベルにおいて頂点の間の視差を調整するために頂点シェーダ38の命令をさらに修正することとの両方を行うことが、可能であり得る。
[0127]また、グラフィックスドライバラッパー26がゼロ視差平面の位置を調整するためにglViewportコマンドのみを修正するとき、ゼロ視差平面に対して物体がどこに現れるかの位置(たとえば、ゼロ視差平面の前、ゼロ視差平面において、またはゼロ視差平面の後)を調整するためにグラフィックスドライバラッパー26が頂点シェーダ38の命令をさらに修正するときよりも速く、GPU 30は、立体視ビューをレンダリングすることが可能であり得る。これは、固定機能パイプライン34のビューポート調整ユニットが左眼画像および右眼画像のビューポートを調整する場合と比較して、頂点シェーダ38がシェーダプロセッサ32上で実行するのに長くかかるからであり得る。しかしながら、グラフィックスドライバラッパー26がさらに、ゼロ視差平面に対して物体がどこに現れるかの位置を調整するために頂点シェーダ38の命令を修正するとき、レンダリングされる立体視ビューは、グラフィックスドライバラッパー26がglViewportコマンドを修正するときと比較してより良好な閲覧者体験を提供することができる。これは、頂点シェーダ38に対する命令のさらなる修正は、一部の物体がゼロ視差平面の前に、ゼロ視差平面において、またはゼロ視差平面の後に現れることを可能にする一方で、glViewportコマンドに対する修正では、すべての物体が、ゼロ視差平面に現れる得、それはディスプレイ12の前または後であり得る。
[0128]glViewportコマンドを修正すべきか、頂点シェーダ38の命令をさらに修正すべきかは、設計選択の問題であり得る。たとえば、レンダリング時間が重要な因子である場合は、アプリケーションプロセッサ22は、グラフィックスドライバラッパー26を介して、glViewportコマンドを修正することができる。より理想的な閲覧体験が重要な因子である場合は、アプリケーションプロセッサ22は、グラフィックスドライバラッパー26を介して、頂点シェーダ38の命令をさらに修正することができる。
[0129]したがって、グラフィックスドライバラッパー26は、頂点シェーダ38の修正された命令がオブシェーダプロセッサ32を実行するときに、GPU 30が視線角度に基づいてある向きに、また、視線角度に基づいて別の向きにプリミティブの頂点をずらすことができるように、頂点シェーダ38の命令を修正することができる。いくつかの例では、グラフィックスドライバラッパー26はさらに、頂点シェーダ38のさらなる修正された命令がシェーダプロセッサ32上で実行されるときに、GPU 30が視線角度に基づいて、また、ゼロ視差平面に基づいてある向きにプリミティブの頂点をずらすことができるように、頂点シェーダ38の命令を修正することができる。いくつかの例では、グラフィックスドライバラッパー26は、固定機能パイプライン34のビューポート変換ユニットがゼロ視差平面の位置を調整するために左眼画像と右眼画像との間の水平視差を増やし、または減らすように、アプリケーション42によって発行されたglViewportコマンドの命令を修正することができる。
[0130]以下は、モノビューを生成するアプリケーション42からの立体視ビューをGPU 30にレンダリングさせるためにアプリケーションプロセッサ22、GPU 30、およびシステムメモリ36が一緒に機能し得る例示的な方式を説明する。たとえば、アプリケーションプロセッサ22は、1つまたは複数のセンサ42およびカメラプロセッサ44からの1つまたは複数の出力に基づいて、視線角度を決定することができる。一例として、アプリケーションプロセッサ22は、左眼画像と右眼画像の両方のGPU 30によるレンダリングごとに1回(すなわち、立体視ビューの生成ごとに1回)のように、定期的に視線角度を決定することができる。グラフィックスドライバラッパー26は、アプリケーション42によって発行された命令を修正して頂点シェーダ38の命令を修正するために、この決定された視線角度を利用することができる。
[0131]たとえば、GPU 30に画像をレンダリングさせるために、アプリケーションプロセッサ22は、アプリケーション42のglShaderSourceコマンドを実行することができる。glShaderSourceコマンドは、グラフィックスドライバ24に、システムメモリ36から頂点シェーダ38のソースコードを取り出すよう命令する。本開示の例では、アプリケーション42によって発行されたglShaderSourceコマンドに応答して、グラフィックスドライバラッパー26は、頂点シェーダ38のソースコードを、グラフィックスドライバ24に届く前に途中で捕えることができる。アプリケーションプロセッサ22は、グラフィックスドライバラッパー26を介して、頂点シェーダ38のソースコードを、実行されると修正された頂点シェーダ38に、アプリケーションプロセッサ22によって決定された視線角度に基づいて立体視ビューのためのグラフィックスコンテンツを生成させる命令を含むように、修正することができる。たとえば、グラフィックスドライバラッパー26は、修正された頂点シェーダ38を2回実行させることができる。1回目の実行において、修正された頂点シェーダ38は、視線角度に基づいて左眼画像のためのグラフィックスコンテンツを生成することができ、2回目の実行において、修正されたシェーダ38は、視線角度に基づいて右眼画像のためのグラフィックスコンテンツを生成することができ、または逆も同様である。加えて、いくつかの例では、グラフィックスドライバラッパー26はさらに、ゼロ視差平面の位置に基づいて頂点の位置を決定するために、頂点シェーダ38の命令を修正することができる。
[0132]グラフィックスドライバラッパー26は、アプリケーションプロセッサ22によって実行されると、ソースコードエディタとして機能し得る。一例として、グラフィックスドライバラッパー26は、アプリケーション42によって発行された命令を監視することができる。アプリケーション42がglShaderSourceコマンドを発行したことをグラフィックスドライバラッパー26が認識すると、グラフィックスドライバラッパー26は、頂点シェーダ38の命令(たとえば、頂点シェーダ38のソースコード)を捕捉し修正することができる。たとえば、グラフィックスドライバラッパー26は、視線角度に基づいて左眼画像および右眼画像(たとえば、立体視ビュー)のクリッピング座標を生成するように単一の画像(たとえば、モノビュー)のために生成されたクリッピング座標の値を修正する命令を、頂点シェーダ38のソースコードに含めることができる。
[0133]たとえば、上で示されたように、頂点シェーダ38は、xclip座標の値を記憶するgl_Position.x変数と、yclip座標の値を記憶するgl_Position.y変数とを含み得る。以下でより詳細に論じられるように、グラフィックスドライバラッパー26は、視線角度に基づいてgl_Position.x(たとえば、xclip座標)の値を更新する頂点シェーダ38に第1の命令を含め、視線角度に基づいてgl_Position.y(たとえば、yclip座標)の値を更新する頂点シェーダ38に第2の命令を含めることができる。
[0134]左眼画像を生成するために、アプリケーションプロセッサ22によって頂点シェーダ38に追加された第1の命令は、グラフィックスドライバラッパー26を介して、頂点シェーダ38に第1の値をxclip値へ加算させる。第1の値は、閲覧者の目と視線角度との間の距離に基づき得る。アプリケーションプロセッサ22によって頂点シェーダ38に追加された第2の命令は、グラフィックスドライバラッパー26を介して、頂点シェーダ38に第2の値をyclip値へ加算させる。第2の値は、閲覧者の目と視線角度との間の距離と、ディスプレイ12の高さおよび幅とに基づき得る。
[0135]右眼画像を生成するために、グラフィックスドライバラッパー26によって頂点シェーダ38に追加された命令は、頂点シェーダ38に、第1の値をxclip値へ減算させる。右眼画像に対する第1の値は、左眼画像に対する第1の値と同じ値であり得る。グラフィックスドライバラッパー26によって頂点シェーダ38に追加された第2の命令は、頂点シェーダ38に第2の値をyclip値へ減算させる。右眼画像に対する第2の値は、左眼画像に対する第2の値と同じ値であり得る。
[0136]たとえば、アプリケーションプロセッサ22は、グラフィックスドライバラッパー26を介して、gl_Position.x変数に記憶された値(たとえば、xclip座標)をgl_Position.x変数の現在の値に(znear*wworld/(R−L)/2)*Xを足したものに変更する命令を追加するように、頂点シェーダ38のソースコードを修正することができ、ここでznear、R、およびLはすべて、PRJ行列(式4)からの変数であり、wworldは、Vworld行列(式2)からの変数(たとえば、アプリケーション42によって定義されるような頂点座標)である。アプリケーションプロセッサ22は、グラフィックスドライバラッパー26を介して、gl_Position.y変数に記憶された値(たとえば、yclip座標)をgl_Position.y変数の現在の値に(znear*wworld/(T−B)/2)*Yを足したものに変更する別の命令を追加するように、頂点シェーダ38のソースコードを修正することができ、ここでznear、T、およびBはすべて、PRJ行列(式4)からの変数であり、wworldは、Vworld行列(式2)からの変数(たとえば、アプリケーション42によって定義されるような頂点座標)である。
[0137]Xの値は+D*cos(α)または−D*cos(α)であってよく、Dは、閲覧者の右眼と左眼との間の距離の半分の近似であり、ユーザにより定義可能であっても、またはあらかじめプログラムされた値であってもよく、アルファ、αは視線角度である。一例として、アプリケーションプロセッサ22は、1つまたは複数のセンサ42およびカメラプロセッサ44の出力に基づいて、視線角度を決定することができる。Yの値は、D*sin(α)または−D*sin(α)であり得る。
[0138]たとえば、左眼と右眼の間の距離は2*Dであると仮定する。この例では、閲覧者の左眼の座標は(−D
x、−D
y、−D
z)であってよく、閲覧者の右眼の座標は(D
x、D
y、D
z)であってよい。D
z座標は、左眼と右眼の座標が閲覧者の顔の前および2つの目の中間から開始し得るので、0であると見なされ得る(すなわち、(0、0、0)の位置は、閲覧者の顔の前の、閲覧者の左眼と右眼の間にある点に位置する)。視線角度がアルファである場合、閲覧者の左眼の座標は(−D
x*cos(α)、−D
y*sin(α)、0)であってよく、閲覧者の右眼の座標は(D
x*cos(α)、D
y*sin(α)、0)であってよい。この例では、視線角度が0である場合、左眼および右眼の座標は、(−D
x、0、0)および(D
x、0、0)になる。しかしながら、視線角度が0ではないとき、視線角度は、(0、0、0)の位置に対する閲覧者の左眼および右眼の位置をビー定義することができる。左眼および右眼の座標は次の通りであると考えられ得る。
[0139]アプリケーションプロセッサ22は、グラフィックスドライバラッパー26を介して、頂点シェーダ38の命令のセットに、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と等しくなり得る理由が、以下でさらに詳細に説明される。
[0140]アプリケーションプロセッサ22はまた、グラフィックスドライバラッパー26を介して、頂点シェーダ38の命令のセットに、gl_Position.y+=(znear*wworld/(T−B)/2)*Yという命令を追加することができる。これは、gl_Position.y=gl_Position.y+(znear*wworld/(T−B)/2)*Yと等価であり得る。たとえば、gl_Position.y+=コマンドは、gl_Position.y+=命令によって定義される値を、gl_Positionコマンドによって記憶された値に加算する(たとえば、yclipに値を加算する)。いくつかの状況では、gl_Position.y+=命令は、gl_Position.y+=Y*ディスプレイ12の幅がディスプレイ12の高さにより除算されたものへと簡略化され得る。gl_Position.y+変数が(znear*wworld/(T−B)/2)*Yまたは単なるY*ディスプレイ12の幅がディスプレイ12の高さにより除算されたものと等しくなり得る理由が、以下でさらに詳細に説明される。
[0141]本開示の技法によると、左眼画像を生成するために、アプリケーションプロセッサ22は、グラフィックスドライバラッパー26を介して、変数Xの値をD*cos(α)となるように定義することができる。これは、視線位置を左に動かすことが、観測される物体を右に動かすことと等価であるからである。Xが+D*cos(α)と等しいとき、gl_Position.x+=コマンドは、アプリケーション42によって生成された頂点の各々のxclip座標への、定数(たとえば(znear*wworld/(R−L)/2)*D*cos(α)または単にD*cos(α))の加算を引き起こし、これは、頂点を、D*cos(α)の値だけ左に移動させる。また、左眼画像を生成するために、アプリケーションプロセッサ22は、グラフィックスドライバ26を介して、変数Yの値をD*sin(α)となるように定義することができる。これは、視線位置を下に動かすことが、観測される物体を上に動かすことと等価であるからである。Yが+D*sin(α)と等しいとき、gl_Position.y+=コマンドは、アプリケーション42によって生成された頂点の各々のyclip座標への、定数(たとえば(znear*wworld/(T−B)/2)*D*sin(α)または単にD*sin(α)*ディスプレイ12の幅がディスプレイ12の高さにより除算されたもの)の加算を引き起こし、これは、頂点を、D*sin(α)*幅/高さの値だけ左に移動させ、ここで幅はディスプレイ12の幅であり、高さはディスプレイ12の高さである。
[0142]右眼画像を生成するために、アプリケーションプロセッサ22は、グラフィックスドライバラッパー26を介して、変数Xの値を−D*cos(α)となるように定義することができる。これは、視線位置を右に動かすことが、観測される物体を左に動かすことと等価であるからである。Xが−D*cos(α)と等しいとき、gl_Position.x+=コマンドは、アプリケーション42によって生成された頂点の各々のxclip座標からの、定数(たとえば(znear*wworld/(R−L)/2)*−D*cos(α)または単に−D*cos(α))の減算を引き起こし、これは、頂点を、−D*cos(α)の値だけ右に移動させる。また、右眼画像を生成するために、アプリケーションプロセッサ22は、グラフィックスドライバラッパー26を介して、変数Yの値を−D*sin(α)となるように定義することができる。これは、視線位置を上に動かすことが、観測される物体を下に動かすことと等価であるからである。Yが−D*sin(α)と等しいとき、gl_Position.y+=コマンドは、アプリケーション42によって生成された頂点の各々のyclip座標からの、定数(たとえば(znear*wworld/(T−B)/2)*−D*sin(α)×幅/高さまたは単に−D*cos(α)×幅/高さ)の減算を引き起こし、これは、頂点を、−D*sin(α)×幅/高さの値だけ右に移動させる。
[0143]頂点シェーダ38のソースコードを修正した後、アプリケーションプロセッサ22は、頂点シェーダ38の修正されたソースコードをシステムメモリに記憶することができる。いくつかの例では、アプリケーションプロセッサ22は、頂点シェーダ38の修正されたソースを、頂点シェーダ38の修正されていないソースコードがシステムメモリ36の中に記憶される位置と同じ位置に記憶することができる。別の例では、アプリケーションプロセッサ22は、頂点シェーダ38の修正されたソースを、頂点シェーダ38の修正されていないソースコードが記憶される位置とは異なる、システムメモリ36中の位置に記憶することができる。
[0144]glShaderSourceコマンドの発行に続いて、アプリケーション42は、glCompileShaderコマンドを発行する。glCompileShaderコマンドは、アプリケーションプロセッサ22上で実行されるコンパイラ28に、頂点シェーダ38の修正されたソースコードをコンパイルさせる。たとえば、glCompileShaderコマンドは、コンパイラ28に、修正された頂点シェーダ38のためのソースコードをシステムメモリ36から取り出させ、修正された頂点シェーダ38をコンパイルさせることができる。コンパイルの後、コンパイラ28は、得られたオブジェクトコードをシステムメモリ36に記憶する。たとえば、示されるように、システムメモリ36は修正された頂点シェーダ40を含む。修正された頂点シェーダ40は、頂点シェーダ38の修正されたソースコードをコンパイラ28がコンパイルした結果として得られるオブジェクトコードである。
[0145]その上、上で述べられたように、グラフィックスドライバラッパー26は、頂点シェーダ28に、左眼画像を生成するためにgl_Position.x変数およびgl_Position.y変数へ定数を加算させて、右眼画像を生成するためにgl_Position.x変数およびgl_Position.y変数から定数を減算させる命令を、頂点シェーダ28のソースコード中に含め得る。修正された頂点シェーダ40のオブジェクトコードは、修正された頂点シェーダ40に、左眼画像を生成するためにgl_Position.x変数およびgl_Position.y変数へ定数を加算させて、右眼画像を生成するためにgl_Position.x変数およびgl_Position.y変数から定数を減算させる命令を含む。より詳細に説明されるように、修正された頂点シェーダ40は、アプリケーション42からの描画コマンドに応答して、グラフィックスドライバラッパー26を介して、アプリケーションプロセッサ22から定数の値を受け取る。
[0146]いくつかの例では、上で説明されたように、アプリケーションプロセッサ22はさらに、グラフィックスドライバラッパー26を介して、一部の物体がゼロ視差平面の前に、ゼロ視差平面において、またはゼロ視差平面の後に現れるように、左眼画像および右眼画像の中の頂点の位置をさらに調整するために、頂点シェーダ38の命令を修正することができる。たとえば、上で説明されたように、グラフィックスドライバラッパー26は、gl_Position.x+=Xおよびgl_Position.y+=Y*幅/高さという命令を含めるように頂点シェーダ38の命令を修正することができ、左眼画像に対してはXが+D*cos(α)に等しくYが+D*sin(α)に等しく、右眼画像に対してはXが−D*cos(α)に等しくYが−D*sin(α)に等しい。
[0147]頂点レベルにおける調整をさらに可能にするために、グラフィックスドライバラッパー26は、gl_Position.x+=X*(1−(gl_Position.w/ZDPloc))およびgl_Position.y+=Y*幅/高さ*(1−(gl_Position.w/ZDPloc))という命令を含むように、頂点シェーダ38の命令を修正することができる。ZDPlocは、ディスプレイ12に対するゼロ視差平面の位置を定義する、ユーザにより定義される値または事前設定された値であり得る。いくつかの他の例では、プロセッサ22は、カメラプロセッサ44によって決定されるような閲覧者の位置の推定に基づいて、ゼロ視差平面の位置の推定を決定することができる。gl_Position.w変数はwclip座標を記憶する。
[0148]たとえば、gl_Position.x変数およびgl_Position.y変数と同様に、頂点シェーダ38は、gl_Position.w変数にwclip座標を記憶することができる。本開示で説明される例では、wclip座標は、アプリケーション42によって定義されるようなプリミティブのz座標を符号反転したものに等しくなり得る。上で説明されたように、アプリケーション42は(x、y、z、w)としてプリミティブを定義することができる。これらの座標は、ワールド空間で定義されるものとして見なされ得る(すなわち、頂点のvworld座標は(xworld、yworld、zworld、wworld)である)。
[0149]本開示で説明される技法では、gl_Position.wは−zworldに等しくなり得る。gl_Position.wが−zworldに等しい理由は、上の式3および式4で定義されるPRJ行列によるものである。PRJ行列で示されるように、第3列、第4行の値は−1である。上の式1で定義されるように、VclipはPRJ*MVT*Vworldに等しい。したがって、PRJ行列がVworld行列およびMVT行列によって乗算されるとき、Vworldのzworld座標は、PRJ行列の第3列、第4行の−1によって乗算される。wclip座標はzworldを−1により乗算した結果に等しく(すなわち、wclipは−zworldに等しい)、gl_Position.w変数はwclipの値を記憶する(すなわち、gl_Position.wは−zworldに等しい)。
[0150]gl_Position.x+=X*(1−(gl_Position.w/ZDPloc))およびgl_Position.y+=Y*幅/高さ*(1−(gl_Position.w/ZDPloc))というコマンドを、gl_Position.x+=X*(1+(zworld/ZDPloc))およびgl_Position.y+=Y*幅/高さ*(1+(zworld/ZDPloc))で置き換えることが可能であり得る。しかしながら、グラフィックスドライバラッパー26は、アプリケーション42によって出力されるzworld値のすべての入手権を有さないことがある。本開示で説明される技法では、頂点シェーダ38が一例としてOpenGL 2.0 ES APIに従って設計される場合、頂点シェーダ38は、wclipに等しいgl_Position.w変数を含むように設計されてよく、wclipはこの例では−zworldにも等しい。したがって、グラフィックスドライバラッパー26はzworld座標の入手権を有さないことがあるが、グラフィックスドライバラッパー26は、gl_Position.w変数を利用してzworldの値を決定することができる。
[0151]zworld座標は、アプリケーション42によって出力された単一の画像内での頂点の相対的な深度の尺度を提供し得る。たとえば、アプリケーション42によって出力された単一の画像は、ディスプレイ12の2Dエリアに制限され得る。しかし、単一の画像内の物体は、頂点のzworld座標に基づいて、他の物体の前または後に現れ得る。グラフィックスドライバラッパー26が、gl_Position.x+=X*(1−(gl_Position.w/ZDPloc))およびgl_Position.y+=Y*幅/高さ*(1−(gl_Position.w/ZDPloc))というコマンドを含むように頂点シェーダ38の命令を修正する例では、グラフィックスドライバラッパー26は、左眼画像に対してある方向に、また右眼画像に対して他の方向に、頂点をどれだけずらすべきかを決定するために、頂点の相対的な深度を考慮することができる。
[0152]たとえば、単一の画像中の頂点の−zworld(すなわち、gl_Position.w変数によって定義されるような)がZDPlocに等しいとき、gl_Position.x+=0でありgl_Position.y+=0である。この場合、修正された頂点シェーダ38は、左眼画像に対するgl_Position.xおよびgl_Position.yがそれぞれ右眼画像に対するgl_Position.xおよびgl_Position.yに等しいので、左眼画像と右眼画像のいずれかにおいて頂点をずらさなくてよい。しかしながら、単一の画像中の頂点の−zworldがZDPlocに等しくないとき、修正された頂点シェーダ38は、視線角度に基づいて左眼画像について頂点をある方向にずらし、視線角度に基づいて右眼画像について頂点を別の方向にずらすことができる。その上、アプリケーション42によって生成される単一の画像中の頂点の−zworld座標が異なり得るので、修正された頂点シェーダ38は、左眼画像と右眼画像とを作成するために、単一の画像中の異なる頂点を異なる量だけずらすことができる。
[0153]言い換えると、XおよびY*幅/高さ変数を(1−(gl_Position.w/ZDPloc))によりさらに乗算することは、左眼画像および右眼画像において頂点がどれだけずらされるべきかの頂点レベルの決定をもたらす。また、単一の画像中の頂点は、zworldの値に基づいて異なる量だけずらされ得るので、得られる立体視ビューにおいては、一部の物体はゼロ視差平面の前に現れることがあり、一部の物体はゼロ視差平面に現れることがあり、一部の物体はゼロ視差平面の後に現れることがある。
[0154]いくつかの例では、XおよびY*幅/高さ変数を(1−(gl_Position.w/ZDPloc))で乗算するように頂点シェーダ38の命令をさらに修正する代わりに、またはそれに加えて、グラフィックスドライバラッパー26は、ゼロ視差平面の位置を調整するためにglViewportを修正することができる。たとえば、アプリケーション42はまた、プロセッサ22によって実行されると、単一の画像のビューポートを定義するコマンド(たとえば、ディスプレイ12上での単一の画像のサイズと場所とを定義するコマンド)を発行することができる。このコマンドは、glViewportコマンドであり得る。glViewportコマンドは、画像の開始座標(たとえば、xおよびy座標)と、画像の幅および長さとを定義する。glViewportコマンドの開始座標ならびに幅および長さの値は、画像のサイズと位置とを定義する。
[0155]いくつかの例では、グラフィックスドライバラッパー26は、アプリケーション42によって発行されたglViewportコマンドを捕捉することができる。これらの例では、グラフィックスドライバラッパー26は、アプリケーション42によって発行されたglViewportコマンドを、グラフィックスドライバ24がGPU 30へ送るのを阻止することができる。代わりに、グラフィックスドライバラッパー26は、アプリケーション42によって発行されたglViewportコマンドの開始座標と幅および長さの値とを、システムメモリ36に記憶することができる。
[0156]代替例では、グラフィックスドライバラッパー26は、アプリケーション42によって発行されたglViewportコマンドを、グラフィックスドライバ24がGPU 30へ送るのを可能にすることができる。この例では、上記と同様に、グラフィックスドライバラッパー26は、アプリケーション42によって発行されたglViewportコマンドの開始座標と幅および長さの値とを記憶することができる。この代替例では、アプリケーション42によって発行されたglViewportコマンドをGPU 30が適用する前に、グラフィックスドライバラッパー26は、アプリケーション42によって発行されたglViewportコマンドを修正し、修正されたglViewportコマンドをGPU 30へ送ることができる。このようにして、GPU 30は、アプリケーション42によって発行されたglViewportコマンドを受け取ったが、GPU 30は、グラフィックスドライバラッパー26によって修正された、修正されたglViewportコマンドを実行することができる。
[0157]いずれの例においても、グラフィックスドライバラッパー26は次いで、1つまたは複数のプリミティブを描画するようGPU 30に命令するコマンドを、アプリケーション42がGPU 30に発行するまで待つことができる。この描画コマンドは、glDrawコマンドであり得る。glDrawArraysおよびglDrawElementsのような、glDrawコマンドの様々な例がある。描画コマンドのこれらの様々な例の各々は一般に、glDrawコマンドと呼ばれる。
[0158]アプリケーション42がglDrawコマンドを発行すると、グラフィックスドライバラッパー26は、glDrawコマンドを捕捉し、グラフィックスドライバ24がglDrawコマンドをGPU 30へ送信するのを阻止する。グラフィックスドライバラッパー26は次いで、左眼画像および右眼画像のためのグラフィックスコンテンツをGPU 30に生成させる命令を生成する。一例として、グラフィックドライバラッパー36は、修正された頂点シェーダ40のオブジェクトコードをGPU 30に2回実行させる命令を生成し、左眼画像および右眼画像のためのビューポートを定義するために2つのglViewportコマンドを発行し、2つのglDrawコマンドを発行する。
[0159]グラフィックスドライバラッパー26が、XおよびY*幅/高さ変数を(1−(gl_Position.w/ZDPloc))で乗算するように頂点シェーダ38の命令を修正する例では、グラフィックスドライバラッパー26は、glViewportコマンドを修正しなくてよいが、それでも、左眼画像と右眼画像の各々に1つずつ、glViewportコマンドを発行することができる。グラフィックスドライバラッパー26が、XおよびY*幅/高さ変数を(1−(gl_Position.w/ZDPloc))で乗算するように頂点シェーダ38の命令を修正しない例では、グラフィックスドライバラッパー26は、glViewportコマンドを修正し、2つのglViewportコマンドを発行することができ、2つのglViewportコマンドはアプリケーション42によって発行された異なるglViewportコマンドである。
[0160]頂点間の視差の頂点レベルの調整と、左眼画像と右眼画像との間の視差の画像レベルの調整とのいずれかのための技法の概要として、アプリケーション42によって発行されたglDrawコマンドをグラフィックスドライバ24が送信するのを、グラフィックスドライバラッパー26が阻止した後、グラフィックスドライバラッパー26は、シェーダプロセッサ32を使って、修正された頂点シェーダ40に立体視ビューの第1の画像(たとえば、左眼画像)のクリッピング座標を生成する準備をさせるコマンドをGPU 30へ発行する。次いで、グラフィックスドライバラッパー26は、ディスプレイ上での第1の画像のサイズと位置とを定義する第1のglViewportコマンドを、固定機能パイプライン34のビューポート変換ユニットに発行することができる。グラフィックスドライバラッパー26は次いで、第1のglViewportコマンドによって定義されるようなディスプレイの第1の部分に制限された第1の画像をGPU 30にレンダリングさせる第1のglDrawコマンドを、GPU 30へ発行することができる。
[0161]グラフィックスドライバラッパー26は次いで、シェーダプロセッサ22を使って修正された頂点シェーダ40に立体視ビューの第2の画像(たとえば、右眼画像)のクリッピング座標を生成する準備をさせるコマンドを、GPU 30へ発行する。次いで、グラフィックスドライバラッパー26は、ディスプレイ上での第2の画像のサイズと位置とを定義するビューポートに対する第2のglViewportコマンドを、固定機能パイプライン34のビューポート変換ユニットに発行することができる。グラフィックスドライバラッパー26は次いで、第2のglViewportコマンドによって定義されるようなディスプレイの第2の部分に制限された第2の画像をGPU 30にレンダリングさせる第2のglDrawコマンドを、GPU 30へ発行することができる。
[0162]上では概要として説明された本開示の技法が、以下の例において、より詳細に説明される。理解しやすくするためにのみ、以下の例では、本技法は、左眼画像のためのグラフィックスコンテンツを最初に、続いて右眼画像のためのグラフィックスコンテンツを生成するGPU 30を用いて説明されるが、その反対も可能である。
[0163]たとえば、グラフィックスドライバラッパー26がglViewportコマンドを途中で捕え、次いで、アプリケーション42によって発行されたglDrawコマンドを阻止した後、グラフィックスドライバラッパー26は、左眼画像のためのクリッピング座標を生成するようGPU 30に命令する命令を生成する。やはり、いくつかの例では、グラフィックスドライバラッパー26は、アプリケーション42によって発行されたglViewportコマンドの、GPU 30への送信を阻止し得ることに留意されたい。他の例では、グラフィックスドライバラッパー26は、アプリケーション42によって発行されたglViewportコマンドが、GPU 30に送信されることを可能にし得る。
[0164]一例として、アプリケーションプロセッサ22は、グラフィックスドライバラッパー26を介して、GPU 30に、修正された頂点シェーダ40のオブジェクトコードを実行させる命令を生成する。それに応答して、GPU 30のシェーダプロセッサ32は、修正された頂点シェーダ40のオブジェクトコードを実行する。加えて、アプリケーションプロセッサ22は、グラフィックスドライバラッパー26を介して、左眼画像のクリッピング座標を生成するために修正された頂点シェーダ30がgl_Position.x変数に加算すべき定数値を送る。修正された頂点シェーダ40のオブジェクトコードを実行したことによる、シェーダプロセッサ42の出力は、左眼画像の頂点のクリッピング座標である。
[0165]たとえば、上で論じられたように、グラフィックスドライバラッパー26は、後で説明される理由により、頂点シェーダ38のソースコードに、gl_Position.x+=(znear*wworld/(R−L)/2)*X、または単にgl_Position.x+=Xおよびgl_Position.y+=(znear*wworld/(T−B)/2)*Y、または単にgl_Position.y+=Y*幅/高さという命令を含めることができる。上で説明されたように、頂点間の視差の頂点レベルの調整のために、グラフィックスドライバラッパー26はさらに、頂点シェーダ38のソースコード中のgl_Position.xコマンドとgl_Position.yコマンドとを修正することができる。たとえば、これらの例では、グラフィックスドライバラッパー26は、後で説明される理由により、頂点シェーダ38のソースコードに、gl_Position.x+=(znear*wworld/(R−L)/2)*X*(1−(gl_Position.w/ZDPloc))、または単にgl_Position.x+=X*(1−(gl_Position.w/ZDPloc))およびgl_Position.y+=(znear*wworld/(T−B)/2)*Y*(1−(gl_Position.w/ZDPloc))、または単にgl_Position.y+=Y*幅/高さ*(1−(gl_Position.w/ZDPloc))という命令を含めることができる。
[0166]znear、wworld、R、L、T、およびBという変数は、式(2)および(4)を参照して上で説明されたように、シェーダプロセッサ32に知られている可能性があり得る。しかしながら、本開示の態様は、znear、wworld、R、L、T、およびBという変数の値をシェーダプロセッサ32が知っていることを必要としない。たとえば、znear、wworld、R、L、T、およびBという変数は、各々が定数であり得るので、(znear*wworld/(R−L)/2)および(znear*wworld/(T−B)/2)の結果は定数値になるであろう。この場合、(znear*wworld/(R−L)/2)および(znear*wworld/(T−B)/2)の値は適宜、推定され、またはユーザによって提供され、XまたはYの値へと乗算され得る。より詳細に説明されるように、いくつかの例では、(znear*wworld/(R−L)/2)は1に簡略化されてよく、(znear*wworld/(T−B)/2)はディスプレイ12の幅/高さに簡略化されてよい。
[0167]いくつかの例では、シェーダプロセッサ32はXおよびYの値を知らないことがある。左眼画像に対して、グラフィックスドライバラッパー26は、修正された頂点シェーダ40のオブジェクトコードを実行するようシェーダプロセッサ32に命令する命令に加え、XおよびYの値をシェーダプロセッサ32に送ることができる。いくつかの例では、左眼画像に対してXの値は+D*cos(α)であってよく、左眼画像に対してYの値は+D*sin(α)であってよく、ここでDは、閲覧者の目の間の距離のほぼ半分に等しく、ユーザにより定義され、または事前にプログラムされてよく、アルファ、αは、プロセッサ22によって決定されるような視線角度に等しい。変数Xの値は+D*cos(α)であるので、gl_Position.x+=コマンドは、シェーダプロセッサ32に、gl_Position.x変数に記憶された値へD*cos(α)の値を加算させる(たとえば、xclipの値にD*cos(α)を加算させる)。また、Yの値は+D*sin(α)であるので、gl_Position.y+=コマンドは、シェーダプロセッサ32に、gl_Position.y変数に記憶された値へD*sin(α)*幅/高さの値を加算させる(たとえば、D*sin(α)*幅/高さを加算させる)。
[0168]やはり、頂点の頂点レベルの調整のために、追加されるgl_Position.x+=コマンドは、シェーダプロセッサ32に、gl_Position.x変数に記憶された値へD*cos(α)*(1−(gl_Position.w)/(ZDPloc))の値を加算させ、加算されたgl_Position.y+=コマンドは、シェーダプログラムプロセッサ32に、gl_Position.y変数に記憶された値へD*sin(α)*(1−(gl_Position.w)/(ZDPloc))の値を加算させる。しかしながら、頂点のそのような頂点レベルの調整は、すべての例において必須ではない。
[0169]グラフィックスドライバラッパー26は、左眼画像のためのビューポートも定義する。たとえば、アプリケーション42がglDrawコマンドを発行した前に、アプリケーション42は、グラフィックスドライバラッパー26が途中で捕えたglViewportコマンドを発行している。グラフィックスドライバラッパー26はまた、開始座標と、幅および長さの値とを、システムメモリ36に記憶している。グラフィックスドライバラッパー26が、頂点間の視差の頂点レベルの調整のために頂点シェーダ38の命令を修正した例では、グラフィックスドライバラッパー26は、glViewportコマンドの命令を修正しなくてよく、代わりに、アプリケーション42によって発行されるglViewportコマンドと同じである2つのglViewportコマンドできる。グラフィックスドライバラッパー26が、頂点間の視差の頂点レベルの調整のために頂点シェーダ38の命令を修正しない例では、グラフィックスドライバ26は、ゼロ視差平面の位置を決定するために、以下で説明されるようにglViewportコマンドの命令を修正することができる。
[0170]ゼロ視差平面の画像レベルの調整のために左眼画像のためのビューポートを定義するために、グラフィックスドライバラッパー26は、アプリケーション42によって発行された、途中で捕えられたglViewportコマンドを修正することができる。たとえば、glViewportコマンドは、4つの変数を含み、最初の2つの変数は、ディスプレイ上の画像の開始座標を定義し、最後の2つの変数は、画像の幅と長さとを定義する。幅および長さ変数は、必ずしも座標値ではない。むしろ、幅および長さ変数は、画像が開始座標から伸長する量を定義する。たとえば、アプリケーション42は、glViewport(0、0、幅、長さ)と記述するglViewportコマンドを発行することができる。この例では、(0、0)は、ディスプレイの左下を指す。変数「幅」はディスプレイの幅を指し、変数「長さ」はディスプレイの長さを指す。したがって、この例では、アプリケーション42は、画像のビューポートを、ディスプレイの全体を包含するように定義するが、これはモノビュー画像と矛盾しない。しかしながら、アプリケーション42は、示されたもの以外の異なる変数をglViewportコマンドに割り当てることができる。
[0171]本開示によれば、グラフィックスドライバラッパー26は、glViewportコマンド(たとえば、前述の例のglViewport(0、0、幅、長さ))を途中で捕え、このビューポートコマンドのための変数を修正することができる。たとえば、グラフィックスドライバラッパー26は、glViewportコマンドの変数を、左眼画像をディスプレイの所望の部分に制限するように修正することができる。説明しやすくするために、本技法は、左眼画像をディスプレイの左半分に、右眼画像をディスプレイの右半分に制限することを説明するが、態様はそのように限定されない。
[0172]左眼画像に対して、グラフィックスドライバラッパー26は、アプリケーション42によって発行されたglViewportコマンドを、glViewport(0、0、幅/2、長さ)に修正することができる。この例では、幅/2は、ディスプレイの幅の半分である。たとえば、修正されたglViewportコマンドは、左眼画像がディスプレイの左端から始まり(たとえば、x軸上の原点から始まり)、「幅/2」の距離だけ右に伸びることを示し、このことは、左眼画像をディスプレイの左半分に制限する。また、修正されたglViewportコマンドは、左眼画像がディスプレイの下から始まり(たとえば、y軸上の原点から始まり)、「長さ」の距離だけ上に伸びることを示し、このことは、画像をディスプレイの上および下に制限する。
[0173]いずれの例(たとえば、glViewportコマンドが修正される例またはglViewportコマンドが修正されない例)でも、グラフィックスドライバラッパー26は次いで、第1のglDrawコマンドをGPU 30に出すことができる。glDrawコマンドに応答して、GPU 30は、固定機能パイプライン34とフラグメントシェーダとを通じて、修正された頂点シェーダ40のオブジェクトコードの実行によって生成された左眼画像のクリッピング座標を処理することができる。glViewportコマンドの修正を伴う例では、第1のglViewportコマンドは、左眼画像をディスプレイの左半分に制限することができる。glViewportコマンドの修正を伴わない例では、第1のglViewportコマンドは、左眼画像をディスプレイの左半分に制限しなくてよい。glDrawコマンドは次いで、GPU 30に、左眼画像を一時的な記憶のためにフレームバッファへとレンダリングさせることができる。たとえば、フレームバッファは、右眼画像が生成されるまで、左眼画像を記憶することができる。次いで、GPU 30は、フレームバッファの全体をディスプレイプロセッサ(図示されず)に出力することができる。ディスプレイプロセッサは、ディスプレイに、立体視ビューを生成するために左眼画像と右眼画像とを表示させることができる。
[0174]グラフィックスドライバラッパー26は、右眼画像を生成するためではあっても、左眼画像を生成するための同じステップを繰り返すことができる。たとえば、グラフィックスドライバラッパー26は、シェーダプロセッサ32に、修正された頂点シェーダ40のオブジェクトコードを実行させるための別の命令を発行する。加えて、グラフィックスドライバラッパー26は、右眼画像のクリッピング座標を生成するために修正された頂点シェーダ40がgl_Position.x変数から減算すべき、また、左眼画像のクリッピング座標を生成するために修正された頂点シェーダ40がgl_Position.y変数から減算すべき、定数値を送る。修正された頂点シェーダ40のオブジェクトコードを実行したことによる、シェーダプロセッサ32の出力は、右眼画像の頂点のクリッピング座標である。
[0175]上で説明されたように、グラフィックスドライバラッパー26は、命令gl_Position.x+=(znear*wworld/(R−L)/2)*X、または単にgl_Position.x+=Xを頂点シェーダ38のソースコードに追加し、命令gl_Position.y+=(znear*wworld/(T−B)/2)*Y、または単にgl_Position.y+=Y*幅/高さを追加することができる。左眼画像に対して、変数Xの値は+D*cos(α)であり得、変数Yの値は+D*sin(α)であり得る。本開示の例では、右眼画像に対して、変数Xの値は−D*cos(α)であり得、変数Yの値は−D*sin(α)であり得る。変数Xの値は−D*cos(α)であるので、gl_Position.x+=コマンドは、シェーダプロセッサ32に、gl_Position.x変数に記憶された値からD*cos(α)の値を減算させる。また、変数Yの値は−D*sin(α)であるので、gl_Position.y+=コマンドは、シェーダプロセッサ32に、gl_Position.y変数に記憶された値からD*sin(α)*幅/高さの値を減算させる。
[0176]いくつかの例(たとえば、左眼画像と右眼画像との間の視差の画像レベルの調整のための)では、グラフィックスドライバラッパー26はまた、右眼画像のためのビューポートを定義する。上で論じられたように、左眼画像に対して、グラフィックスドライバラッパー26は、左眼画像をディスプレイの左半分に制限するために、ビューポートを、glViewport(0、0、幅/2、長さ)となるように定義する。右眼画像に対して、グラフィックスドライバラッパー26は、ビューポートを、glViewport(幅/2、0、幅/2、長さ)となるように定義することができる。この例では、(幅/2、0)座標は、右眼画像がディスプレイの中央から始まり、右に伸びることを示す。また、glViewportコマンド中の(幅/2、長さ)変数は、右眼画像がディスプレイの幅の半分およびディスプレイの全長だけ伸びることを示す。
[0177]したがって、この例では、修正されたglViewportコマンド(たとえば、glViewport(幅/2、0、幅/2、長さ))は、右眼画像をディスプレイの右半分に制限する。たとえば、修正されたglViewportコマンドは、右眼画像がディスプレイの中央から始まり(たとえば、x軸上の幅/2の点から始まり)、「幅/2」の距離だけ右に伸びることを示し、このことは、右眼画像をディスプレイの右半分に制限する。また、修正されたglViewportコマンドは、右眼画像が、ディスプレイの下から始まり(たとえば、y軸上の原点から始まり)、「長さ」の距離だけ上に伸びることを示し、このことは、画像をディスプレイの上および下に制限する。
[0178]グラフィックスドライバラッパー26は次いで、第2のglDrawコマンドをGPU 30に発行することができる。glDrawコマンドに応答して、GPU 30は、固定機能パイプライン34とフラグメントシェーダとを通じた、修正された頂点シェーダ40のオブジェクトコードの実行によって生成された右眼画像のクリッピング座標を処理することができる。glDrawコマンドは次いで、GPU 30に、右眼画像を一時的な記憶のためにフレームバッファへとレンダリングさせることができる。この場合、GPU 30は、左眼画像をフレームバッファにすでに記憶していてよく、GPU 30は、立体視ビューを生成するために、記憶された左眼画像と右眼画像とをフレームバッファから取り出し表示するように、ディスプレイプロセッサに命令することができる。
[0179]上で説明されたように、グラフィックスドライバラッパー26は、命令gl_Position.x+=コマンドとgl_Position.y+=コマンドとを、頂点シェーダ38のソースコードに追加することができる。立体視ビューの飛び出しまたは押し込みの効果を引き起こすために、視線角度に基づいて、左眼画像と右眼画像との間にわずかなずれを引き起こす頂点シェーダ38のソースコードに追加されるものは、gl_Position.x+=コマンドおよびgl_Position.y+=コマンドである。
[0180]glViewportコマンドに対する修正の上の例では、glViewportコマンドに対する修正は、左眼画像をディスプレイ12の左半分に制限し、右眼画像をディスプレイ12の右半分に制限した。しかしながら、左眼画像をディスプレイ12の左半分に制限し、右眼画像をディスプレイ12の右半分に制限することは、視線角度αを考慮しないことがある。また、左眼画像をディスプレイ12の左半分に制限し、右眼画像をディスプレイ12の右半分に制限することは、ZDPの所望の位置を閲覧者が設定することを可能にしないことがある。
[0181]以下は、グラフィックスドライバラッパー26が、視線角度を考慮し、所望の位置へのゼロ視差平面の設定を可能にするために、glViewportコマンドを修正し得る方式を説明する。たとえば、上のように、アプリケーション42によって定義されるビューポートはglViewport(0、0、幅、高さ)であると仮定し、ここでディスプレイ12の左下の位置は(0、0)であり、ディスプレイ12の右上の位置は(幅、高さ)である。
[0182]この場合、左眼画像に対して、グラフィックスドライバラッパー26は、glViewport(−VPshift*cos(α)、−VPshift*sin(α)、幅−VPshift*cos(α)、高さ−Vpshift*sin(α))となるように、glViewportコマンドを修正することができ、(−VPshift*cos(α)、−VPshift*sin(α))は左眼画像の左下であり、(幅−VPshift*cos(α)、高さ−Vpshift*sin(α))は左眼画像の右上である。右眼画像に対して、グラフィックスドライバラッパー26は、glViewport(VPshift*cos(α)、VPshift*sin(α)、幅+VPshift*cos(α)、高さ+Vpshift*sin(α))となるように、glViewportコマンドを修正することができ、(VPshift*cos(α)、VPshift*sin(α))は右眼画像の左下であり、(幅+VPshift*cos(α)、高さ+VPshift*sin(α))は右眼画像の右上である。
[0183]上の例では、VPshift変数は、左眼画像と右眼画像との間の水平視差の量を定義し得る。たとえば、VPshiftは、上で説明された水平視差の値であり得る。水平視差の値は、左眼画像のビューポートと右眼画像のビューポートが互いに対してシフトされている量(すなわち、ビューポートシフトの量)、したがって変数VPshiftを示すことができる。閲覧者は、ゼロ視差平面の位置を定義するために、VPshiftの値を定義することができる。別の例として、プロセッサ22は、閲覧者がディスプレイ12に対してどれだけ離れているかの推定に基づいて、VPshiftの値を決定するように構成され得る。別の例として、アプリケーション22またはグラフィックスドライバラッパー26は、VPshiftの値によって事前構成され得る。
[0184]いくつかの例では、グラフィックスドライバラッパー26はさらに、ビューポート伸長のために、左眼画像および右眼画像のためのglViewportコマンドを修正することができる。ビューポート伸長は、左眼画像と右眼画像とに重複があり得るように、左眼画像および右眼画像のビューポートを拡張する。たとえば、ビューポート伸長がなければ、左眼画像および右眼画像はディスプレイのそれぞれの部分に制限され得るので、重複はないことがある。重複を増やし、または減らすために、アプリケーションプロセッサ22はさらに、グラフィックスドライバラッパー26を介して、ビューポート伸長を含むようにglViewportコマンドを修正することができる。ビューポート伸長はまた、ゼロ視差平面の位置に影響を与えることがあり、ゼロ視差平面の位置を所望の位置へと調節するためのさらに別の方法を提供し得る。
[0185]ビューポート伸長を含めるようにglViewportコマンドを修正することは、すべての例において必須ではない。その上、本開示で説明される技法によれば、アプリケーションプロセッサ22は、グラフィックスドライバラッパー26を介して、視線角度に基づいてビューポート伸長を含むようにglViewportコマンドを修正することができる。たとえば、アプリケーションプロセッサ22は、グラフィックスドライバラッパー26を介して、次のようにglViewportコマンドを修正することができる。左眼画像のビューポートのために、アプリケーションプロセッサ22は、グラフィックスドライバラッパー26を介して、glViewportコマンドをglViewport(−VPshift*cos(α)、−VPshift*sin(α)、幅、高さ)へと修正することができる。右眼画像のビューポートのために、アプリケーションプロセッサ22は、グラフィックスドライバラッパー26を介して、glViewportコマンドをglViewport(0、0、幅+VPshift*cos(α)、高さ+VPshift*sin(α))へと修正することができる。
[0186]上で説明されたように、本開示で説明される技法は、モノビューのための画像を生成するための命令を、実行またはランタイム中に、立体視ビューのための画像を生成するように修正することができる。たとえば、閲覧者は、アプリケーション42を実行のために選択することができ、アプリケーション42は、アプリケーション42の実行によって生成されたグラフィックスを処理するために頂点シェーダ38の実行を必要とし得る。アプリケーション42がデバイス10上で実行または稼動している間、グラフィックスドライバ24、グラフィックスドライバラッパー26、およびコンパイラ28は、アプリケーションプロセッサ22上でそれぞれの機能を実行して、アプリケーションプロセッサ22に、頂点シェーダ38のソースコードを修正させ、修正された頂点シェーダ40のためのオブジェクトコードを生成させることができる。言い換えると、3DグラフィックスからS3Dグラフィックスへの変換は、事前にプログラムされたS3Dグラフィックスコンテンツまたは事前に記録されたS3D画像もしくはビデオを必要とするのではなく、グラフィックスドライバラッパー26を介して、アプリケーションプロセッサ22によってランタイム中に実行される。
[0187]また、上の例は、アプリケーションプロセッサ22がグラフィックスドライバラッパー26を介して頂点シェーダ38に命令を追加し、頂点シェーダ38の命令を修正し、ビューポートを定義する命令を修正する文脈で説明されるが、本開示の態様は、そのようには限定されない。いくつかの例では、グラフィックスドライバラッパー26ではなく、アプリケーションプロセッサ22が、グラフィックスドライバ24またはコンパイラ28を介して、頂点シェーダ38の命令と、アプリケーション42によって出力された命令とを修正することが可能であり得る。しかしながら、これらの例は、グラフィックスドライバ24またはコンパイラ28に対する修正を必要とし得る。
[0188]グラフィックスドライバ24またはコンパイラ28に対する修正は、GPU 30が立体視ビューのための左眼画像と右眼画像とを生成するように、グラフィックスドライバラッパー26を開発し、アプリケーションプロセッサ22に、グラフィックスドライバラッパー26を介して、本開示で説明される機能を実行させるよりも困難であり得る。たとえば、デバイス10は、以前から存在するグラフィックスドライバ24およびコンパイラ28をロードされていることがあり、グラフィックスドライバ24とコンパイラ28とを変更することは困難であり得る。アプリケーションプロセッサ22に頂点シェーダ38に対する修正を実行させるためにグラフィックスドライバラッパー26を追加することによって、例示的な技法は、以前から存在するグラフィックスドライバ24およびコンパイラ28に対する修正を必要としなくてよい。
[0189]さらに、上で説明された技法は、GPU 30が、アプリケーション42に対する修正を伴わずに、立体視ビューのための画像を生成することを可能にし得る。たとえば、立体視ビューを生成するためのいくつかの他の技法は、アプリケーション42の開発者が、左眼画像および右眼画像のためのピクセル値を生成するようにアプリケーション42のソースコードを修正することを必要とし得る。これらの技法は、立体視ビューのために開発者のアプリケーションを修正するための、アプリケーション42の開発者からの支援を必要としており、これは、アプリケーション42の開発者にとって面倒な作業になり得る。上で説明された例示的な技法は、アプリケーション42の開発者からの支援を何ら伴わずに、モノビューのために開発された、アプリケーション42のための立体視ビューを提供することができる。
[0190]その上、ランタイム中に3DグラフィックスをS3Dグラフィックスに変換するための、いくつかの他の技法が提案されている。しかしながら、これらの他の技法は、視線角度を考慮しないことがある。たとえば、これらの他の技法では、視線角度が変化すると、得られる立体視ビューは理想的なものではないように見え得る。視線角度を考慮することによって、本技法は、閲覧者がディスプレイ12を見ている角度に関係なく、またはディスプレイ12の角度に関係なく、より豊かな閲覧体験を提供する。
[0191]また、上で説明された技法は、立体視ビューのため左眼画像と右眼画像とを生成するための、システムメモリ26に対する複数の呼出しを必要としないことがある。たとえば、立体視ビューを生成するためのいくつかの他の技法では、GPUは左眼画像を生成する。左眼画像の生成が完了すると、GPUは、右眼画像を生成するために、左眼画像を生成する間、システムメモリ36に記憶された深度情報を利用する。しかしながら、深度情報を取り出すための、システムメモリ36に対する反復的な呼出しは、計算負荷が高いことがあり、過度の電力消費を必要とすることがある。
[0192]上で説明された例示的な技法は、右眼画像を生成するために左眼画像の深度情報を求める、システムメモリ36に対するそのような複数の呼出しを必要としないことがある。たとえば、グラフィックスドライバラッパー26は、頂点シェーダ38のソースコードと、ビューポートを定義する命令とを修正して、一方の画像の深度情報を他方の画像を生成するために必ずしも必要とすることなく、左眼画像と右眼画像とを互いに独立に生成することができる。
[0193]上で説明されたように、グラフィックスドライバラッパー26は、gl_Position.x+=(znear*wworld/(R−L)/2)*Xまたは単にgl_Position.x+=Xというコマンドを、gl_Position.x変数の値を修正する頂点シェーダ28のソースコードに含め、gl_Position.y+=(znear*wworld/(T−B)/2)*Yまたは単にgl_Position.x+=Y*幅/高さを含めることができ、XはD*cos(α)または−D*cos(α)に等しく、YはD*sin(α)または−D*sin(α)に等しい。やはり、頂点の頂点レベルの調整が望まれる場合、グラフィックスドライバラッパー26はさらに、変数XおよびYを(1−gl_Position.w/ZDPloc)と乗算することができ、ここで、gl_Position.wはwclip座標を記憶し、それは−zworldに等しく、ZDPlocは所望されるゼロ視差平面の位置である。以下は、このように頂点シェーダ38のソースコード中に命令を含める理由を与える。
[0194]式(1)において上で示されたように、Vclip=PRJ*Veye=PRJ*MVT*Vworldである。Vclipの式は、左眼および右眼のクリッピング座標を生成するように修正され得る。たとえば、左眼および右眼のクリッピング座標は、次の通りであり得る。
[0195]VTleft−eyeおよびVTright−eyeは、モノビューからの左眼および右眼の仮定された距離に基づく4x4行列であり得る。モノビューの座標は(0、0、0)であってよく、左眼は、式6に記載されるように(D*cos(α)、D*sin(α)、0)に位置するものと見なされ得、右眼は、(−D*cos(α)、−D*sin(α)、0)に位置するものと見なされ得る。言い換えると、位置(0、0、0)は、閲覧者の右眼と左眼との中間にあるものと見なされ得る。左眼が、右眼と左眼との中間から(D*cos(α)、D*sin(α))だけ離れて位置すると見なされ、右眼が、右眼と左眼との中間から(−D*cos(α)、−D*sin(α))だけ離れて位置すると見なされる場合、Dは、閲覧者の右眼と左眼との間の距離の半分を示し、アルファ、αは、視線角度を示す。
[0196]VTleft−eyeおよびVTright−eyeの行列は、次のように定義され得る。
[0197]VTleft−eyeおよびVTright−eyeは、2つの行列の和として書き直され得る。たとえば、VTleft−eyeは、次のように書き直され得る。
[0198]VTright−eyeは、次のように書き直され得る。
[0199]Vclip_left−eyeについての式(式7)にVTleft−eye行列を代入することによって、Vclip_left−eyeは、
に等しい。
[0200]Vclip_right−eyeについての式(式8)にVTright−eye行列を代入することによって、Vclip_right−eyeは、
に等しい。
[0201]式10と11の両方において(たとえば、Vclip_left−eyeおよびVclip_right−eyeに対して)、
は、PRJ*MVT*Vworldに簡略化され得る。それは、
が単位行列であり、1を乗算することと等価であるからである。
[0202]式1において上に記載されたように、PRJ*MVT*Vworldは、Vclipに等しい。したがって、Vclip_left−eyeおよびVclip_right−eyeの式(たとえば、それぞれ、式10および11)は、次のように書き直され得る。
[0203]PRJおよびMVTの行列(それぞれ、式4および5)を代入し、式11の行列乗算を実行することによって、Vclip_left−eyeの式は、
に簡略化され得る。
である。
行列を乗算することによって、得られるVclip_left−eyeの値は、
に等しい。
である。
Vclip_left−eyeの上の式では、xclipは単一の画像のxクリッピング座標であり、yclipは単一の画像のyクリッピング座標である。((znear/((R−L)/2)*D*cos(α)*wworldは、左眼画像についてxclipに加算される値である。((znear/((T−B)/2)*D*sin(α)*wworldは、左眼画像についてyclipに加算される値である。znearおよびwworldの値は、アプリケーション42によって生成された単一の画像に対するそれらの値と同じである。xclipおよびyclipに加算される値は、視線角度(α)と、ディスプレイ12の幅と高さの比とに基づく。
[0204]Vclip_left−eyeの場合と同様の代入を行うと、Vclip_right−eyeの式は、
に簡略化され得る。
である。
を計算されたy
clipに加算し、他のすべてのクリッピング座標を同じに保つことによって、頂点シェーダ38は、左眼画像のクリッピング座標を生成できることが理解され得る。同様に、定数
をyclip座標から減算し、他のすべてのクリッピング座標を同じに保つことによって、頂点シェーダ38は、右眼画像のクリッピング座標を生成できる。少なくともこれらの理由により、グラフィックスドライバラッパー16は、命令gl_Position.x+=znear*wworld/((R−L)/2)*Xを含み得、ここでXは+D*cos(α)に等しく、命令gl_Position.y+=znear*wworld/((T−B)/2)*Yであり、左眼画像を生成するためにYは+D*sin(α)に等しく、右眼画像を生成するためにXは−D*cos(α)に等しくYは−D*sin(α)に等しい。
[0206]いくつかの例では、gl_Position.x+=コマンドを単なるgl_Position.x+=Xへとさらに簡略化することが可能であり得る。たとえば、w
world変数は1に設定されることが一般的である。また、OpenGL、OpenGL ES、およびOpenGL ES 2.0は、プログラマブルシェーダによって、錐台を、
となるように定義し、ここでfov
xは、OpenGL、OpenGL ES、およびOpenGL ES 2.0において定義される錐台である。視線角度が45度に設定されることも一般的であり、これは、cot(fov
x)が1に等しいことを意味する。これは、
が1に等しいことを意味する。したがって、これらの例では、
が1に等しく、wworldが1に等しい)。これらの例では、gl_Position.x+=変数は、gl_Position.x+=Xへと簡略化され得る。
[0207]また、ディスプレイ12の幅はR−Lに等しくてよく、ディスプレイ12の高さはT−Bに等しくてよい。したがって、命令gl_Position.y+=znear*wworld/((T−B)/2)*Yは、命令gl_Position.y+=Y*幅/高さへと簡略化され得る。
[0208]したがって、上の式は、命令gl_Position.x+=(znear*wworld/(R−L)/2)*Xまたはgl_Position.x+=X、およびgl_Position.y+=(znear*wworld/(T−B)/2)*Yまたはgl_Position.y+=Yを頂点シェーダ38に追加することが、2回実行されると、1回目の実行ではXが+D*cos(α)に等しくYが+D*sin(α)に等しく、2回目の実行ではXが−D*cos(α)に等しくYが−D*sin(α)に等しい場合、視線角度に基づいて立体視ビューを生成するためにモノビュー画像をずらすのになぜ十分であり得るかという理由を示す数学的基礎を提供する。さらに、(znear*wworld/(R−L)/2)が1に等しくない例、および(znear*wworld/(T−B)/2)が幅/高さに等しくない例であっても、znear*wworld/(R−L)/2*Dは、その値が閲覧者の選択するものであり得る定数値であってよく、同様に、znear*wworld/(T−B)/2*Dは、その値が閲覧者の選択するものであり得る定数値であってよい。
[0209]言い換えると、本開示で説明される技法では、znear、wworld、R、L、T、B、およびDの実際の値は必要とされないことがある。むしろ、閲覧者は、znear*wworld/(R−L)/2*Dのために第1の値を選択し、znear*wworld/(R−L)/2*Dのために第2の値を選択することができる。グラフィックスドライバラッパー26は、第1の値をcos(α)と乗算し、得られた値を頂点シェーダ38に提供することができる。頂点シェーダ38中のgl_Position.x+=コマンドは、そのグラフィックスドライバラッパー26が頂点シェーダ38に含まれ、左眼画像のための修正された頂点シェーダ40のオブジェクトコードの1回目の実行において頂点のxクリッピング座標を決定するために、グラフィックスドライバラッパー26によって提供された値をgl_Position.xの現在の値に加算することができる。また、グラフィックスドライバラッパー26は、第2の値をsin(α)と乗算し、得られた値を頂点シェーダ38に提供することができる。頂点シェーダ38中のgl_Position.y+=コマンドは、そのグラフィックスドライバラッパー26が頂点シェーダ38に含まれ、左眼画像のための修正された頂点シェーダ40のオブジェクトコードの1回目の実行において頂点のyクリッピング座標を決定するために、グラフィックスドライバラッパー26によって提供された値をgl_Position.yの現在の値に加算することができる。
[0210]同様に、グラフィックスドライバラッパー26は、第1の値を−1およびcos(α)と乗算し、得られた値を頂点シェーダ38に提供することができる。頂点シェーダ38中のgl_Position.x+=コマンドは、そのグラフィックスドライバラッパー26が頂点シェーダ38に含まれ、右眼画像のための修正された頂点シェーダ40のオブジェクトコードの2回目の実行において頂点のxクリッピング座標を決定するために、グラフィックスドライバラッパー26によって提供された値をgl_Position.xの現在の値に加算することができる。また、グラフィックスドライバラッパー26は、第2の値を−1およびsin(α)と乗算し、得られた値を頂点シェーダ38に提供することができる。頂点シェーダ38中のgl_Position.y+=コマンドは、そのグラフィックスドライバラッパー26が頂点シェーダ38に含まれ、右眼画像のための修正された頂点シェーダ40のオブジェクトコードの2回目の実行において頂点のyクリッピング座標を決定するために、グラフィックスドライバラッパー26によって提供された値をgl_Position.yの現在の値に加算することができる。
[0211]いくつかの例では、閲覧者は、gl_Position.x+=コマンドおよびgl_Position.y+=コマンドの修正のための第1の値および第2の値の値、ならびに/または、VPshiftおよびZDPlocの値を選択することができる。これは、閲覧者が、立体視効果を望まれるように精密に調整することを可能にし得る。たとえば、閲覧者は、頂点がずらされる量とゼロ視差平面の位置とを定義することによって、立体視効果を個人設定することが可能であり得る。
[0212]このように、本開示の技法は、モノビューのために設計された頂点シェーダ38に対する小さな修正を、修正された頂点シェーダがコンパイルされ実行される(たとえば、修正された頂点シェーダ40のオブジェクトコードの実行)とき、得られた画像が閲覧者に立体視ビューを提供し得るように、提供することができる。立体視ビューは、閲覧者に3D体験を提供することができ、これは、ディスプレイの2Dエリアによって限定された画像を見るのと比較して、より豊かでより十分な体験であり得る。
[0213]図6は、ゼロ視差平面の位置を示す概念図である。たとえば、元の視点の位置は(0、0、0)の位置であり得る。左眼は元の視点から距離D離れていてよく、右眼は元の視点から距離−D離れていてよい。たとえば、左眼は(−D*cos(α)、−D*sin(α))に位置していてよく、右眼は(D*cos(α)、D*sin(α))に位置していてよい。
[0214]左眼視点および右眼視点から延びる角度がつけられた線は、それぞれ、左眼および右眼が見るエリアを示す。左眼視点および右眼視点から延びる直線は、ディスプレイ12の方向に対する閲覧者の方向(すなわち、視線角度)を示す。この例では、視線角度は0である。
[0215]図6に示されるように、ZDPの位置はディスプレイ12の前の、アプリケーション42によって定義されるznearおよびzfarクリッピング面内にある。ZDPの位置は2つの要因に基づき得る。1つの要因は、選択されるDの値であり得る。別の要因は、左眼画像と右眼画像との間の視差を示すVPshiftの値(すなわち、水平視差値)であり得る。DおよびVPshiftの値を選択することによって、閲覧者は、ZDPの所望の位置を選択することができる。これらの例では、アプリケーション42によって生成される画像中のすべての物体は、ZDP内に(たとえば、ディスプレイ12の面内に制限されるのではなく、ディスプレイ12の前に)現れ得る。上で説明されたように、アプリケーションプロセッサ22がDおよびVPshiftの値を決定することが可能であり得る。
[0216]その上、いくつかの例では、VPshiftは必要ではないことがあり、閲覧者またはアプリケーションプロセッサ22がZDPの位置を決定することができる。これらの例では、グラフィックスドライバラッパー26は、一部の物体がZDPの前に現れ、一部の物体がZDPにおいて現れ、一部の物体がZDPの後に現れるように、ZDPの位置に基づいて、gl_Position.x変数およびgl_Position.y変数に記憶された値を修正することができる。
[0217]図7は、本開示で説明される1つまたは複数の技法による、左眼画像と右眼画像との間の水平視差を示す概念図である。たとえば、図7は右眼画像45Aと左眼画像45Bとを示す。この例では、水平視差はVPshift*2であると示される。図7に示されるように、水平視差は画像レベルにある(すなわち、右眼画像45Aおよび左眼画像45Bの中のすべての頂点の間の視差は同じである)。上で説明されたように、アプリケーションプロセッサ22または閲覧者が、VPshiftの値を選択することができる。VPshiftの値を選択することによって、閲覧者またはアプリケーションプロセッサ22は、ゼロ視差平面の位置を定義することができる。
[0218]図8は、本開示で説明される1つまたは複数の例示的技法を実施し得るグラフィックス処理ユニット(GPU)の例を示すブロック図である。たとえば、図8は、GPU 30のコンポーネントをより詳細に示す。図8に示されるように、GPU 30は、コマンドプロセッサ66と、シェーダプロセッサ32と、固定機能パイプライン34とを含む。コマンドプロセッサ66は、GPU 30とアプリケーションプロセッサ22との間のインターフェースとして機能し得る。たとえば、コマンドプロセッサ66は、アプリケーションプロセッサ22からコマンドを受け取ることができ、コマンドがシェーダプロセッサ32に転送されるべきか固定機能パイプライン34に転送されるべきか決定することができる。別の例として、コマンドプロセッサ66は、アプリケーションプロセッサ22から視線角度を受け取ることができる。
[0219]一例として、上で説明されたように、アプリケーション42を実行するアプリケーションプロセッサ22は、GPU 30に、修正された頂点シェーダ40のオブジェクトコードを実行するように命令することができる。この例では、コマンドプロセッサ66は、アプリケーションプロセッサ22からコマンドを受け取ることができ、シェーダプロセッサ32に、修正された頂点シェーダ40のオブジェクトコードを実行するように命令することができる。別の例として、いくつかの例では、上で説明されたように、グラフィックスドライバラッパー26は、アプリケーション42によって発行されたglViewportコマンドを修正し、修正されたglViewportコマンドをGPU 30に与えることができる。この例では、コマンドプロセッサ66は、修正されたglViewportコマンドを受け取り、このコマンドが固定機能パイプライン34のビューポート変換ユニット54のためのものであると決定することができる。コマンドプロセッサ66は、修正されたglViewportコマンドを、左眼画像および右眼画像のためのビューポートを適用するためのビューポート変換ユニット54に転送することができる。
[0220]たとえば、上で説明されたように、アプリケーション42は、GPU 30への送信をグラフィックスドライバラッパー26が阻止する、glDrawコマンドを発行することができる。glDrawコマンドは、修正された頂点シェーダ40のオブジェクトコードを実行するための第1の命令をシェーダプロセッサ42へグラフィックスドライバラッパー26が発行することを引き起こし得る。次に、シェーダプロセッサ42は、修正された頂点シェーダ40のオブジェクトコードを実行し、得られたクリッピング座標を、そのローカルメモリまたはシステムメモリ36に記憶する。
[0221]glDrawコマンドはまた、グラフィックスドライバラッパー26に、第1のglViewport命令を発行させ、この命令はコマンドプロセッサ66によって受け取られる。左眼画像と右眼画像との間の水平視差の画像レベルの調整が必要とされない例では、グラフィックスドライバラッパー26は、第1のglViewportコマンドを修正しなくてよい。左眼画像と右眼画像との間の水平視差の画像レベルの調整が必要とされる例では、グラフィックスドライバラッパー26は、視線角度およびVPshiftの値に基づいて、第1のglViewportコマンドを修正することができる。
[0222]次いで、グラフィックスドライバラッパー26は、コマンドプロセッサ66によって受け取られる第1のglDrawコマンドを発行する。コマンドプロセッサ66は、それに応答して、固定機能パイプライン34およびシェーダプロセッサ32の固定機能ユニットに、立体視ビューの第1の画像(たとえば、左眼画像)のためのグラフィックスコンテンツを生成するための、それぞれの機能を実行させる。たとえば、より詳細に論じられるように、第1のglDrawコマンドに応答して、水平視差の画像レベルの調整が所望されるとき、ビューポート変換ユニット54は、第1の画像をディスプレイの第1の部分に制限し、フラグメント単位動作ユニット62は、第1の画像のグラフィックスコンテンツをフレームバッファ64に出力する。
[0223]立体視ビューの第1の画像がフレームバッファ64に記憶された後、GPU 30は、立体視ビューの第2の画像のためのグラフィックスコンテンツを生成するためのステップを繰り返す。たとえば、グラフィックスドライバラッパー26は、修正された頂点シェーダ40のオブジェクトコードを実行するための第2の命令をシェーダプロセッサ32に発行する。次に、シェーダプロセッサ32は、修正された頂点シェーダ40のオブジェクトコードを実行し、得られたクリッピング座標を、そのローカルメモリまたはシステムメモリ36に記憶する。グラフィックスドライバラッパー26はまた、第2のglViewport命令を発行し、この命令はコマンドプロセッサ66によって受け取られる。やはり、glViewport命令は、画像レベルにおける視差の調整が望まれる場合は修正されてよく、画像レベルの視差の調整が望まれない場合は修正されなくてよい。
[0224]次いで、グラフィックスドライバラッパー26は、コマンドプロセッサ66によって受け取られる第2のglDrawコマンドを発行する。コマンドプロセッサ66は、それに応答して、固定機能パイプライン34およびシェーダプロセッサ32の固定機能ユニットに、立体視ビューの第2の画像(たとえば、右眼画像)のためのグラフィックスコンテンツを生成するための、それぞれの機能を実行させる。たとえば、第2のglDrawコマンドに応答して、水平視差の画像レベルの調整が所望されるとき、ビューポート変換ユニット54は、第2の画像をディスプレイの第2の部分に制限し、フラグメント単位動作ユニット62は、第2の画像のグラフィックスコンテンツをフレームバッファ64に出力する。
[0225]図8の破線ボックスに示されるように、シェーダプロセッサ32は、修正された頂点シェーダ40とフラグメントシェーダ58とを含む。破線ボックスは、シェーダプロセッサ32が実際には修正された頂点シェーダ40とフラグメントシェーダ58とを含まなくてもよいことを示すためのものである。むしろ、シェーダプロセッサ32は、修正された頂点シェーダ40およびフラグメントシェーダ58のオブジェクトコードを実行することができる。修正された頂点シェーダ40およびフラグメントシェーダ58のオブジェクトは、システムメモリ36に記憶され得る。
[0226]固定機能パイプライン34は、プリミティブ組立ユニット48、錐台ユニット50、透視除算ユニット52、ビューポート変換ユニット54、ラスタ化ユニット56、およびフラグメント単位動作ユニット62のような、1つまたは複数の固定機能ユニットを含み得る。固定機能パイプライン34のこれらの固定機能ユニットの各々は、特定のグラフィックス関連機能を実行するように配線接続されたハードウェアユニットでよい。固定機能パイプライン34のこれらの固定機能ユニットは、別個のコンポーネントとして示されるが、本開示の態様は、そのように限定されない。固定機能パイプライン34の固定機能ユニットの1つまたは複数は、共通の固定機能ユニットへと互いに組み合わされ得る。また、図8に示されるものよりも多くの、固定機能パイプライン34の固定機能ユニットがあってもよい。固定機能パイプライン34の1つまたは複数の固定機能ユニットは、理解しやすくするために、別々に示されている。
[0227]その上、固定機能パイプライン34の固定機能ユニットの具体的な順序は、例示の目的で示されており、限定的と見なされるべきではない。たとえば、固定機能パイプライン34の固定機能ユニットを並べ替えることが可能であり得る。一例として、フラグメント単位動作ユニット62の機能の1つは、重複するピクセルによって塞がれるピクセルを選別するためのものであってよい。この機能が、固定機能パイプライン34中でより早く実行されることが可能であってもよい。
[0228]固定機能パイプライン34のこれらの固定機能ユニットは、シェーダプロセッサ32と比較して、非常に限定された機能的な柔軟性を提供し得る。たとえば、シェーダプロセッサ32は、修正された頂点シェーダ40およびフラグメントシェーダ58のようなプログラマブルシェーダプログラムを実行するように特に設計され得る。これらのシェーダプログラムは、シェーダプロセッサ32を、シェーダプログラムによって定義された方式で機能させる。言い換えると、シェーダプログラムは、シェーダプロセッサ32の機能を定義することができるが、固定機能パイプライン34の固定機能ユニットの機能は設定される。
[0229]上で説明されたように、グラフィックスドライバラッパー26は、GPU 30に、修正された頂点シェーダ40のオブジェクトコードを2回実行するように命令することができ、ここで1回目の実行は、視線角度に基づく立体視ビューの画像の一方(たとえば、左眼画像)の頂点のクリッピング座標の生成のためであり、2回目の実行は、視線角度に基づく立体視ビューの他方の画像(たとえば、右眼画像)の頂点のクリッピング座標の生成のためである。修正された頂点シェーダ40のオブジェクトコードを実行するための、これらの命令の各々に応答して、コマンドプロセッサ66は、シェーダプロセッサ32に、修正された頂点シェーダ40のオブジェクトコードを取り出し、修正された頂点シェーダ40のオブジェクトコードを実行するように命令することができる。上で説明されたように、コンパイラ28は、修正された頂点シェーダのソースコードをコンパイルし、得られたオブジェクトコードを、修正された頂点シェーダ40のオブジェクトコードとして記憶することができる。
[0230]図8に示されるように、修正された頂点シェーダ40は、頂点アレイ46とテクスチャ60とを入力として受け取ることができる。頂点アレイ46は、上で説明されたように、アプリケーション42によって生成された頂点のピクセル値を生成するための情報(たとえば、頂点の座標、頂点の色値、および頂点の透明度値)を含み得る。たとえば、頂点アレイ46の頂点の座標は、アプリケーション42によって定義されるようなワールド座標であり得る。テクスチャ60は、グラフィックスコンテンツのより現実的なビューを提供するように、生成されたグラフィックスに重なる、テクスチャのピクセル値であり得る。
[0231]シェーダプロセッサ32上で実行される修正された頂点シェーダ40は、頂点の各々のクリッピング座標を生成することができる。たとえば、修正された頂点シェーダ40は、アプリケーション42によって定義され頂点アレイ46に記憶されたような頂点のワールド座標を、図1を参照して上で論じられたような式1の行列乗算を実行することによって、頂点の各々のクリッピング座標へと変換することができる。さらに、シェーダプロセッサ32上で実行される修正された頂点シェーダ40は、修正された頂点シェーダ40のオブジェクトコードの1回目の実行において左眼画像に対するずれを提供し、修正された頂点シェーダ40のオブジェクトコードの2回目の実行において右眼画像に対するずれを提供するために、視線角度に基づいて、頂点の各々のクリッピング座標に対するgl_Position.x変数とgl_Position.y変数とを更新することができる。また、修正された頂点シェーダ40は、追加的な従来の頂点シェーダタスクを実行することができる。たとえば、修正された頂点シェーダ40は、頂点に対して照明機能を実行することができる。
[0232]修正された頂点シェーダ40がモデルビュー変換(たとえば、gl_Position.x+=コマンドとgl_Position.y+=コマンドとを用いた変位を含む、クリッピング座標へのワールドビュー座標の変換)を実行した後、修正された頂点シェーダ40は、頂点のクリッピング座標を、固定機能パイプライン34のプリミティブ組立ユニット48に与える。プリミティブ組立ユニット48は、頂点をプリミティブへと組み立てるために、頂点のクリッピング座標を利用することができる。たとえば、プリミティブ組立ユニット48は、頂点のクリッピング座標に基づいて複数の三角形を組み立てることができ、ここで三角形の各々の頂点は、修正された頂点シェーダ40から受け取られた頂点に対応する。複数の三角形は、プリミティブの一例である。一般に、プリミティブ組立ユニット48は、受け取られた頂点のクリッピング座標に基づいて、受け取られた頂点を、任意の多角形へと組み立てることができる。
[0233]プリミティブ組立ユニット48は、組み立てられたプリミティブを錐台ユニット50に送ることができる。錐台ユニット50は、組み立てられたプリミティブがビューボリューム内にあるかどうか決定することができる。たとえば、上で述べられたように、OpenGL、OpenGL ES、およびOpenGL ES 2.0が、特定のビューボリュームを(fovx)として定義することができる。しかしながら、錐台は、たとえば、glFrustrum関数を使用して、ユーザにより定義可能であり得る。錐台ユニット50は、プリミティブ全体がビューボリューム内にあるか、全体がビューボリュームの外側にあるか、または部分的にビューボリューム内にあり部分的にビューボリュームの外側にあるかを決定することができる。錐台ユニット50は、さらなる処理から、全体がビューボリュームの外側にあるプリミティブを選別することができ、プリミティブの部分は、ビューボリュームの外側にあるものである。錐台ユニット50は、さらなる処理のために、全体がビューボリューム内にあるプリミティブと、ビューボリューム内にあるプリミティブの部分とを保つことができる。
[0234]錐台ユニット50は、残りのプリミティブと、プリミティブの部分とを、透視除算(perspective divide)ユニット52に送ることができる。透視除算ユニット52は、プリミティブの深度に基づいて、プリミティブを拡大または縮小することができる。たとえば、プリミティブの各々は、x、y、およびz座標によって定義され得る。z座標は、プリミティブがどれだけ近いか、または離れているかを示し得る。この段階で、GPU 30は、立体視ビューのための画像の1つのためのグラフィックスコンテンツを生成中であることに留意されたい。したがって、プリミティブの近接の概念は、立体視ビューではなくモノビューの文脈におけるものである。
[0235]たとえば、透視除算ユニット52は、一部のプリミティブを縮小し、他のプリミティブを拡大することができる。このことは、モノビューにおいて、拡大されたプリミティブと比較して縮小されたプリミティブがさらに離れているという知覚を生み出し得る。上で説明されたように、閲覧者が立体視ビューを知覚するのは、これらのモノビュー画像が表示されるときである。言い換えると、透視除算ユニット52は、左眼画像と右眼画像とを、ディスプレイの2Dエリアに表示される3D画像にさせることができる。閲覧者がこれらの3D画像を見ると、左眼画像および右眼画像における、gl_Position.x+=コマンドおよびgl_Position.y+=コマンドの追加によって引き起こされるずれが、閲覧者に、3Dボリュームを包含する立体3D(S3D)画像を知覚させる。
[0236]透視除算ユニット52は、プリミティブをビューポート変換ユニット54に送ることができる。ビューポート変換ユニット54は、画像のサイズと位置とを、定義されたビューポートに合うように修正する。たとえば、ビューポート変換ユニット54の前に、修正された頂点シェーダ40および固定機能パイプライン34の固定機能ユニットが、画像がディスプレイ全体に表示されるべきであるかのように、グラフィックスデータを処理する。ビューポート変換ユニット54の機能は、定義されたビューポートに画像が制限されるように、画像のサイズと場所とを修正することであり得る。
[0237]左眼画像中の頂点と右眼画像中の頂点との間の視差の頂点レベルの調整が望まれる例では、ビューポート変換ユニット54は、アプリケーション42によって定義される単一の画像のビューポートと同じとなるように左眼画像のビューポートを定義できることを理解されたい。同様に、この例では、ビューポート変換ユニット54は、アプリケーション42によって定義される単一の画像のビューポートと同じとなるように、右眼画像のビューポートを定義することができる。左眼画像中の頂点と右眼画像中の頂点との間の視差の頂点レベルの調整が望まれない例では、ビューポート変換ユニット54は、修正されたglViewportコマンドによって定義されるようなある部分に左眼画像を制限し、修正されたglViewportコマンドによって定義されるような別の部分に右眼画像を制限することができる。
[0238]たとえば、上で説明されたように、頂点シェーダ40、それは左眼画像のためのグラフィックスコンテンツ(たとえば、頂点のクリッピング座標)を生成し得る、のオブジェクトコードの1回目の実行の後、グラフィックスドライバラッパー26は、左眼画像をディスプレイ12のある部分(たとえば、ディスプレイ12の左半分)に制限するように、左眼画像のビューポートを修正することができる。たとえば、頂点シェーダ40のオブジェクトコードの1回目の実行の後、グラフィックスドライバラッパー26は、glViewport(0、0、幅、長さ)コマンド、それはアプリケーション42によって以前に発行され、GPU 30により阻止される、を、glViewport(−VPshift*cos(α)、−VPshift*sin(α)、幅−Vpshift*cos(α)、高さ−Vpshift*sin(α))に修正し、この第1の修正されたglViewportコマンドをGPU 40に与えることができる。コマンドプロセッサ66は、第1の修正されたglViewportコマンドをビューポート変換ユニット54に与えることができる。ビューポート変換ユニット54は次いで、透視除算ユニット52から受け取られたプリミティブのサイズを、この例では、これらのプリミティブがディスプレイの1つの半分に制限されるように修正することができる。
[0239]頂点シェーダ40のオブジェクトコードの2回目の実行の後、ビューポート変換ユニット54は、同様の機能を、右眼画像に対してではあるが実行することができる。たとえば、頂点シェーダ40のオブジェクトコードの2回目の実行は、右眼画像のグラフィックスコンテンツ(たとえば、頂点のクリッピング座標)の生成のためであってよい。頂点シェーダ40のオブジェクトコードのこの2回目の実行の後、glViewport(0、0、幅、長さ)コマンド、それはグラフィックスドライバラッパー26は、アプリケーション42によって以前に発行され、GPU 30により阻止される、を、glViewport(VPshift*cos(α)、VPshift*sin(α)、幅+VPshift*cos(α)、高さ+VPshift*sin(α))に修正し、この第2の修正されたglViewportコマンドをGPU 30に与えることができる。コマンドプロセッサ66は、第2の修正されたglViewportコマンドをビューポート変換ユニット54に転送することができる。このように、GPU 40は、左眼画像から右眼画像を生成するために深度情報に依存することなく、また、右眼画像から左眼画像を生成するために深度情報に依存することなく、アプリケーション32のランタイム中にアプリケーション32によって生成されたモノビュー画像から、立体視ビューのための左眼画像と右眼画像とを生成するように動作可能であり得る。
[0240]ビューポート変換ユニット54は、第1の修正されたglViewportコマンドおよび第2の修正されたglViewportコマンドの各々の後にビューポートを修正した後、プリミティブをラスタ化ユニット56に転送することができる。ラスタ化ユニット56は、プリミティブを、ディスプレイのピクセルへと変換することができる。たとえば、ラスタ化ユニット56は、ディスプレイのどのピクセルがプリミティブの各々によって包含されるかを決定することができる。ラスタ化ユニット56は、これらのピクセルの各々の、ディスプレイ上での場所を決定することもできる。
[0241]ラスタ化ユニット56は、そのグラフィックスデータをフラグメントシェーダ58に出力することができる。ピクセルシェーダと呼ばれることがあるフラグメントシェーダ58は、シェーダプロセッサ32上で実行されるシェーダプログラムであってよい。たとえば、フラグメントシェーダ58のためのソースコードはシステムメモリ36に記憶されてよく、コンパイラ28は、フラグメントシェーダ58のソースコードをコンパイルして、フラグメントシェーダ58のオブジェクトコードを生成することができる。あるいは、システムメモリ36は、フラグメントシェーダ58のためのオブジェクトコードを、必ずしもコンパイラ28によって生成されることなく記憶することができる。
[0242]フラグメントシェーダ58は、ディスプレイ上のピクセルの各々の色値を出力することができる。たとえば、フラグメントシェーダ58は、赤緑青(RGB)成分に基づいて、各ピクセルの色を定義することができる。フラグメントシェーダ58は、1つの説明のための例として、赤成分を定義するのに8ビット、緑成分を定義するのに8ビット、および青成分を定義するのに8ビットを利用することができる。フラグメントシェーダ58は、色値をフラグメント単位動作ユニット62に出力することができる。
[0243]フラグメント単位動作ユニット62は、可視ではないピクセルを選別することができる。たとえば、さらに離れた物体のピクセルは、フラグメント単位動作ユニット62がzバッファから決定することができる、より近い物体のピクセルと重複し得る。この重複により、さらに離れた物体のピクセルは、全体が塞がれることになり得る。この場合、フラグメント単位動作ユニット62は、重複させられたピクセルを選別することができる。フラグメント単位動作ユニット62は、ピクセルを一緒に混合することもできる。たとえば、重複するピクセルは、重複させられるピクセルを完全には塞がないように、半透明であってよい。この場合、フラグメント単位動作ユニット62は、これらのピクセルの色を一緒に混合することができる。
[0244]フラグメント単位動作ユニット62の出力は、ディスプレイ上のピクセルのピクセル値(たとえば、色)であり得る。フラグメント単位動作ユニット62は、ピクセル値を、一時的な記憶のために、システムメモリ36のフレームバッファ64に出力することができる。フレームバッファ64は、ディスプレイ上のピクセルの各々のピクセル値を出力することができる。
[0245]フレームバッファ64は、記憶位置の2Dアレイと見なされ得る。フレームバッファ64を伴う記憶位置の数は、ディスプレイ12のピクセルの数の2倍であり得る。また、フレームバッファ64内の2つの記憶位置は、ディスプレイ上の1つの位置に対応し得る。たとえば、フレームバッファ64は、2つの半分を含んでよく、各々の半分は、ディスプレイ12の全体のための記憶位置を含む。この例では、フレームバッファ64内の、第1の半分の中の左上の記憶位置および第2の半分の中の左上の記憶位置は、ディスプレイの左上のピクセルに対応してよく、フレームバッファ64内の、第1の半分の中の左上の記憶位置の右側の記憶位置および第2の半分の中の左上の記憶位置の右側の記憶位置は、ディスプレイの左上のピクセルの右側のピクセルに対応してよく、以下同様である。
[0246]第1のglDrawコマンドの完了の後で、第1の半分のフレームバッファ64の中に位置する記憶位置は、左眼画像のピクセル値を記憶することができる。同様に、第2のglDrawコマンドの完了の後で、フレームバッファ64の第2の半分の中に位置する記憶位置は、右眼画像のピクセル値を記憶することができる。したがって、第1および第2のglDrawコマンドの完了の後、フレームバッファ64は、左眼画像のピクセル値と、右眼画像のピクセル値とを記憶することができる。
[0247]図9は、本開示で説明される1つまたは複数の例示的な技法を実施し得るグラフィックス処理ユニット(GPU)の別の例を示すブロック図である。たとえば、図9は、OpenGL ES 2.0グラフィックスパイプラインを示し、本開示で説明される技法がOpenGL ES 2.0グラフィックスパイプラインにおいて実施され得る方式を示す。図8と同様の図9のユニットは、同じ参照番号が与えられており、図9に関してさらに説明されない。
[0248]図9は、グラフィックスドライバ24が実装するAPIできる、OpenGL ES 2.0 API 66を示す。言い換えると、OpenGL ES 2.0 API 66は、グラフィックスドライバ24の一例であり得る。示されるように、OpenGL ES 2.0は、頂点アレイ46と、修正された頂点シェーダ40に対するコマンドと、テクスチャ60と、フラグメントシェーダ58に対するコマンドとを出力する。修正された頂点シェーダ40は、頂点アレイ46からのワールド座標頂点とテクスチャ60からのテクスチャとを受け取り、視線角度に基づいてクリッピング座標を作成する。プリミティブ組立ユニット48、ラスタ化ユニット56、フラグメントシェーダ58、フラグメント単位動作ユニット62、およびフレームバッファ64は、図7に関して説明された機能と同様の機能を実行することができる。
[0249]図10A〜図10Cは、本開示で説明される1つまたは複数の技法による、例示的な結果を示す概念図である。図10A〜図10Cの例では、アプリケーション42によって生成される単一の画像の解像度はディスプレイ12の解像度の半分であり得る。したがって、図10A〜図10Cでは、左眼画像はディスプレイ12の半分に現れ、右眼画像はディスプレイ12の他の半分に現れる。たとえば、図10Aは左眼画像68Aと右眼画像68Bとを示し、図10Bは左眼画像70Aと右眼画像70Bとを示し、図10Cは左眼画像72Aと右眼画像72Bとを示す。図10A〜図10Cでは、閲覧者の左眼は左眼画像のみを見ることができ、右眼画像を見ることができず、閲覧者の右眼は右眼画像のみを見ることができ、左眼画像を見ることができない。
[0250]図10Aは、視線角度が0である(すなわち、横向きモードにある)ときの例示的な結果を示す。図10Bは、閲覧者がデバイス10を垂直方向に回転して、視線角度が図10Aの例に対してメイ90°になる例を示す。図10Bの例では、90°だけデバイス10の閲覧者方向、レンダリングされた画像コンテンツが90°だけ変化しても、左眼画像70Aと右眼画像70Bとの間の視差はそれでも水平な向きにある。したがって、図9Cに示されるもののような任意の所与の視線角度に対して、左眼画像72Aと右眼画像72Bとの間の視差は依然として水平な向きにある。
[0251]図11は、図5の例示的なデバイスをさらに詳細に示すブロック図である。たとえば、図11は、図5のデバイス10をさらに詳細に示す。たとえば、上で示されるように、デバイス10の例は、限定はされないが、モバイルワイヤレス電話、PDA、ビデオディスプレイを含むビデオゲーミングコンソール、モバイルビデオ会議ユニット、ラップトップコンピュータ、デスクトップコンピュータ、テレビジョンセットトップボックスなどを含む。
[0252]図11に示されるように、デバイス10は、ディスプレイ12と、アプリケーションプロセッサ22と、GPU 30と、フレームバッファ64を含むシステムメモリ36と、カメラプロセッサ44と、送受信機モジュール74と、ユーザインターフェース76と、ディスプレイプロセッサ78と、カメラ80とを含み得る。ディスプレイ12、アプリケーションプロセッサ22、GPU 30、システムメモリ36、1つまたは複数のセンサ42、およびカメラプロセッサ44は、図1および図5に示されるものと実質的に同様または同一であり得る。簡潔のために、図11には示されるが図1および図5には示されていないコンポーネントのみが、詳細に説明される。
[0253]デバイス10は、図11に示されるように、明快のために図11に示されていない追加のモジュールまたはユニットを含み得る。たとえば、デバイス10は、デバイス10がモバイルワイヤレス電話である例において電話通信を実現するために、そのいずれもが図11に示されていないスピーカーおよびマイクロフォンを含んでよく、またはデバイス10がメディアプレーヤである場合にスピーカーを含んでよい。さらに、デバイス10に示される様々なモジュールおよびユニットは、デバイス10のすべての例において必要であるとは限らない。たとえば、ユーザインターフェース76およびディスプレイ12は、デバイス10がデスクトップコンピュータ、または外部ユーザインターフェースもしくはディスプレイとインターフェースするように備えられた他のデバイスである例において、デバイス10の外部にあってよい。
[0254]カメラ80は、ビデオまたは画像を撮影するように構成された前面光学カメラであり得る。カメラ80は、撮影されたビデオまたは画像をカメラプロセッサ44に出力することができる。カメラプロセッサ44は、上で説明されたような撮影されたビデオまたは画像に基づいて閲覧者の方向を決定することができる。
[0255]ユーザインターフェース76の例は、限定はされないが、トラックボール、マウス、キーボード、および他のタイプの入力デバイスを含む。ユーザインターフェース76はまた、タッチスクリーンであってよく、ディスプレイ12の一部として組み込まれ得る。送受信機モジュール74は、デバイス10と別のデバイスまたはネットワークとの間のワイヤレス通信または有線通信を可能にするための回路を含み得る。送受信機モジュール74は、有線通信またはワイヤレス通信のための1つまたは複数の変調器と、復調器と、増幅器と、アンテナと、他のそのような回路とを含み得る。
[0256]ディスプレイプロセッサ78は、ディスプレイ12に立体視ビューを表示させるように構成され得る。ディスプレイ12に、立体ビューを表示させるためにディスプレイプロセッサ78が利用することができる様々な技法があってよく、本開示の態様は、これらの技法のうちいずれをも利用することができる。たとえば、ディスプレイプロセッサ78は、立体視ビューを与えるために、フレームバッファ64の一方の半分から左眼画像を取り出し、フレームバッファ64の他方の半分から右眼画像を取り出し、2つの画像を一緒に交互配置することができる。
[0257]別の例として、ディスプレイプロセッサ78は、ディスプレイ12のリフレッシュレートを制御することができる。この例では、各リフレッシュサイクル中に、ディスプレイプロセッサ78は、左眼画像と右眼画像との間で循環することができる。たとえば、ディスプレイプロセッサ78は、フレームバッファ64の一方の半分から左眼画像を取り出し、ディスプレイ12の全体に左眼画像を拡張し、1つのリフレッシュサイクルの間ディスプレイ12に左眼画像を表示することができる。次いで、次のリフレッシュサイクルの間、ディスプレイプロセッサ78は、フレームバッファ64の他方の半分に記憶された右眼画像に対してではあるが、実質的に同様の機能を実行することができる。言い換えると、ディスプレイ12は、左眼画像を表示し、次いで右眼画像を表示し、次いで左眼画像を表示することができ、以下同様である。
[0258]閲覧者は、ディスプレイプロセッサ78のリフレッシュレートと同期する特殊な眼鏡を着用していることがある。たとえば、ディスプレイ12が左眼画像を表示している間、特殊な眼鏡は、閲覧者の左眼のみが左眼画像を捉えるように、右レンズのシャッターを閉じることができる。次いで、ディスプレイ12が右眼画像を表示している間、特殊な眼鏡は、閲覧者の右眼のみが右眼画像を捉えるように、左レンズのシャッターを閉じることができ、以下同様である。リフレッシュレートが十分に高速である場合、閲覧者は、画像がディスプレイ12から飛び出し、またはディスプレイに押し込まれて、3Dボリュームを取り囲む、立体視ビューを知覚する。
[0259]いくつかの例では、いくつかの従来のディスプレイプロセッサは、ディスプレイ12に立体視ビューを表示させるように構成されなくてもよい。これらの例では、閲覧者は、デバイス10を、ディスプレイ12に立体視ビューを提示させるように構成された、ディスプレイプロセッサ78のようなディスプレイプロセッサを含むディスプレイに結合し得る。たとえば、閲覧者は、デバイス10を、送受信機モジュール74を介して立体視ビュー対応テレビジョンに結合し得る。たとえば、閲覧者は、送受信機モジュール74を、高解像度マルチメディアインターフェース(HDMI(登録商標))配線を介してテレビジョンに結合し得る。この例では、アプリケーションプロセッサ22またはGPU 30は、送受信機モジュール74に、フレームバッファ64に記憶されたピクセル値をテレビジョンのディスプレイプロセッサへ送信するように命令し得る。次いで、このテレビジョンのディスプレイプロセッサは、テレビジョンに、立体視ビューを形成するように左眼画像と右眼画像とを表示させ得る。
[0260]図12は、本開示で説明される1つまたは複数の例示的な技法による例示的な動作を示すフローチャートである。説明のために、図3への参照を行う。
[0261]プロセッサ22は、モノビューのための画像を生成するためにアプリケーション42を実行することができる(82)。プロセッサ22は、アプリケーション42のランタイム中に、図12の他のブロックを実施することができる。たとえば、プロセッサ22は、ディスプレイ12に対する視線角度を決定することができる。いくつかの例では、プロセッサ22は、立体視ビューの生成ごとに1回、ディスプレイ12に対する視線角度を決定することができる。視線角度を決定するために、プロセッサ22は、たとえばカメラプロセッサ44によって少なくとも1つの閲覧者の方向を決定し、たとえば1つまたは複数のセンサ42によってディスプレイの方向を決定することができる。
[0262]プロセッサ22は、グラフィックスドライバラッパー26を介して、頂点シェーダ38のための命令を受け取ることができる(84)。頂点シェーダ38は、アプリケーション42の実行によって生成されたモノビューの画像に対して動作するように構成され得る。
[0263]プロセッサ22は、グラフィックスドライバラッパー26を介して、修正された頂点シェーダ(たとえば、命令の包含の後にコンパイラ28が頂点シェーダ38をコンパイルした後の修正された頂点シェーダ40)を生成するために、視線角度に基づく1つまたは複数の命令を含めるように頂点シェーダの命令を修正することができる(86)。この例では、修正された頂点シェーダ40は、GPU 30のシェーダプロセッサ32で実行されるとき、立体視ビューの頂点の頂点座標を生成することができる。
[0264]たとえば、プロセッサ22は、グラフィックスドライバラッパー26を介して、アプリケーション42によって生成されたモノビューの画像の頂点の第1のクリッピング座標(たとえば、xclip)を視線角度に基づいて修正する第1の命令を、頂点シェーダ38に追加することができる。たとえば、グラフィックスドライバラッパー26は、gl_Position.x+=Xというコマンドを追加することができ、ここでXは、修正された頂点シェーダ40の1回目の実行ではD*cos(α)に等しく、修正された頂点シェーダ40の2回目の実行では−D*cos(α)に等しい。プロセッサ22は、グラフィックスドライバラッパー26を介して、アプリケーション42によって生成されたモノビューの画像の頂点の第2のクリッピング座標(たとえば、yclip)を視線角度に基づいて修正する第2の命令を、頂点シェーダ38に追加することができる。たとえば、グラフィックスドライバラッパー26は、gl_Position.y+=Y*幅/高さを追加することができ、ここで幅および高さはディスプレイ12の幅および高さであり、Yは、修正された頂点シェーダ40の1回目の実行ではD*sin(α)に等しく、修正された頂点シェーダ40の2回目の実行では−D*sin(α)に等しい。
[0265]いくつかの例では、選択肢として、グラフィックスドライバラッパー26が追加する第1の命令および第2の命令は、ゼロ視差平面の位置にも基づき得る。たとえば、グラフィックスドライバラッパー26は、gl_Position.x+=X*(1−gl_Position.w/ZDPloc)を追加することができ、gl_Position.y+=Y*幅/高さ*(1−gl_Position.w/ZDPloc)を追加することができる。gl_Position.w変数は、−zworldに等しいwclip座標を記憶し、zworldはアプリケーション42によって定義されるような頂点のz座標である。ZDPlocは、ディスプレイ12に対するゼロ視差平面の位置を示す。
[0266]選択肢として、プロセッサ22は、グラフィックスドライバラッパー26を介して、アプリケーション42によって発行されるビューポートコマンド(たとえば、glViewport)を修正することができる(90)。ビューポートコマンドのこの修正は任意選択であり得るので、点線で示される。プロセッサ22は、グラフィックスドライバラッパー26を介して、立体視ビューの第1の画像と第2の画像との間の水平視差(たとえば、左眼画像と右眼画像との間の水平視差)を調整するために、glViewportコマンドを修正することができる。水平視差を調整することによって、グラフィックスドライバラッパー26は、ゼロ視差平面の位置を調整するために、修正されたglViewportコマンドを利用することができる。
[0267]プロセッサ22は、グラフィックスドライバラッパー26を介して、修正された頂点シェーダ40を実行するようにGPU 30に命令することができる(92)。たとえば、プロセッサ22は、グラフィックスドライバラッパー26を介して、視線角度に基づいて立体視ビューの第1の画像(たとえば、左眼画像)を生成するために、シェーダプロセッサ32上で修正された頂点シェーダ40のオブジェクトコードの第1のインスタンスを実行するように、GPU 30に命令することができる。プロセッサ22は、グラフィックスドライバラッパー26を介して、視線角度に基づいて立体視ビューの第2の画像(たとえば、右眼画像)を生成するために、シェーダプロセッサ32上で修正された頂点シェーダ40のオブジェクトコードの第2のインスタンスを実行するように、GPU 30に命令することができる。
[0268]以下の擬似コードは、グラフィックスドライバラッパー26およびアプリケーション42の機能の例を与える。この擬似コードは、理解を助けることが意図されており、限定的と見なされるべきではない。
1.グラフィックスドライバラッパー26が、頂点シェーダ28のソースコードを途中で捕えるために、アプリケーション42によって発行されたglShaderSourceを途中で捕える。
2.グラフィックスドライバラッパー26が、「uniform float X」と「uniform float Y」とを頂点シェーダ38の命令に挿入し、ここで、「uniform」はプログラマブルシェーダに関して、OpenGLおよびOpenGL ESにおいてユーザにより定義される標準的な属性変数である。
3.グラフィックスドライバラッパー26が、頂点シェーダ38のソースコードに、「gl_Position.x+=X」および「gl_Position.x+=Y*幅/高さ」コマンドを挿入する。
3a.グラフィックスドライバラッパー26が、「gl_Position.x+=X*(1−gl_Position.w/ZDPloc)」および「gl_Position.y+=Y*幅/高さ*(1−gl_Position.w/ZDPloc)」を挿入する。
4.アプリケーション42が、修正された頂点シェーダ40のオブジェクトコードを生成するように、コンパイラ28に、頂点シェーダ38の修正されたソースコード命令をコンパイルさせる、glCompileShaderコマンドを実行する。
5.アプリケーション42が、修正された頂点シェーダ40のオブジェクトコードへのリンクに対して次のコマンドを実行する。
programObject=glCreateProgram();
glAttachShader(programObject、vertexShader);
glAttachShader(programObject、fragmentShader);
glLinkProgram(programObject)
6.グラフィックスドライバラッパー26が、アプリケーション42によって呼び出されるときにglDrawコマンド(たとえば、glDrawArraysおよびglDrawElements)を途中で捕え、コマンドがGPU 30に送信されるのを阻止する。
7.グラフィックスドライバラッパー26が次のコマンドを発行する:
glGetInteger(GL_CURRENT_PROGRAM、&program);//現在の頂点シェーダに対するポインタを得るため
いくつかの例では、上で説明されたように左眼画像のためのビューポートを生成するように、glViewportコマンドを修正する。
p1=glGetUniformLocation(program、X);uniform Xに対するポインタを得るため
p2=glGetUniformLocation(program、Y);uniform Yに対するポインタを得るため
glUniform1f(p1、D*cos(α));//D*cos(α)に等しくXの値を設定するため
glUniform1f(p2、D*sin(α));//D*sin(α)に等しくYの値を設定するため
glDrawコマンド//GPU 30に左眼画像のためのグラフィックスコンテンツを生成させるため
8.右眼画像のためのグラフィックスコンテンツを生成するための次の修正を伴って、7から続くステップを繰り返す:
上で説明されたように右眼画像のためのビューポートを生成するように、glViewportコマンドを修正する。
glUniform1f(p1、−D*cos(α));//−D*cos(α)に等しくXの値を設定するため
glUniform1f(p2、−D*sin(α));//−D*sin(α)に等しくYの値を設定するため
glDrawコマンド//GPU 30に右眼画像のためのグラフィックスコンテンツを生成させるため
[0269]1つまたは複数の例では、説明された機能は、ハードウェア、ソフトウェア、ファームウェア、またはそれらの任意の組合せで実装され得る。ソフトウェアで実装される場合、機能は、1つまたは複数の命令またはコードとしてコンピュータ可読媒体上に記憶され得る。コンピュータ可読媒体はコンピュータデータ記憶媒体を含み得る。データ記憶媒体は、本開示で説明された技法を実装するための命令、コードおよび/またはデータ構造を取り出すために、1つもしくは複数のコンピュータ、または1つもしくは複数のプロセッサによってアクセスされ得る任意の利用可能な媒体であり得る。限定ではなく、例として、そのようなコンピュータ可読媒体は、ランダムアクセスメモリ(RAM)、読取り専用メモリ(ROM)、EEPROM、CD−ROMもしくは他の光ディスクストレージ、磁気ディスクストレージもしくは他の磁気ストレージデバイス、または命令もしくはデータ構造の形態の所望のプログラムコードを記憶するために使用されコンピュータによってアクセスされ得る、任意の他の媒体を備え得る。本明細書で使用されるディスク(disk)およびディスク(disc)は、コンパクトディスク(disc)(CD)、レーザーディスク(登録商標)(disc)、光ディスク(disc)、デジタル多用途ディスク(disc)(DVD)、フロッピー(登録商標)ディスク(disk)およびBlu−ray(登録商標)ディスク(disc)を含み、ディスク(disk)は、通常、データを磁気的に再生し、ディスク(disc)は、データをレーザーで光学的に再生する。上記の組合せもコンピュータ可読媒体の範囲内に含まれるべきである。
[0270]コードは、1つもしくは複数のデジタル信号プロセッサ(DSP)などの1つもしくは複数のプロセッサ、汎用マイクロプロセッサ、特定用途向け集積回路(ASIC)、フィールドプログラマブル論理アレイ(FPGA)、または他の等価な集積回路もしくはディスクリート論理回路によって実行され得る。したがって、本明細書で使用される「プロセッサ」という用語は、前述の構造、または本明細書で説明される技法の実装に好適な任意の他の構造のいずれかを指し得る。また、本技法は、1つまたは複数の回路または論理要素中で完全に実装され得る。
[0271]本開示の技法は、ワイヤレスハンドセット、集積回路(IC)、またはICのセット(すなわち、チップセット)を含む、多種多様なデバイスまたは装置において実装され得る。本開示では、開示されている技法を実行するように構成されたデバイスの機能的態様を強調するために様々なコンポーネント、モジュール、またはユニットが説明されるが、それらのコンポーネント、モジュール、またはユニットは、必ずしも異なるハードウェアユニットによる実現を必要とするとは限らない。むしろ、上で説明されたように、様々なユニットが、好適なソフトウェアおよび/またはファームウェアとともに、上で説明された1つまたは複数のプロセッサを含めて、ハードウェアユニットにおいて組み合わせられるか、または相互動作ハードウェアユニットの集合によって与えられ得る。
[0272]様々な例が説明されてきた。これら例および他の例は、以下の特許請求の範囲内にある。
以下に、本願出願の当初の特許請求の範囲に記載された発明を付記する。
[C1]
グラフィックス処理のための方法であって、
プロセッサによって、ディスプレイに対する視線角度を決定することと、
前記プロセッサによって、モノビューの画像に対して動作するように構成される頂点シェーダに関する命令を受け取ることと、
前記プロセッサによって、修正された頂点シェーダを生成するために、前記視線角度に基づく1つまたは複数の命令を含めるように前記頂点シェーダに関する前記命令を修正すること、ここにおいて、前記修正された頂点シェーダは、実行されると、立体視ビューの頂点の頂点座標を生成する、と、
前記プロセッサによって、前記修正された頂点シェーダを実行するようにグラフィックス処理ユニット(GPU)に命令することと、を備える、方法。
[C2]
前記GPUに命令することが、
前記視線角度に基づいて前記立体視ビューの第1の画像を生成するように前記修正された頂点シェーダのオブジェクトコードの第1のインスタンスを実行するように前記GPUに命令することと、
前記視線角度に基づいて前記立体視ビューの第2の画像を生成するように前記修正された頂点シェーダの前記オブジェクトコードの第2のインスタンスを実行するように前記GPUに命令することと、を備える、C1に記載の方法。
[C3]
前記命令を修正することが、
前記視線角度に基づいて前記モノビューの前記画像の頂点の第1のクリッピング座標を修正する第1の命令を前記頂点シェーダに追加することと、
前記視線角度に基づいて前記モノビューの前記画像の前記頂点の第2のクリッピング座標を修正する第2の命令を前記頂点シェーダに追加することと、を備える、C1に記載の方法。
[C4]
前記命令を修正することが、
前記視線角度およびゼロ視差平面の位置に基づいて前記モノビューの前記画像の頂点の第1のクリッピング座標を修正する第1の命令を前記頂点シェーダに追加することと、
前記視線角度および前記ゼロ視差平面の前記位置に基づいて前記モノビューの前記画像の前記頂点の第2のクリッピング座標を修正する第2の命令を前記頂点シェーダに追加することと、を備える、C1に記載の方法。
[C5]
前記モノビューの前記画像のビューポートを定義する命令を、前記立体視ビューの第1の画像のためのビューポートを定義する命令と、前記立体視ビューの第2の画像のためのビューポートを定義する命令とに修正することをさらに備える、C1に記載の方法。
[C6]
前記モノビューの前記画像の前記ビューポートを定義する前記命令を修正することが、前記立体視ビューの前記第1の画像と前記立体視ビューの前記第2の画像との間の水平視差を調整することを備える、C5に記載の方法。
[C7]
前記水平視差を調整することが、ゼロ視差平面の位置を調整するために、前記立体視ビューの前記第1の画像と前記立体視ビューの前記第2の画像との間の前記水平視差を調整することを備える、C6に記載の方法。
[C8]
前記プロセッサによって、前記モノビューの前記画像を生成するためにアプリケーションを実行することをさらに備え、
前記頂点シェーダに関する前記命令を修正することが、前記アプリケーションの前記実行の間に前記頂点シェーダに関する前記命令を修正することを備える、C1に記載の方法。
[C9]
前記視線角度を決定することが、前記立体視ビューの生成ごとに1回、前記視線角度を決定することを備える、C1に記載の方法。
[C10]
前記ディスプレイに対する前記視線角度を決定することが、
閲覧者の方向とディスプレイの方向の少なくとも1つを決定することと、
前記決定された閲覧者の方向と前記決定されたディスプレイの方向の少なくとも1つに基づいて前記視線角度を決定することと、を備える、C1に記載の方法。
[C11]
命令を受け取ることが、前記プロセッサ上で実行されるグラフィックスドライバラッパーによって、前記頂点シェーダに関する前記命令を受け取ることを備え、
前記命令を修正することが、前記プロセッサ上の前記グラフィックスドライバラッパー実行によって、前記頂点シェーダの前記命令を修正することを備える、C1に記載の方法。
[C12]
グラフィックス処理ユニット(GPU)と、
プロセッサであって、
ディスプレイに対する視線角度を決定することと、
修正された頂点シェーダを生成するように、前記視線角度に基づく1つまたは複数の命令を含めるように頂点シェーダの命令を修正すること、ここにおいて、前記修正された頂点シェーダは、実行されると、立体視ビューの頂点の頂点座標を生成する、と、
前記修正された頂点シェーダを実行するように前記GPUに命令することと、
を行うように構成されるプロセッサと、を備える、装置。
[C13]
前記修正された頂点シェーダを実行するように前記GPUに命令するために、前記プロセッサが、
前記視線角度に基づいて前記立体視ビューの第1の画像を生成するように前記修正された頂点シェーダのオブジェクトコードの第1のインスタンスを実行するように前記GPUに命令し、
前記視線角度に基づいて前記立体視ビューの第2の画像を生成するように前記修正された頂点シェーダの前記オブジェクトコードの第2のインスタンスを実行するように前記GPUに命令する、ように構成される、C12に記載の装置。
[C14]
前記命令を修正するために、前記プロセッサが、
前記視線角度に基づいてモノビューの画像の頂点の第1のクリッピング座標を修正する第1の命令を前記頂点シェーダに追加し、
前記視線角度に基づいて前記モノビューの前記画像の前記頂点の第2のクリッピング座標を修正する第2の命令を前記頂点シェーダに追加する、ように構成される、C12に記載の装置。
[C15]
前記命令を修正するために、前記プロセッサが、
前記視線角度およびゼロ視差平面の位置に基づいてモノビューの画像の頂点の第1のクリッピング座標を修正する第1の命令を前記頂点シェーダに追加し、
前記視線角度および前記ゼロ視差平面の前記位置に基づいて前記モノビューの前記画像の前記頂点の第2のクリッピング座標を修正する第2の命令を前記頂点シェーダに追加する、ように構成される、C12に記載の装置。
[C16]
前記プロセッサが、
モノビューの画像のビューポートを定義する命令を、前記立体視ビューの第1の画像のためのビューポートを定義する命令と、前記立体視ビューの第2の画像のためのビューポートを定義する命令とに修正するように構成される、C12に記載の装置。
[C17]
前記モノビューの前記画像の前記ビューポートを定義する前記命令を修正するために、前記プロセッサが、前記立体視ビューの前記第1の画像と前記立体視ビューの前記第2の画像との間の水平視差を調整するように構成される、C16に記載の装置。
[C18]
前記水平視差を修正するために、前記プロセッサが、
ゼロ視差平面の位置を調整するために、前記立体視ビューの前記第1の画像と前記立体視ビューの前記第2の画像との間の前記水平視差を調整するように構成される、C17に記載の装置。
[C19]
前記プロセッサが、モノビューの画像を生成するようにアプリケーションを実行し、前記アプリケーションの前記実行の間に前記頂点シェーダの前記命令を修正するように構成される、C12に記載の装置。
[C20]
前記視線角度を決定するために、前記プロセッサが、前記立体視ビューの生成ごとに1回、前記視線角度を決定するように構成される、C12に記載の装置。
[C21]
前記視線角度を決定するために、前記プロセッサが、
閲覧者の方向とディスプレイの方向の少なくとも1つを決定し、
前記決定された閲覧者の方向と前記決定されたディスプレイの方向の少なくとも1つに基づいて前記視線角度を決定するように構成される、C12に記載の装置。
[C22]
前記プロセッサが、グラフィックスドライバラッパーを実行するように構成され、前記プロセッサが、前記グラフィックスドライバラッパーを介して前記頂点シェーダの前記命令を修正するように構成される、C12に記載の装置。
[C23]
モバイルワイヤレス電話、携帯情報端末(PDA)、ビデオゲームコンソール、モバイルビデオ会議ユニット、ラップトップコンピュータ、デスクトップコンピュータ、デジタルメディアプレーヤ、およびタブレットコンピューティングデバイスの1つを備える、C12に記載の装置。
[C24]
加速度計、ジャイロスコープ、およびカメラの少なくとも1つをさらに備え、
前記プロセッサが、前記加速度計、前記ジャイロスコープ、および前記カメラの1つまたは複数からの出力に基づいて、前記ディスプレイに対する前記視線角度を決定するように構成される、C12に記載の装置。
[C25]
ディスプレイに対する視線角度を決定し、モノビューの画像に対して動作するように構成される頂点シェーダに関する命令を受け取ることと、修正された頂点シェーダを生成するように前記視線角度に基づく1つまたは複数の命令を含めるように前記頂点シェーダに関する前記命令を修正すること、ここにおいて、前記修正された頂点シェーダは、実行されると、立体視ビューの頂点の頂点座標を生成する、と、前記修正された頂点シェーダを実行するようにグラフィックス処理ユニット(GPU)に命令することと、を行うように構成される、プロセッサ。
[C26]
グラフィックス処理ユニット(GPU)と、
ディスプレイに対する視線角度を決定するための手段と、
モノビューの画像に対して動作するように構成される頂点シェーダに関する命令を受け取るための手段と、
修正された頂点シェーダを生成するように、前記視線角度に基づく1つまたは複数の命令を含めるように前記頂点シェーダに関する前記命令を修正するための手段、ここにおいて、前記修正された頂点シェーダは、実行されると、立体視ビューの頂点の頂点座標を生成する、と、
前記修正された頂点シェーダを実行するように前記GPUに命令するための手段と、を備える、装置。
[C27]
プロセッサをさらに備え、前記プロセッサが、決定するための前記手段と、受け取るための前記手段と、修正するための前記手段と、命令するための前記手段とを含む、C26に記載の装置。
[C28]
命令するための前記手段が、
前記視線角度に基づいて前記立体視ビューの第1の画像を生成するように前記修正された頂点シェーダのオブジェクトコードの第1のインスタンスを実行するように前記GPUに命令するための第1の手段と、
前記視線角度に基づいて前記立体視ビューの第2の画像を生成するように前記修正された頂点シェーダの前記オブジェクトコードの第2のインスタンスを実行するように前記GPUに命令するための第2の手段と、を備える、C26に記載の装置。
[C29]
修正するための前記手段が、
前記視線角度に基づいて前記モノビューの前記画像の頂点の第1のクリッピング座標を修正する第1の命令を前記頂点シェーダに追加するための第1の手段と、
前記視線角度に基づいて前記モノビューの前記画像の前記頂点の第2のクリッピング座標を修正する第2の命令を前記頂点シェーダに追加するための第2の手段と、を備える、C26に記載の装置。
[C30]
修正するための前記手段が、
前記視線角度およびゼロ視差平面の位置に基づいて前記モノビューの前記画像の頂点の第1のクリッピング座標を修正する第1の命令を前記頂点シェーダに追加するための第1の手段と、
前記視線角度および前記ゼロ視差平面の前記位置に基づいて前記モノビューの前記画像の前記頂点の第2のクリッピング座標を修正する第2の命令を前記頂点シェーダに追加するための第2の手段と、を備える、C26に記載の装置。
[C31]
前記モノビューの前記画像のビューポートを定義する命令を、前記立体視ビューの第1の画像のためのビューポートを定義する命令と、前記立体視ビューの第2の画像のためのビューポートを定義する命令とに修正するための手段をさらに備える、C26に記載の装置。
[C32]
前記モノビューの前記画像の前記ビューポートを定義する前記命令を修正するための前記手段が、前記立体視ビューの前記第1の画像と前記立体視ビューの前記第2の画像との間の水平視差を調整するための手段を備える、C31に記載の装置。
[C33]
前記水平視差を調整するための前記手段が、ゼロ視差平面の位置を調整するために、前記立体視ビューの前記第1の画像と前記立体視ビューの前記第2の画像との間の前記水平視差を調整するための手段を備える、C32に記載の装置。
[C34]
前記モノビューの前記画像を生成するようにアプリケーションを実行するための手段をさらに備え、
前記頂点シェーダに関する前記命令を修正するための前記手段が、前記アプリケーションの前記実行の間に前記頂点シェーダに関する前記命令を修正するための手段を備える、C26に記載の装置。
[C35]
前記視線角度を決定するための前記手段が、前記立体視ビューの生成ごとに1回、前記視線角度を決定するための手段を備える、C26に記載の装置。
[C36]
前記ディスプレイに対する前記視線角度を決定するための前記手段が、
閲覧者の方向とディスプレイの方向の少なくとも1つを決定するための第1の手段と、
前記決定された閲覧者の方向と前記決定されたディスプレイの方向の少なくとも1つに基づいて前記視線角度を決定するための第2の手段と、を備える、C26に記載の装置。
[C37]
実行されると、1つまたは複数のプロセッサに、
ディスプレイに対する視線角度を決定することと、
モノビューの画像に対して動作するように構成される頂点シェーダに関する命令を受け取ることと、
修正された頂点シェーダを生成するように、前記視線角度に基づく1つまたは複数の命令を含めるように前記頂点シェーダに関する前記命令を修正することと、ここにおいて、前記修正された頂点シェーダは、実行されると、立体視ビューの頂点の頂点座標を生成する、
前記修正された頂点シェーダを実行するようにグラフィックス処理ユニット(GPU)へ命令することと、を行わせる命令を記憶したコンピュータ可読記憶媒体。