(57)【要約】  本開示の例示的な技法は、モノビューを生成するように設計されたアプリケーションから、立体視ビューを生成することを対象とする。たとえば、本技法は、視線角度に基づいて頂点シェーダに関する命令を修正することができる。修正された頂点シェーダが実行されるとき、修正された頂点シェーダは、００２０視線角度に基づいて、立体視ビューのための頂点の座標を生成することができる。
2016509298.tif 000002
【特許請求の範囲】
【請求項１】
グラフィックス処理のための方法であって、
プロセッサによって、ディスプレイに対する視線角度を決定することと、
前記プロセッサによって、モノビューの画像に対して動作するように構成される頂点シェーダに関する命令を受け取ることと、
前記プロセッサによって、修正された頂点シェーダを生成するために、前記視線角度に基づく１つまたは複数の命令を含めるように前記頂点シェーダに関する前記命令を修正すること、ここにおいて、前記修正された頂点シェーダは、実行されると、立体視ビューの頂点の頂点座標を生成する、と、
前記プロセッサによって、前記修正された頂点シェーダを実行するようにグラフィックス処理ユニット（ＧＰＵ）に命令することと、
を備える、方法。
【請求項２】
前記ＧＰＵに命令することが、
前記視線角度に基づいて前記立体視ビューの第１の画像を生成するように前記修正された頂点シェーダのオブジェクトコードの第１のインスタンスを実行するように前記ＧＰＵに命令することと、
前記視線角度に基づいて前記立体視ビューの第２の画像を生成するように前記修正された頂点シェーダの前記オブジェクトコードの第２のインスタンスを実行するように前記ＧＰＵに命令することと、
を備える、請求項１に記載の方法。
【請求項３】
前記命令を修正することが、
前記視線角度に基づいて前記モノビューの前記画像の頂点の第１のクリッピング座標を修正する第１の命令を前記頂点シェーダに追加することと、
前記視線角度に基づいて前記モノビューの前記画像の前記頂点の第２のクリッピング座標を修正する第２の命令を前記頂点シェーダに追加することと、
を備える、請求項１に記載の方法。
【請求項４】
前記命令を修正することが、
前記視線角度およびゼロ視差平面の位置に基づいて前記モノビューの前記画像の頂点の第１のクリッピング座標を修正する第１の命令を前記頂点シェーダに追加することと、
前記視線角度および前記ゼロ視差平面の前記位置に基づいて前記モノビューの前記画像の前記頂点の第２のクリッピング座標を修正する第２の命令を前記頂点シェーダに追加することと、
を備える、請求項１に記載の方法。
【請求項５】
前記モノビューの前記画像のビューポートを定義する命令を、前記立体視ビューの第１の画像のためのビューポートを定義する命令と、前記立体視ビューの第２の画像のためのビューポートを定義する命令とに修正することをさらに備える、請求項１に記載の方法。
【請求項６】
前記モノビューの前記画像の前記ビューポートを定義する前記命令を修正することが、前記立体視ビューの前記第１の画像と前記立体視ビューの前記第２の画像との間の水平視差を調整することを備える、請求項５に記載の方法。
【請求項７】
前記水平視差を調整することが、ゼロ視差平面の位置を調整するために、前記立体視ビューの前記第１の画像と前記立体視ビューの前記第２の画像との間の前記水平視差を調整することを備える、請求項６に記載の方法。
【請求項８】
前記プロセッサによって、前記モノビューの前記画像を生成するためにアプリケーションを実行することをさらに備え、
前記頂点シェーダに関する前記命令を修正することが、前記アプリケーションの前記実行の間に前記頂点シェーダに関する前記命令を修正することを備える、請求項１に記載の方法。
【請求項９】
前記視線角度を決定することが、前記立体視ビューの生成ごとに１回、前記視線角度を決定することを備える、請求項１に記載の方法。
【請求項１０】
前記ディスプレイに対する前記視線角度を決定することが、
閲覧者の方向とディスプレイの方向の少なくとも１つを決定することと、
前記決定された閲覧者の方向と前記決定されたディスプレイの方向の少なくとも１つに基づいて前記視線角度を決定することと、
を備える、請求項１に記載の方法。
【請求項１１】
命令を受け取ることが、前記プロセッサ上で実行されるグラフィックスドライバラッパーによって、前記頂点シェーダに関する前記命令を受け取ることを備え、
前記命令を修正することが、前記プロセッサ上の前記グラフィックスドライバラッパー実行によって、前記頂点シェーダの前記命令を修正することを備える、
請求項１に記載の方法。
【請求項１２】
グラフィックス処理ユニット（ＧＰＵ）と、
プロセッサであって、
ディスプレイに対する視線角度を決定することと、
修正された頂点シェーダを生成するように、前記視線角度に基づく１つまたは複数の命令を含めるように頂点シェーダの命令を修正すること、ここにおいて、前記修正された頂点シェーダは、実行されると、立体視ビューの頂点の頂点座標を生成する、と、
前記修正された頂点シェーダを実行するように前記ＧＰＵに命令することと、
を行うように構成されるプロセッサと、
を備える、装置。
【請求項１３】
前記修正された頂点シェーダを実行するように前記ＧＰＵに命令するために、前記プロセッサが、
前記視線角度に基づいて前記立体視ビューの第１の画像を生成するように前記修正された頂点シェーダのオブジェクトコードの第１のインスタンスを実行するように前記ＧＰＵに命令し、
前記視線角度に基づいて前記立体視ビューの第２の画像を生成するように前記修正された頂点シェーダの前記オブジェクトコードの第２のインスタンスを実行するように前記ＧＰＵに命令する、
ように構成される、請求項１２に記載の装置。
【請求項１４】
前記命令を修正するために、前記プロセッサが、
前記視線角度に基づいてモノビューの画像の頂点の第１のクリッピング座標を修正する第１の命令を前記頂点シェーダに追加し、
前記視線角度に基づいて前記モノビューの前記画像の前記頂点の第２のクリッピング座標を修正する第２の命令を前記頂点シェーダに追加する、
ように構成される、請求項１２に記載の装置。
【請求項１５】
前記命令を修正するために、前記プロセッサが、
前記視線角度およびゼロ視差平面の位置に基づいてモノビューの画像の頂点の第１のクリッピング座標を修正する第１の命令を前記頂点シェーダに追加し、
前記視線角度および前記ゼロ視差平面の前記位置に基づいて前記モノビューの前記画像の前記頂点の第２のクリッピング座標を修正する第２の命令を前記頂点シェーダに追加する、
ように構成される、請求項１２に記載の装置。
【請求項１６】
前記プロセッサが、
モノビューの画像のビューポートを定義する命令を、前記立体視ビューの第１の画像のためのビューポートを定義する命令と、前記立体視ビューの第２の画像のためのビューポートを定義する命令とに修正するように構成される、請求項１２に記載の装置。
【請求項１７】
前記モノビューの前記画像の前記ビューポートを定義する前記命令を修正するために、前記プロセッサが、前記立体視ビューの前記第１の画像と前記立体視ビューの前記第２の画像との間の水平視差を調整するように構成される、請求項１６に記載の装置。
【請求項１８】
前記水平視差を修正するために、前記プロセッサが、
ゼロ視差平面の位置を調整するために、前記立体視ビューの前記第１の画像と前記立体視ビューの前記第２の画像との間の前記水平視差を調整するように構成される、請求項１７に記載の装置。
【請求項１９】
前記プロセッサが、モノビューの画像を生成するようにアプリケーションを実行し、前記アプリケーションの前記実行の間に前記頂点シェーダの前記命令を修正するように構成される、請求項１２に記載の装置。
【請求項２０】
前記視線角度を決定するために、前記プロセッサが、前記立体視ビューの生成ごとに１回、前記視線角度を決定するように構成される、請求項１２に記載の装置。
【請求項２１】
前記視線角度を決定するために、前記プロセッサが、
閲覧者の方向とディスプレイの方向の少なくとも１つを決定し、
前記決定された閲覧者の方向と前記決定されたディスプレイの方向の少なくとも１つに基づいて前記視線角度を決定するように構成される、請求項１２に記載の装置。
【請求項２２】
前記プロセッサが、グラフィックスドライバラッパーを実行するように構成され、前記プロセッサが、前記グラフィックスドライバラッパーを介して前記頂点シェーダの前記命令を修正するように構成される、請求項１２に記載の装置。
【請求項２３】
モバイルワイヤレス電話、携帯情報端末（ＰＤＡ）、ビデオゲームコンソール、モバイルビデオ会議ユニット、ラップトップコンピュータ、デスクトップコンピュータ、デジタルメディアプレーヤ、およびタブレットコンピューティングデバイスの１つを備える、請求項１２に記載の装置。
【請求項２４】
加速度計、ジャイロスコープ、およびカメラの少なくとも１つをさらに備え、
前記プロセッサが、前記加速度計、前記ジャイロスコープ、および前記カメラの１つまたは複数からの出力に基づいて、前記ディスプレイに対する前記視線角度を決定するように構成される、請求項１２に記載の装置。
【請求項２５】
ディスプレイに対する視線角度を決定し、モノビューの画像に対して動作するように構成される頂点シェーダに関する命令を受け取ることと、修正された頂点シェーダを生成するように前記視線角度に基づく１つまたは複数の命令を含めるように前記頂点シェーダに関する前記命令を修正すること、ここにおいて、前記修正された頂点シェーダは、実行されると、立体視ビューの頂点の頂点座標を生成する、と、前記修正された頂点シェーダを実行するようにグラフィックス処理ユニット（ＧＰＵ）に命令することと、を行うように構成される、プロセッサ。
【請求項２６】
グラフィックス処理ユニット（ＧＰＵ）と、
ディスプレイに対する視線角度を決定するための手段と、
モノビューの画像に対して動作するように構成される頂点シェーダに関する命令を受け取るための手段と、
修正された頂点シェーダを生成するように、前記視線角度に基づく１つまたは複数の命令を含めるように前記頂点シェーダに関する前記命令を修正するための手段、ここにおいて、前記修正された頂点シェーダは、実行されると、立体視ビューの頂点の頂点座標を生成する、と、
前記修正された頂点シェーダを実行するように前記ＧＰＵに命令するための手段と、
を備える、装置。
【請求項２７】
プロセッサをさらに備え、前記プロセッサが、決定するための前記手段と、受け取るための前記手段と、修正するための前記手段と、命令するための前記手段とを含む、請求項２６に記載の装置。
【請求項２８】
命令するための前記手段が、
前記視線角度に基づいて前記立体視ビューの第１の画像を生成するように前記修正された頂点シェーダのオブジェクトコードの第１のインスタンスを実行するように前記ＧＰＵに命令するための第１の手段と、
前記視線角度に基づいて前記立体視ビューの第２の画像を生成するように前記修正された頂点シェーダの前記オブジェクトコードの第２のインスタンスを実行するように前記ＧＰＵに命令するための第２の手段と、
を備える、請求項２６に記載の装置。
【請求項２９】
修正するための前記手段が、
前記視線角度に基づいて前記モノビューの前記画像の頂点の第１のクリッピング座標を修正する第１の命令を前記頂点シェーダに追加するための第１の手段と、
前記視線角度に基づいて前記モノビューの前記画像の前記頂点の第２のクリッピング座標を修正する第２の命令を前記頂点シェーダに追加するための第２の手段と、
を備える、請求項２６に記載の装置。
【請求項３０】
修正するための前記手段が、
前記視線角度およびゼロ視差平面の位置に基づいて前記モノビューの前記画像の頂点の第１のクリッピング座標を修正する第１の命令を前記頂点シェーダに追加するための第１の手段と、
前記視線角度および前記ゼロ視差平面の前記位置に基づいて前記モノビューの前記画像の前記頂点の第２のクリッピング座標を修正する第２の命令を前記頂点シェーダに追加するための第２の手段と、
を備える、請求項２６に記載の装置。
【請求項３１】
前記モノビューの前記画像のビューポートを定義する命令を、前記立体視ビューの第１の画像のためのビューポートを定義する命令と、前記立体視ビューの第２の画像のためのビューポートを定義する命令とに修正するための手段をさらに備える、請求項２６に記載の装置。
【請求項３２】
前記モノビューの前記画像の前記ビューポートを定義する前記命令を修正するための前記手段が、前記立体視ビューの前記第１の画像と前記立体視ビューの前記第２の画像との間の水平視差を調整するための手段を備える、請求項３１に記載の装置。
【請求項３３】
前記水平視差を調整するための前記手段が、ゼロ視差平面の位置を調整するために、前記立体視ビューの前記第１の画像と前記立体視ビューの前記第２の画像との間の前記水平視差を調整するための手段を備える、請求項３２に記載の装置。
【請求項３４】
前記モノビューの前記画像を生成するようにアプリケーションを実行するための手段をさらに備え、
前記頂点シェーダに関する前記命令を修正するための前記手段が、前記アプリケーションの前記実行の間に前記頂点シェーダに関する前記命令を修正するための手段を備える、
請求項２６に記載の装置。
【請求項３５】
前記視線角度を決定するための前記手段が、前記立体視ビューの生成ごとに１回、前記視線角度を決定するための手段を備える、請求項２６に記載の装置。
【請求項３６】
前記ディスプレイに対する前記視線角度を決定するための前記手段が、
閲覧者の方向とディスプレイの方向の少なくとも１つを決定するための第１の手段と、
前記決定された閲覧者の方向と前記決定されたディスプレイの方向の少なくとも１つに基づいて前記視線角度を決定するための第２の手段と、
を備える、請求項２６に記載の装置。
【請求項３７】
実行されると、１つまたは複数のプロセッサに、
ディスプレイに対する視線角度を決定することと、
モノビューの画像に対して動作するように構成される頂点シェーダに関する命令を受け取ることと、
修正された頂点シェーダを生成するように、前記視線角度に基づく１つまたは複数の命令を含めるように前記頂点シェーダに関する前記命令を修正することと、ここにおいて、前記修正された頂点シェーダは、実行されると、立体視ビューの頂点の頂点座標を生成する、
前記修正された頂点シェーダを実行するようにグラフィックス処理ユニット（ＧＰＵ）へ命令することと、
を行わせる命令を記憶したコンピュータ可読記憶媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
[0001]本開示は、グラフィックスデータ処理に関し、より詳細には、立体視ビューのためのグラフィックスデータ処理に関する。
【背景技術】
【０００２】
[0002]立体視ビューは、３次元（３Ｄ）ボリュームを包含するように見える、知覚される画像を指す。立体視ビューを生成するために、デバイスは、ディスプレイの２次元（２Ｄ）エリア上に２つの画像を表示する。これらの２つの画像は、実質的に同様のコンテンツを含むが、２つの画像中の１つまたは複数の対応するピクセルの水平軸に沿ったわずかな変位を伴う。２Ｄエリア上のこれらの２つの画像の同時の閲覧は、２つの画像を表示している２Ｄディスプレイから飛び出る、または２Ｄディスプレイに押し込まれる画像を閲覧者に知覚させる。このようにして、２つの画像がディスプレイの２Ｄエリア上に表示されるが、閲覧者は、３Ｄボリュームを包含するように見える画像を知覚する。
【０００３】
[0003]立体視ビューの２つの画像は、それぞれ、左眼画像および右眼画像と呼ばれる。左眼画像は閲覧者の左眼によって閲覧可能であり、右眼画像は閲覧者の左眼によって閲覧可能でない。同様に、右眼画像は閲覧者の右眼によって閲覧可能であり、左眼画像は閲覧者の右眼によって閲覧可能でない。たとえば、閲覧者は特殊な眼鏡を装着することがあり、眼鏡の左レンズは右眼画像を遮断して左眼画像を通し、眼鏡の右レンズは左眼画像を遮断して右眼画像を通す。
【０００４】
[0004]左眼画像と右眼画像とは、水平軸に沿ったわずかな変位を伴う実質的に同様のコンテンツを含むが、（たとえば、特殊な眼鏡により）閲覧者の両眼によって同時に閲覧可能でないので、閲覧者の脳は、２つの画像を混合するよって、対応するピクセル間のわずかな変位を解決する。この混合は、閲覧者に、２つの画像を、３Ｄボリュームを伴う画像として知覚させる。
【発明の概要】
【０００５】
[0005]全般に、本開示の技法は、グラフィックス処理ユニット（ＧＰＵ）に立体視ビューを生成させるように、モノビューを生成する命令を修正することを対象とする。ＧＰＵのシェーダプログラムは、モノビューを生成するように設計され得る。本開示で説明される技法は、立体視ビューを生成するように、視線角度に少なくとも基づいて、そのようなシェーダプログラムの命令を修正する。たとえば、本技法は、立体視ビューのビューの１つに対してある向きの分だけピクセルの位置をずらし、立体視ビューの他のビューに対して別の向きにピクセルの位置をずらすように、シェーダプログラムの命令を修正する。修正されたシェーダプログラムがピクセルの位置をずらす向きは、視線角度に基づく。
【０００６】
[0006]一例では、本開示は、グラフィックス処理のための方法を説明する。方法は、プロセッサによって、ディスプレイに対する視線角度を決定することと、プロセッサによって、モノビューの画像に対して動作するように構成される頂点シェーダに関する命令を受け取ることと、プロセッサによって、修正された頂点シェーダを生成するために視線角度に基づく１つまたは複数の命令を含めるように頂点シェーダに関する命令を修正することとを含む。この例では、修正された頂点シェーダは、実行されると、立体視ビューの頂点の頂点座標を生成する。方法はまた、プロセッサによって、修正された頂点シェーダを実行するようにグラフィックス処理ユニット（ＧＰＵ）に命令することを含む。
【０００７】
[0007]一例では、本開示は装置を説明する。装置は、グラフィックス処理ユニット（ＧＰＵ）とプロセッサとを含む。プロセッサは、ディスプレイに対する視線角度を決定し、修正された頂点シェーダを生成するために視線角度に基づく１つまたは複数の命令を含めるように頂点シェーダに関する命令を修正するように構成される。この例では、修正された頂点シェーダは、実行されると、立体視ビューの頂点の頂点座標を生成する。プロセッサはまた、修正された頂点シェーダを実行するようにＧＰＵに命令するように構成される。
【０００８】
[0008]一例では、本開示はプロセッサを説明する。プロセッサは、ディスプレイに対する視線角度を決定し、モノビューの画像に対して動作するように構成される頂点シェーダに関する命令を受け取り、修正された頂点シェーダを生成するために視線角度に基づく１つまたは複数の命令を含めるように頂点シェーダに関する命令を修正するように構成される。この例では、修正された頂点シェーダは、実行されると、立体視ビューの頂点の頂点座標を生成する。プロセッサはまた、修正された頂点シェーダを実行するようにグラフィックス処理ユニット（ＧＰＵ）に命令するように構成される。
【０００９】
[0009]一例では、本開示は、グラフィックス処理ユニット（ＧＰＵ）と、ディスプレイに対する視線角度を決定するための手段と、モノビューの画像に対して動作するように構成される頂点シェーダに関する命令を受け取るための手段と、修正された頂点シェーダを生成するために視線角度に基づく１つまたは複数の命令を含めるように頂点シェーダに関する命令を修正するための手段とを含む、装置を説明する。この例では、修正された頂点シェーダは、実行されると、立体視ビューの頂点に対する頂点座標を生成する。装置はまた、修正された頂点シェーダを実行するようにＧＰＵに命令するための手段を含む。
【００１０】
[0010]一例では、本開示は、実行されると、１つまたは複数のプロセッサに、ディスプレイに対する視線角度を決定させ、モノビューの画像に対して動作するように構成される頂点シェーダに関する命令を受け取らせ、修正された頂点シェーダを生成するために視線角度に基づく１つまたは複数の命令を含めるように頂点シェーダに関する命令を修正させる、命令を記憶したコンピュータ可読記憶媒体を説明する。この例では、修正された頂点シェーダは、実行されると、立体視ビューの頂点の頂点座標を生成する。命令はさらに、１つまたは複数のプロセッサに、修正された頂点シェーダを実行するようにグラフィックス処理ユニット（ＧＰＵ）に対して命令させる。
【００１１】
[0011]本開示の１つまたは複数の態様の詳細が、添付の図面および以下の説明において記載される。本開示の他の特徴、目的、および利点は、説明および図面、ならびに特許請求の範囲から明らかになろう。
【図面の簡単な説明】
【００１２】
【図１】[0012]本開示で説明される１つまたは複数の例による、立体視ビューを表示しているディスプレイを示す概念図。
【図２】[0013]様々な視線角度を示す概念図。
【図３】[0014]閲覧者の目と頭の方向の検出を示す概念図。
【図４】[0015]視線角度の例を示す概念図。
【図５】[0016]本開示で説明される１つまたは複数の例示的な技法を実施し得るデバイスの例を示すブロック図。
【図６】[0017]ゼロ視差平面の位置を示す概念図。
【図７】[0018]本開示で説明される１つまたは複数の技法による、左眼画像と右眼画像との間の水平視差を示す概念図。
【図８】[0019]本開示で説明される１つまたは複数の例示的技法を実施し得るグラフィックス処理ユニット（ＧＰＵ）の例を示すブロック図。
【図９】[0020]本開示で説明される１つまたは複数の例示的技法を実施し得るグラフィックス処理ユニット（ＧＰＵ）の別の例を示すブロック図。
【図１０Ａ】[0021]本開示で説明される１つまたは複数の技法による、例示的な結果を示す概念図。
【図１０Ｂ】本開示で説明される１つまたは複数の技法による、例示的な結果を示す概念図。
【図１０Ｃ】本開示で説明される１つまたは複数の技法による、例示的な結果を示す概念図。
【図１１】[0022]図５の例示的なデバイスをさらに詳細に示すブロック図。
【図１２】[0023]本開示で説明される１つまたは複数の例示的な技法による例示的な動作を示すフローチャート。
【発明を実施するための形態】
【００１３】
[0024]本開示で説明される例示的な技法は、実行またはランタイム中の立体３次元（Ｓ３Ｄ）グラフィックスのレンダリングを対象とする。たとえば、アプリケーションは、表示のためにグラフィックス処理ユニット（ＧＰＵ）によってレンダリングされるべきモノビュー画像を生成し得る。本開示で説明される技法は、アプリケーションの実行の間（すなわち、ランタイムの間）に、モノビュー画像を立体視ビュー画像に変換することができる。
【００１４】
[0025]いくつかの例では、本技法は、グラフィックスを作成したアプリケーションまたはＧＰＵに対する修正を何ら必要とせずに、Ｓ３Ｄグラフィックスをレンダリングすることができる。いくつかの例では、本開示で説明される技法は、グラフィックスドライバに対してラッパーを実行するアプリケーションプロセッサによって実施され得る。本開示で説明される技法によれば、グラフィックスドライバに対するラッパーは、事前に作成されたグラフィックスドライバへの入力を修正する、または、事前に作成されたグラフィックスドライバの出力を修正する、プログラムであると見なされ得る。このようにして、本開示で説明される技法は、アプリケーションプロセッサ上で実行されるグラフィックスドライバを修正する必要なくＳ３Ｄグラフィックスを生成するためのＧＰＵを与え得る。しかしながら、アプリケーションプロセッサがグラフィックスドライバの実行に応答して本開示で説明される例示的な技法を実施するように、新しいグラフィックスドライバを作成すること、または、事前に作成されたグラフィックスドライバを修正することが可能であり得る。例示を目的に、本技法は、グラフィックスドライバラッパーを実行するアプリケーションプロセッサによって実行されるものとして説明される。
【００１５】
[0026]アプリケーションの観点からは、アプリケーションを実行するアプリケーションプロセッサは、ＧＰＵによる従来の３Ｄグラフィックスレンダリングのための、グラフィックスデータとアプリケーションのコマンドとを出力することができる。アプリケーションプロセッサ上で実行されるグラフィックスドライバラッパーは、ＧＰＵがＳ３Ｄディスプレイ上でＳ３Ｄグラフィックスをレンダリングするように、それらのコマンド、ならびにＧＰＵによって実行される命令を修正することができる。本開示では、「コマンド」と「命令」という用語は互換的に使用され得る。こうして、ＧＰＵは、グラフィックスを生成したアプリケーションまたはＧＰＵに対する変更を何ら必要とせずに、Ｓ３Ｄグラフィックスをレンダリングすることができる。したがって、本開示で説明される技法は、閲覧者が、Ｓ３Ｄグラフィックスを生成するように設計されていないアプリケーションによって生成された画像コンテンツについて、Ｓ３Ｄグラフィックスを体験することを可能にし得る。
【００１６】
[0027]さらに、本開示で説明される技法は、ＧＰＵによって実行される命令をアプリケーションプロセッサがグラフィックスドライバラッパーを介して修正する方式を決定するために、視線角度（すなわち、閲覧者がディスプレイを見ている角度）を考慮することができる。視線角度を考慮することによって、閲覧者は、ディスプレイが傾いている場合、または閲覧者の頭が傾いている場合であっても、高品質のＳ３Ｄグラフィックスを体験することができる。
【００１７】
[0028]従来の３Ｄグラフィックスレンダリングでは、ＧＰＵが、単一視点（たとえば、モノビュー）から３Ｄグラフィックスを生成する。この単一視点は、閲覧者の右眼と左眼の両方によって閲覧可能である単一の画像を意味し得る。Ｓ３Ｄグラフィックスは、Ｓ３Ｄグラフィックスが立体視ビューを生成するという点で、３Ｄグラフィックスとは異なる。立体視ビューという用語は、両眼視点から生成される画像を指す。両眼視点には、２つの画像があってよく、１つの画像は一方の眼によって閲覧可能であり他方の眼によって閲覧可能でなく、その逆も同様である。たとえば、閲覧者が特別な眼鏡を着用すると、眼鏡の左レンズを通って入る光は左眼によって閲覧可能であり右眼によって閲覧可能でなく、その逆も同様である。両眼視点は立体視ビューと呼ばれることがある。
【００１８】
[0029]たとえば、Ｓ３Ｄグラフィックスでは、ＧＰＵは、左眼のための画像と右眼のための別の画像とを（すなわち、立体視ビューを）生成し得る。左眼画像は、閲覧者の右眼から遮断され、左眼のみに向けられる。右眼画像は、閲覧者の左眼から遮断され、右眼のみに向けられる。立体視ビューという用語は、ディスプレイ上にそれぞれ表示される２つの画像（たとえば、左眼画像および右眼画像）を指すが、モノビューは、ディスプレイ上に表示される単一の画像を指す。左眼画像と右眼画像との組合せは、閲覧者にとっては、画像が、画像を表示しているディスプレイから飛び出している、またはディスプレイに押し込まれているかのように見え得る。これは、より現実的でより豊かな閲覧体験をもたらし得る。
【００１９】
[0030]本開示では、Ｓ３Ｄ画像（たとえば、立体視ビュー）および３Ｄ画像（たとえば、モノビュー）の概念は、混同されるべきでない。３Ｄ画像は、ディスプレイの２次元（２Ｄ）エリアに制限される画像である。たとえば、３Ｄグラフィックス処理では、アプリケーションは３Ｄプリミティブを定義し、プリミティブはアプリケーションコンテンツの様々な物体を形成する。これらの物体は、ディスプレイの２Ｄエリアに制限される単一の画像（たとえば、モノビュー）を形成する。
【００２０】
[0031]たとえば、３Ｄ画像内の物体は、３Ｄ画像内の他の物体よりも遠く離れているか、または近接しているように見え得る。しかしながら、これらの物体のすべてが、ディスプレイの２Ｄエリアに限定される。Ｓ３Ｄ画像は、閲覧者の脳が右眼画像と左眼画像とを組み合わせることから生じる知覚される画像である。得られた画像（すなわち、Ｓ３Ｄ画像）は、ディスプレイの２Ｄエリアに制限されないように見える。むしろ、Ｓ３Ｄ画像は、画像がディスプレイから飛び出している、ディスプレイに押し込まれているように見える３Ｄボリュームを包含するように見える。たとえば、Ｓ３Ｄ画像内の物体は、３Ｄボリューム内の他の物体よりも遠く離れているか、または近接しているように見え、３Ｄ画像の場合のように２Ｄエリアではないように見える。
【００２１】
[0032]言い換えると、３Ｄグラフィックス処理は、ディスプレイの２Ｄエリアに制限されているように見える３Ｄ画像を（たとえば、アプリケーションによって定義される３Ｄプリミティブによって）生成することを指す。３Ｄ画像はモノビューと呼ばれる。Ｓ３Ｄは、モノビューではなく立体視ビューの作成のためのレンダリングを指す。立体視ビューでは、右眼画像と左眼画像は２Ｄディスプレイに制限されるが、閲覧者が立体視ビューを見るとき、画像は３Ｄボリュームを包含するように見える。
【００２２】
[0033]Ｓ３Ｄ画像を一緒に形成する右眼画像および左眼画像は、３Ｄ画像であり得る。３Ｄ右眼画像と３Ｄ左眼画像とを組み合わせるときに閲覧者にＳ３Ｄ画像を知覚させるのは、閲覧者の脳である。たとえば、閲覧者が右眼画像と左眼画像の両方を同時に見ると、閲覧者は、人の両眼視に基づいて風景の奥行きを知覚することができる。右眼画像と左眼画像とのコンテンツは、単一の３Ｄ画像のコンテンツと実質的に同様であり得る。
【００２３】
[0034]高品質の立体視効果のために、左眼画像と右眼画像との間には水平視差のみがあり得る。たとえば、左眼画像における物体の位置と右眼画像におけるその物体の位置は異なり得る。しかしながら、差は水平方向にしかないことがあり、垂直方向にはないことがある。物体がディスプレイから飛び出しているように、またはディスプレイに押し込まれているように見えるように、閲覧者の両眼視に左眼画像と右眼画像とを合成させるのは、物体間の水平視差である。物体間の任意の垂直視差は、Ｓ３Ｄ効果を減衰させ得る。
【００２４】
[0035]グラフィックスドライバまたはグラフィックスドライバラッパーを実行する、本開示アプリケーションプロセッサで説明される技法は、モノビューのためのグラフィックスコンテンツをＧＰＵに生成させる命令を、立体視ビューのためのグラフィックスコンテンツをＧＰＵに生成させる命令に修正することができる。言い換えると、修正の前に、命令は、ＧＰＵに単一３Ｄ画像を生成させることができる。修正の後に、命令は、ＧＰＵに、立体視ビューの２つの３Ｄ画像（たとえば、３Ｄ左眼画像および３Ｄ右眼画像）を生成させることができる。
【００２５】
[0036]本開示で説明される技法は全般に、３Ｄ画像のために開示されるが、本開示の態様は、そのように限定されないことに留意されたい。本開示の技法は、２Ｄグラフィックスにも拡張され得る。たとえば、モノビューの単一の画像は２Ｄ画像であってよく、本開示の技法は、立体視ビューのための２つの２Ｄ画像をＧＰＵに生成させるように、命令を修正することができる。この場合、閲覧者は、立体視ビューのための２つの画像を表示しているディスプレイから飛び出している、またはディスプレイに押し込まれている、単一の画像を知覚する。混同を避けるために、以下で説明される技法は、モノビューのための単一の画像と、立体視ビューのための左眼画像と右眼画像とに言及するが、これらの画像は３Ｄ画像または２Ｄ画像であり得ることを理解されたい。
【００２６】
[0037]本開示アプリケーションプロセッサで説明される例示的な技法は、グラフィックスドライバまたはグラフィックスドライバラッパーを介して、アプリケーションによって発行された、ＧＰＵによって実行されるべき命令と、ＧＰＵによって実行されるべき頂点シェーダプログラムの命令とを修正することができる。たとえば、アプリケーションプロセッサがアプリケーションを実行することができる。アプリケーションは、単一の画像（たとえば、モノビュー）を生成するように設計されていることがあり、単一の画像のグラフィックスコンテンツを複数のプリミティブとして生成することができる。加えて、アプリケーションは、プリミティブの各頂点について、色、透明度、および座標値などのピクセル値を決定することができる。
【００２７】
[0038]アプリケーションの実行の間（たとえば、ランタイム中）、アプリケーションは、アプリケーションプロセッサを介して、頂点シェーダプログラムの命令を取り出すためのコマンドを発行する。頂点シェーダプログラムの出力は、実行されると、単一の画像（たとえば、モノビュー）のためにアプリケーションによって生成されたプリミティブの頂点のクリッピング座標であってよい。例示的な技法は、左眼画像および右眼画像（たとえば、立体視ビュー）のためのプリミティブの頂点のクリッピング座標を生成するように、頂点シェーダプログラムの命令を修正することができる。左眼画像および右眼画像のためのプリミティブの頂点のクリッピング座標は、視線角度に基づき得る。
【００２８】
[0039]視線角度は、アプリケーションの実行の間に左眼画像および右眼画像が表示されているディスプレイを閲覧者が見ている角度（すなわち、ディスプレイに対する閲覧者の視線方向）を指す。視線角度を決定するために多くの異なる方法が存在し得る。本開示で説明される技法は、視線角度を決定するためのいずれの特定の方式にも限定されない。
【００２９】
[0040]また、アプリケーションの実行中、アプリケーションは、アプリケーションプロセッサを介して、単一画像内のプリミティブの１つまたは複数を描画するようにＧＰＵに命令するための描画命令をＧＰＵへ発行する。たとえば、本開示の技法において、アプリケーションプロセッサ上で実行されるアプリケーションは、単一の画像のためのグラフィックスコンテンツをＧＰＵが生成する予定であるかのように、命令を出力する。本明細書で説明される技法は、描画命令のようなアプリケーションによって発行された命令の１つまたは複数を、左眼画像および右眼画像用のためのグラフィックスコンテンツを生成するように修正する。このように、アプリケーションの観点からの、命令に対する修正はない。
【００３０】
[0041]たとえば、アプリケーションプロセッサは、グラフィックスドライバラッパーを介して、アプリケーションによって発行される命令を監視する。アプリケーションが描画命令を発行すると、グラフィックスドライバラッパーは、そのような描画命令を捕捉し、２つの描画命令を発行し、ここで、１つの命令は、視線角度に基づいて左眼画像のためのグラフィックコンテンツを生成するためのものであり、１つの命令は、視線角度に基づいて右眼画像のためのグラフィックスコンテンツを生成するためのものである。
【００３１】
[0042]視線角度は一定のままではないことがある。たとえば、アプリケーションの実行の間に、閲覧者はデバイスを傾けることがあり、自分の頭を傾けることがあり、またはその両方を行うことがある。視線角度の変化の可能性を考慮するために、アプリケーションプロセッサは、視線角度を定期的に決定し得る。一例として、ＧＰＵが左眼画像と右眼画像の１つの組合せを出力した後で、本技法は視線角度を決定し得る。この例では、グラフィックスドライバラッパーは、ＧＰＵによってレンダリングされる左眼画像と右眼画像の次の組合せのための視線角度の変化を考慮するために、頂点シェーダの命令を修正することができる。あるいは、プロセッサは、視線角度を継続的に決定することができ、グラフィックスドライバラッパーは、頂点シェーダの命令を修正する方式を決定するために、現在の視線角度を利用することができる。
【００３２】
[0043]上で説明されたように、グラフィックスドライバラッパーは、左眼画像と右眼画像の両方のためのプリミティブの頂点を作成するように、頂点シェーダの命令を修正することができる。たとえば、本技法は、修正された頂点シェーダを２回実行させることができる。１回目の実行では、修正された頂点シェーダは、視線角度に基づいて第１の向きに頂点のクリッピング座標をずらすことができ、２回目の実行では、修正された頂点シェーダは、視線角度に基づいて第２の向きに頂点のクリッピング座標をずらすことができる。ＧＰＵは、左眼画像をレンダリングするために、第１の向きにずらされた頂点を処理することができ、右眼画像をレンダリングするために、第２の向きにずらされた頂点を処理することができる。
【００３３】
[0044]しかしながら、第１の向きにクリッピング座標のすべてをずらし、次いで第２の向きにクリッピング座標のすべてをずらすことは、アプリケーションによって生成される単一の画像のすべての物体が、左眼画像と右眼画像とを表示しているディスプレイから飛び出している、またはディスプレイに押し込まれている、立体視ビューをもたらし得る。たとえば、アプリケーションによって生成されるプリミティブは、異なる物体を形成し得る。左眼画像を生成するために第１の向きにプリミティブのすべてのクリッピング座標をずらし、右眼画像を生成するために第２の向きにプリミティブのすべてのクリッピング座標をずらすことによって、物体のすべてが、ディスプレイから飛び出しているように、またはディスプレイに押し込まれているように見え得る。
【００３４】
[0045]そのような結果は、人の両眼視に対して最適ではないことがある。たとえば、閲覧者は、一部の物体が、他の物体よりも飛び出ることを望み得る。別の例として、物体のすべてが同じ量だけディスプレイから飛び出している、またはディスプレイに押し込まれている場合であっても、閲覧者は、物体がディスプレイから飛び出る量またはディスプレイに押し込まれる量を調節することを望み得る。
【００３５】
[0046]より詳細に説明されるように、アプリケーションプロセッサは、グラフィックスドライバラッパーを介して、一部の物体が他の物体よりもディスプレイから飛び出る、またはディスプレイに押し込まれるように、頂点シェーダの命令を修正することもできる。いくつかの例では、一部の物体が他の物体よりもディスプレイから飛び出ることまたはディスプレイに押し込まれることを可能にするように頂点シェーダの命令を修正することに加えて、またはその代わりに、アプリケーションプロセッサは、グラフィックスドライバラッパーを介して、左眼画像と右眼画像との間の水平視差を増やす、または減らす、命令を修正することができる。このようにして、閲覧者は、立体視ビューがディスプレイから飛び出る量またはディスプレイに押し込まれる量を調節することが可能になり得る。
【００３６】
[0047]図１は、本開示で説明される１つまたは複数の例による、立体視ビューを表示しているディスプレイを示す概念図である。図１はデバイス１０を示す。デバイス１０の例は、限定はされないが、モバイルワイヤレス電話、携帯情報端末（ＰＤＡ）、ビデオディスプレイを含むビデオゲーミングコンソール、モバイルビデオ会議ユニット、ラップトップコンピュータ、デスクトップコンピュータ、テレビジョンセットトップボックス、デジタルメディアプレーヤ、タブレットコンピューティングデバイス、スマートフォンなどを含む。デバイス１０はディスプレイ１２を含む。ディスプレイ１２の例は、限定はされないが、液晶ディスプレイ（ＬＣＤ）、有機発光ダイオードディスプレイ（ＯＬＥＤ）、陰極線管（ＣＲＴ）ディスプレイ、プラズマディスプレイ、偏光ディスプレイ、または別のタイプのディスプレイデバイスを含む。ディスプレイ１２は、立体視ビュー（たとえば、左眼画像と右眼画像）を表示するように構成される任意のタイプのディスプレイであり得る。
【００３７】
[0048]示されるように、ディスプレイ１２は３Ｄ画像１４Ａと３Ｄ画像１４Ｂとを表示する。図１は、実線の箱として画像１４Ａを示し、点線の箱として画像１４Ｂを示す。画像１４Ａおよび画像１４Ｂは各々３Ｄ画像であり得る。たとえば、画像１４Ａと１４Ｂの各々１つが個々に見られる場合、画像１４Ａおよび１４Ｂは、ディスプレイ１２から飛び出しているまたはディスプレイ１２に押し込まれているようには見えないであろう（たとえば、モノビューであるように見える）。
【００３８】
[0049]しかしながら、画像１４Ａと画像１４Ｂが一緒に見られると、画像１４Ａおよび画像１４Ｂは一緒に立体視ビューを形成する。たとえば、画像１４Ａおよび画像１４Ｂは同様の画像コンテンツを含み得るが、ディスプレイ１２上ではずれている。閲覧者により装着される特別な眼鏡は、閲覧者の右眼が画像１４Ａを見るのを妨げ、閲覧者の左眼が画像１４Ｂを見ることを可能にし得る。特別な眼鏡はまた、閲覧者の左眼が画像１４Ｂを見るのを妨げ、閲覧者の右眼が画像１４Ａを見ることを可能にし得る。閲覧者が画像１４Ａと１４Ｂとを一緒に見るとき、画像１４Ａと１４Ｂとの間の水平視差は、閲覧者がＳ３Ｄ画像（すなわち、ディスプレイ１２の後方またはディスプレイ１２の前方にあるように見え３Ｄボリュームを包含する画像）を知覚することをもたらし得る。言い換えると、画像１４Ａは立体視ビューの左眼画像であり、画像１４Ｂは立体視ビューの右眼画像である。
【００３９】
[0050]デバイス１０のプロセッサ上で実行されるアプリケーションは、単一の画像（たとえば、モノビュー）を生成することができる。たとえば、アプリケーションを実行するプロセッサは、単一の画像の画像コンテンツを複数のプリミティブとして生成することができる。この単一の画像の画像コンテンツは、画像１４Ａおよび画像１４Ｂの画像コンテンツと同様であり得る。加えて、アプリケーションを実行するプロセッサは、プリミティブの各頂点について、色、透明度、および座標値などのピクセル値を決定することができる。プリミティブのピクセル値は、画像データと呼ばれ得る。アプリケーションを実行するプロセッサは、画像データと、単一の画像をレンダリングするようにグラフィックス処理ユニット（ＧＰＵ）に命令する命令とを、デバイス１０のＧＰＵに出力することができる。
【００４０】
[0051]本開示で説明される技法によれば、プロセッサは、単一の画像をレンダリングするようにＧＰＵに命じる、ＧＰＵに対するコマンドを捕捉することができる。たとえば、プロセッサは、グラフィックスドライバまたはグラフィックスドライバラッパーを実行することができ、プロセッサは、グラフィックスドライバまたはグラフィックスドライバラッパーを介して、単一の画像をレンダリングするためのＧＰＵに対するコマンドを捕捉することができる。例示を目的に、本技法は、グラフィックスドライバラッパーを実行するプロセッサによって実行されるものとして説明される。一般に、本技法は、説明を簡単にするために、様々な機能を実行するグラフィックスドライバラッパーを説明する。しかしながら、プロセッサは、グラフィックスドライバラッパーの実行を介して本技法を実施していることを理解されたい。
【００４１】
[0052]たとえば、グラフィックスドライバラッパーは、プロセッサ上で実行されるプログラムであり得る。グラフィックスドライバラッパーは、修正された命令がＧＰＵに立体視ビューをレンダリングさせるように、グラフィックスドライバが受け取る命令またはグラフィックスドライバの出力先の命令を、修正することができる。したがって、本開示で説明される技法は、グラフィックスドライバに対する修正を何ら必要としないことがある。むしろ、プロセッサは、グラフィックスドライバラッパーを実行し、以前に開発されたグラフィックスドライバを実行することができる。しかしながら、本開示で説明される技法を実施するために、既存のグラフィックスドライバを修正すること、または新たなグラフィックスドライバを作成することが可能であり得る。
【００４２】
[0053]グラフィックスドライバラッパーを実行するプロセッサは、プロセッサによって発行されたコマンドを修正し、立体視ビュー（たとえば、画像１４Ａおよび画像１４Ｂ）を形成する２つの画像をＧＰＵにレンダリングさせることができる。加えて、グラフィックスドライバラッパーを実行するプロセッサは、ＧＰＵ上で実行されるシェーダプログラム（たとえば、頂点シェーダ）の命令を修正することができる。たとえば、グラフィックスドライバラッパーは、修正された頂点シェーダが、ＧＰＵ上で実行されると、プログラム上で実行されるアプリケーションによって生成された単一の画像中のピクセルの位置をずらすように、頂点シェーダの命令を修正することができる。グラフィックスドライバラッパーは、ＧＰＵに修正された頂点シェーダを２回実行させることができる。修正された頂点シェーダの１回目の実行では、修正された頂点シェーダは、単一の画像中のピクセルの位置をある向きにずらす。修正された頂点シェーダの２回目の実行では、修正された頂点シェーダは、単一の画像中のピクセルの位置を２回目の実行において別の向きにずらす。画像１４Ａは、頂点シェーダが単一の画像のピクセルをある向きにずらしたことで得られる画像であり得る。画像１４Ｂは、頂点シェーダが単一の画像のピクセルを別の向きにずらしたことで得られる画像であり得る。
【００４３】
[0054]頂点シェーダの命令を修正する際、グラフィックスドライバラッパーを実行するプロセッサは、視線角度を考慮することができる。視線角度は、閲覧者がディスプレイ１２を見ている角度である。たとえば、図１において、ディスプレイ１２は、横向きモードにあると考えられ得る。閲覧者がディスプレイ１２を正面で見ている（すなわち、閲覧者が自分の頭を傾けていない）場合、視線角度は０であると考えられ得る。しかしながら、閲覧者がデバイス１０または自分の頭を傾けると、視線角度はもはや０ではなくなり得る。たとえば、閲覧者がデバイス１０を縦向きモードとなるように回転する（たとえば、デバイス１０を９０°傾ける）と、視線角度は９０°であり得る。
【００４４】
[0055]視線角度が横向きモードでは０であり、縦向きモードでは９０°であることは、例示を目的に与えられており、限定的であると見なされるべきではないことを、理解されたい。本開示で説明される技法は、視線角度が縦向きモードで０となり横向きモードで９０°となる、または横向きモードと縦向きモードの間の任意のモードで９０°となる状況にも、適用され得る。
【００４５】
[0056]一般に、デバイス１０のプロセッサは、視線角度を決定することができ、プロセッサは、プロセッサ上で実行されるグラフィックスドライバラッパーを介して、アプリケーションによってＧＰＵに出力される命令と、ＧＰＵ上で実行されるシェーダプログラムの命令とを、視線角度に基づいて修正することができる。グラフィックスドライバラッパーは、モノビューを形成する単一の画像ではなく立体視ビューを形成する２つの画像をＧＰＵがレンダリングするように、命令を修正することができる。
【００４６】
[0057]図２は、様々な視線角度を示す概念図である。例示を目的に、図２は、閲覧者がデバイス１０を傾け得る様々な角度を示す。しかしながら、本開示で説明される技法は、閲覧者がデバイス１０を傾けないが自分の頭を傾ける例、またはこれらの２つの組合せにも、拡張可能であり得る。
【００４７】
[0058]大半の立体視３Ｄディスプレイは、デバイス方向についての制約とともに使用されなければならない。たとえば、ほとんどすべての３Ｄテレビは、横向きモードで見られる。これは、水平な面（ＴＶキャビネット、机上など）での使用のために準備された多くのデバイスには理にかなっている。しかしながら、電話およびタブレットのようなハンドヘルドデバイスでは、閲覧者は、横向きモードと縦向きモードのいずれかで、またさらには任意の角度方向で、ディスプレイを見ることがある。
【００４８】
[0059]たとえば、位置１８Ａにおいて、デバイス１０は横向きモードにある。説明を簡単にするために、図２は、デバイス１０が横向きモードにあるときの、方向点１６を示し、それはデバイス１０の右上の角に位置する。閲覧者は、デバイス１０を４５°だけ（すなわち、位置１８Ａから位置１８Ｂに）傾け得る。この場合、図２は、位置１８Ｂにおける方向点１６が、位置１８Ａの方向点に対して、右下の向きに移動したことを示す。この例では、視線角度は４５°であると考えられ得る。
【００４９】
[0060]別の例として、閲覧者は、デバイス１０を−４５°だけ（すなわち、位置１８Ａから位置１８Ｃに）傾け得る。この場合、図２は、位置１８Ｃにおける方向点１６が、位置１８Ａの方向点に対して、左上の向きに移動したことを示す。この例では、視線角度は−４５°であると考えられ得る。閲覧者はデバイス１０を任意の量だけ傾け得るので、視線角度は−１８０°から１８０°にわたり得る。
【００５０】
[0061]たとえば、横向きおよび縦向きは、２つの典型的なディスプレイモードである（たとえば、閲覧者は、横向きモアから縦向きモードへと、またはその逆方向にデバイス１０を回転する）。これらの場合、デバイス１０は、デバイス１０が横向きモードにあるか縦向きモードにあるかを決定することができ、プロセッサは、グラフィックスドライバラッパーを介して、横向きモードまたは縦向きモードのための左眼画像と右眼画像とをＧＰＵにレンダリングさせるように、命令を修正することができる。しかしながら、閲覧者は、横向きモードまたは縦向きモードだけではなく、任意の角度にデバイス１０を向けることがある。したがって、プロセッサは、視線角度を考慮して、ＧＰＵ上で実行される命令を修正する方式を決定することができる。
【００５１】
[0062]視線角度を決定するために様々な方法が存在し得る。たとえば、デバイス１０は、横向きモードから縦向きモードへと切り替えるかどうかを決定するためにデバイス１０が使用する、加速度計を含み得る。デバイス１０はまた、適切な加速度の大きさと向きとを検出するための、単一軸モデルと複数軸モデルのいずれかの加速度計を含み得る。そのような加速度計は、重力の向きの変化に基づいて、方向を出力することができる。デバイス１０のプロセッサは、出力された方向に基づいて、視線角度を決定することができる。
【００５２】
[0063]別の例として、デバイス１０はジャイロスコープを含み得る。ジャイロスコープは、角運動量の保存の原理に基づいて方向の測定結果を与え得る。デバイス１０のプロセッサは、ジャイロスコープによって与えられた方向の測定結果に基づいて、視線角度を決定することができる。消費者向け電子デバイスで使用される、電子式のマイクロチップにパッケージングされたＭＥＭＳジャイロスコープデバイスのような、他の動作原理に基づくジャイロスコープも存在する。ジャイロスコープは、加速度計よりも、３Ｄ空間内での運動のより正確な認識を提供することができる。
【００５３】
[0064]加速度計またはジャイロスコープの出力は、プロセッサが視線角度の理にかなった推定値を決定することを可能にし得る。しかしながら、視線角度の推定値は、閲覧者が特定の方式で方向付けられている、たとえば垂直に方向付けられている（たとえば、閲覧者が自分の頭を傾けていない）という仮定に基づき得る。言い換えると、加速度計またはジャイロスコープは、ディスプレイ方向の正確な測定結果を与え得、それは視線角度の理にかなった推定値を決定するのに十分であり得るが、閲覧者の方向の正確な測定結果を与えないことがある。
【００５４】
[0065]いくつかの例では、デバイス１０のプロセッサが、閲覧者の方向（たとえば、閲覧者が垂直に方向付けられているかどうか、または閲覧者が自分の頭を傾けているかどうか）を決定することが可能であり得る。たとえば、ディスプレイ１２とデバイス１０のいずれかが、内蔵の前面カメラを含み得る。前面カメラによって、カメラプロセッサは、ディスプレイ１２に対する閲覧者の目または閲覧者の頭の方向を検出することができる。デバイス１０のプロセッサは、カメラプロセッサによって検出されるような、検出された目または頭の方向に基づいて、視線角度を決定することができる。
【００５５】
[0066]通常の光学カメラ以外に、他のセンサも、閲覧者の目または頭の方向を検出するように構成され得る。一般に、本開示で説明される技法は、ユーザの目または頭を検出することに必ずしも依存しない技法を含む、視線角度を決定するための任意の技法を利用することができる。本開示で説明される技法は、視線角度を決定するための上で説明された例に限定されるものと見なされるべきではない。
【００５６】
[0067]たとえば、本開示で説明される技法は、加速度計および／またはジャイロスコープの出力のみに基づいて、視線角度を決定することができる。別の例として、本開示で説明される技法は、ユーザの検出された目または頭のみに基づいて、視線角度を決定することができる。別の例として、本開示で説明される技法は、加速度計および／またはジャイロスコープの出力に基づいて、また、ユーザの検出された目または頭に基づいて、視線角度を決定することができる。別の例として、本技法は、加速度計および／またはジャイロスコープの出力に基づいて、また、ユーザの視線方向を決定するように構成される１つまたは複数の他のセンサに基づいて、視線角度を決定することができる。上記の任意の置換および組合せ、ならびに任意の他の技法が、視線角度を決定するために使用され得る。
【００５７】
[0068]図３は、閲覧者の目と頭の方向の検出を示す概念図である。図３において、デバイス１０のディスプレイ１２は、デバイス１０のカメラによって撮影された顔を表示する。ディスプレイ１２は、視線角度を決定するためにカメラによって撮影された画像を表示する必要はなく、図３は、説明を簡単にするために、カメラによって撮影された顔を表示するディスプレイ１２を示すことを理解されたい。
【００５８】
[0069]図３に示されるように、デバイス１０は横向きモードにあるが、閲覧者の頭は傾いている。この場合、デバイス１０のカメラプロセッサは、目２０Ａおよび２０Ｂの方向を検出し、目２０Ａおよび２０Ｂの方向をデバイス１０のプロセッサに送信することができる。目２０Ａおよび２０Ｂの方向に基づいて、デバイス１０のプロセッサは視線角度を決定することができる。本開示で説明される技法に従って、グラフィックスドライバラッパーは、決定された視線角度に基づいてＧＰＵ上で実行される命令を修正することができる。
【００５９】
[0070]図４は、視線角度の例を示す概念図である。図４において、視線角度はアルファ（α）と標識される。視線角度は、閲覧者の視線方向とディスプレイの方向との関係である。たとえば、アルファは、目の水平な向きとディスプレイの水平な向きによって形成される角度の尺度である。ディスプレイの水平な向きは、ディスプレイの方向に対する水平な面を指し、目の水平な向きは、閲覧者の目２０Ａおよび２０Ｂの方向に対する水平な面を指す。図４では、閲覧者はディスプレイ１２をまっすぐ見ている（たとえば、閲覧者の頭に傾きはない）。したがって、目の水平な向きは水平線である。図４では、デバイス１０はある角度傾けられており、横向きモードまたは縦向きモードにはない。したがって、ディスプレイの水平な向きは、デバイス１０に対しては水平であるが、目の水平な向きに対しては角度がつけられた線である。
【００６０】
[0071]図５は、本開示で説明される１つまたは複数の例示的な技法を実施し得るデバイスの例を示すブロック図である。たとえば、図５は、デバイス１０をさらに詳細に示す。図５に示されるように、デバイス１０は、アプリケーションプロセッサ２２と、グラフィックス処理ユニット（ＧＰＵ）３０と、システムメモリ３６と、１つまたは複数のセンサ４２と、カメラプロセッサ４４とを含み得る。デバイス１０は、図５に示されるものに加えて、コンポーネントを含み得る。
【００６１】
[0072]その上、いくつかの例では、アプリケーションプロセッサ２２、ＧＰＵ  ３０、およびカメラプロセッサ４４は、単一の回路パッケージ内に収容される共通の集積回路として形成され得る（たとえば、共通のプロセッサとして形成され得る）。しかしながら、本開示の態様はそのようには限定されず、アプリケーションプロセッサ２２、ＧＰＵ  ３０、およびカメラプロセッサ４４の１つまたは複数は、別々の回路パッケージに収容された別々の集積回路であり得る。
【００６２】
[0073]１つまたは複数のセンサ４２は、デバイス１０の方向の測定結果をアプリケーションプロセッサ２２に出力するように構成され得る。１つまたは複数のセンサ４２の例は、加速度計とジャイロスコープとを含む。カメラプロセッサ４４は、デバイス１０のカメラ（図示されず）またはディスプレイ１２のカメラ（図示されず）によって撮影された画像から画像データを受け取ることができる。本開示で説明される技法では、カメラは、ユーザの意図を伴わずに、バックグラウンドで、画像を継続的に撮影するように構成され得る。たとえば、撮影された画像は、表示される必要はなく、または後で取り出すために記憶される必要はない。撮影された画像から、カメラプロセッサ４４は、閲覧者の方向を決定することができる。
【００６３】
[0074]カメラプロセッサ４４は、閲覧者の方向を決定するために、閲覧者の目の方向を決定することができる。カメラプロセッサ４４は、カメラプロセッサ４４が閲覧者の目の方向を決定する際に用いる閲覧者の目を特定するために、任意の技法を実施することができる。多くの現在のカメラプロセッサは、閲覧者の目を特定するように構成され、これらの現在のカメラプロセッサは、カメラプロセッサ４４の一例であり得る。
【００６４】
[0075]１つまたは複数のセンサ４２は、デバイス１０の方向の測定結果をアプリケーションプロセッサ２２に出力することができる。カメラプロセッサ４４は、閲覧者の方向の測定結果をアプリケーションプロセッサ２２に出力することができる。アプリケーションプロセッサ２２は、デバイス１０の方向の測定結果および閲覧者の方向の測定結果に少なくとも一部基づいて、視線角度を決定することができる。たとえば、アプリケーションプロセッサ２２は、デバイス１０の方向と閲覧者の方向との間の角度となるように視線角度を決定することができる。より詳細に説明されるように、アプリケーションプロセッサ２２は、頂点シェーダ３８の命令を修正する方式を決定するために、視線角度を利用することができる。
【００６５】
[0076]カメラプロセッサ４４は、あらゆる例において必須であるとは限らない。たとえば、アプリケーションプロセッサ２２が視線角度を決定するには、デバイス１０の方向の測定結果で十分であり得る。これらの例では、アプリケーションプロセッサ２２は、視線角度の測定結果により事前構成され得る。アプリケーションプロセッサ２２は、デバイス１０の方向の測定結果および閲覧者の方向の事前構成された測定結果に基づいて、視線角度を決定することができる。別の例として、アプリケーションプロセッサ２２は、１つまたは複数のセンサ４２の出力を使用することなく、閲覧者の方向の測定結果に基づいて視線角度を決定することができる。この例では、アプリケーションプロセッサ２２は、デバイス１０の方向により事前構成され得る（たとえば、１つまたは複数のセンサ４２の出力を使用しないとき、デバイス１０の方向は横向きであると決定するように事前構成され得る）。
【００６６】
[0077]視線角度を決定するために１つまたは複数のセンサ４２とカメラプロセッサ４４とを利用することは、例示のみを目的に与えられており、限定するものと見なされるべきではない。アプリケーションプロセッサ２２が視線角度を決定できる多くの他の方法があり、本開示で説明される技法はそのような他の技法に拡張可能である。
【００６７】
[0078]いくつかの例では、アプリケーションプロセッサ２２は、閲覧者が視線角度を変更できるので、立体視ビューの生成ごとに１回、視線角度を決定することができる。たとえば、ＧＰＵ  ３０は、立体視ビューの左眼画像と右眼画像のような、レンダリングされた画像を出力することができる。左眼画像と右眼画像の両方のすべての出力の後で、アプリケーションプロセッサ２２は視線角度を決定することができる。別の例として、アプリケーションプロセッサ２２は、視線角度を継続的に決定することができる。より詳細に説明されるように、アプリケーションプロセッサ２２は、グラフィックスドライバラッパー２６を介して、頂点シェーダ３８が次の画像を処理するときに頂点シェーダ３８がアプリケーションプロセッサ２２によって決定されるような次の左眼画像および次の右眼画像のクリッピング座標を生成できるように、現在の決定された視線角度に基づいて頂点シェーダ３８の命令を修正することができる。
【００６８】
[0079]アプリケーションプロセッサ２２は、デバイス１０の中央処理ユニット（ＣＰＵ）であり得る。ＧＰＵ  ３０は、ディスプレイ上での提示のためにグラフィックスデータを出力するように動作可能な処理ユニットであり得る。アプリケーションプロセッサ２２、ＧＰＵ  ３０、およびカメラプロセッサ４４の例は、限定はされないが、デジタル信号プロセッサ（ＤＳＰ）、汎用マイクロプロセッサ、特定用途向け集積回路（ＡＳＩＣ）、フィールドプログラマブル論理アレイ（ＦＰＧＡ）、または他の等価な集積回路もしくはディスクリート論理回路を含む。
【００６９】
[0080]いくつかの例では、ＧＰＵ  ３０は、グラフィックス処理のために特に設計された特別なハードウェアであり得る。たとえば、グラフィックス処理は高速な並列処理を必要とすることがあり、ＧＰＵ  ３０はそのような高速な並列処理のために特別に設計されることがある。ＧＰＵ  ３０が、一般的な処理タスクのような、グラフィックス処理以外のタスクを実行することが可能であり得る。したがって、ＧＰＵ  ３０は、汎用処理ＧＰＵ（ＧＰＧＰＵ）と見なされ得る。本開示で説明される技法は、ＧＰＵ  ３０がグラフィックス関連のタスクのみを実行する例、またはＧＰＵ  ３０がＧＰＧＰＵである例に適用され得る。
【００７０】
[0081]システムメモリ３６は、コンピュータ可読記憶媒体の例であり得る。たとえば、システムメモリ３６は、アプリケーションプロセッサ２２とＧＰＵ  ３０とに、本開示において各々に起因する機能を実行させる命令を記憶し得る。システムメモリ３６は、１つまたは複数のプロセッサ（たとえば、アプリケーションプロセッサ２２またはＧＰＵ  ３０）に様々な機能を実行させる命令を備える、コンピュータ可読記憶媒体であると見なされ得る。
【００７１】
[0082]システムメモリ３６の例は、限定はされないが、ランダムアクセスメモリ（ＲＡＭ）、読取り専用メモリ（ＲＯＭ）、電気的消去可能プログラマブル読取り専用メモリ（ＥＥＰＲＯＭ（登録商標））、ＣＤ−ＲＯＭまたは他の光ディスクストレージ、磁気ディスクストレージもしくは他の磁気ストレージデバイス、フラッシュメモリ、または、命令もしくはデータ構造の形態の所望のプログラムコードを搬送または記憶するために使用されコンピュータもしくはプロセッサによってアクセスされ得る、任意の他の媒体を含む。システムメモリ３６は、いくつかの例では、非一時的記憶媒体と見なされ得る。「非一時的」という用語は、記憶媒体が、搬送波または伝搬される信号で具現化されないことを示し得る。しかしながら、「非一時的」という用語は、システムメモリ３６が非可動であることを意味するものと解釈されるべきでない。一例として、システムメモリ３６は、デバイス１０から取り外され、別のデバイスに移され得る。別の例として、システムメモリ３６と実質的に同様のストレージデバイスが、デバイス１０に挿入され得る。いくつかの例では、非一時的記憶媒体は、経時的に変化し得るデータを（たとえば、ＲＡＭに）記憶し得る。
【００７２】
[0083]ＧＰＵ  ３０は、シェーダプロセッサ３２と固定機能パイプライン３４とを含み得る。シェーダコアと呼ばれることもあるシェーダプロセッサ３２は、頂点シェーダおよびフラグメントシェーダのようなシェーダプログラムがその上で実行されるＧＰＵ  ３０のコアであり得る。固定機能パイプライン３４は、固定された機能を実施するハードウェアユニットを含み得る。言い換えると、頂点シェーダおよびフラグメントシェーダのようなシェーダプログラムは、シェーダプロセッサ３２上で実行され、機能的な柔軟性を可能にするソフトウェアユニットであってよく、固定機能パイプライン３４は、固定された機能と最低限の機能的な柔軟性とを伴うハードウェアユニットを含む。
【００７３】
[0084]たとえば、ＧＰＵのいくつかの以前のバージョンは、グラフィックスパイプラインにおいて固定機能ユニットのみを含んでいた。ＧＰＵ  ３０では、ＧＰＵの以前のバージョンの固定機能グラフィックスパイプラインは、頂点シェーダ３８およびフラグメントシェーダのような頂点シェーダによって部分的に置き換えられる。たとえば、頂点シェーダ３８は固定機能ユニットモデルビュー変換、照明、および投影のような機能を実行し得、それらはＧＰＵの以前のバージョンでは固定機能ユニットによって実行されていた。フラグメントシェーダは、ＧＰＵの以前のバージョンにおいて、固定機能ユニットのフラグメント段階の機能を実行することができる。
【００７４】
[0085]本開示で説明される例示的な技法は、修正されたシェーダプログラムがシェーダプロセッサ３２上で実行されると、ＧＰＵ  ３０が視線角度に基づいてＳ３Ｄ画像（たとえば、立体視ビュー）のためのグラフィックスデータを生成するように、単一の３次元（３Ｄ）画像（たとえば、モノビューのための）を生成するように設計されたシェーダプログラムを修正することができる。やはり、上で論じられたように、立体視ビューは、左眼画像と右眼画像とを含む。左眼画像および右眼画像は、モノビュー画像と実質的に同様のグラフィックスコンテンツを含むが、左眼画像および右眼画像の１つまたは複数の対応するピクセルは、互いに対して、水平軸に沿ってずらされ得る。
【００７５】
[0086]たとえば、右眼画像が左眼画像の上に配置されることを考える。この場合、右眼画像中のコンテンツのすべてが、左眼画像中の同一のコンテンツに対して完全には整列しないことがある。むしろ、右眼における１つまたは複数の物体は、左眼画像における同一の物体の左または右にあり得る（たとえば、右眼画像における物体と左眼画像における物体との間に水平視差があり得る）。高品質の立体視効果のために、右眼画像における物体と左眼画像における物体との間には垂直視差はないことがある。
【００７６】
[0087]左眼画像は閲覧者の左眼によって閲覧可能であり、右眼画像は閲覧者の左眼から遮断される。右眼画像は閲覧者の右眼によって閲覧可能であり、左眼画像は閲覧者の右眼から遮断される。いくつかの例では、閲覧者は、左眼画像が右眼によって閲覧可能であることを阻止し、右眼画像が左眼によって閲覧可能であることを阻止する特殊な眼鏡を着用し得る。しかしながら、本開示の態様は、必ずしも、閲覧者に特殊な眼鏡を着用するように要求するとは限らない。たとえば、いくつかのディスプレイは、立体視ビューを体験するために、閲覧者に特殊な眼鏡を着用するように要求しない。本開示の技法は、そのようなディスプレイに拡張され得る。
【００７７】
[0088]ＧＰＵ  ３０は、閲覧者が左眼画像と右眼画像の両方を同時に見るとき、２つの画像を表示しているディスプレイから飛び出し、またはディスプレイに押し込まれる（たとえば、ディスプレイの前または後にあるように見える）画像を、閲覧者の脳が閲覧者に知覚させるように、左眼画像および右眼画像のためのグラフィックスデータを生成することができる。この飛び出し、または押し込みは、閲覧者の脳が、実質的に同様のコンテンツを伴う立体視ビューの２つの画像における水平方向の不一致を解決することによる。たとえば、閲覧者の両眼視は、左眼画像と右眼画像の両方を同時に閲覧者に見させ、閲覧者は、奥行きを知覚することによって、左眼画像と右眼画像の水平視差を解決する。
【００７８】
[0089]ある例として、アプリケーションプロセッサ２２は、システムメモリ３６に記憶されたアプリケーション４２のような、１つまたは複数のアプリケーションを実行し得る。アプリケーション３２の例は、限定はされないが、ウェブブラウザ、ユーザインターフェース、ｅメールアプリケーション、表計算アプリケーション、文書処理アプリケーション、グラフィックス編集アプリケーション、ビデオゲーム、または可視オブジェクトを表示のために生成する他のアプリケーションを含む。たとえば、アプリケーション４２は、実行されると、ディスプレイ上に表示されるグラフィカルコンテンツを出力するビデオゲームであってよい。
【００７９】
[0090]アプリケーション４２は、モノビューのために開発者によって設計され得る。たとえば、アプリケーション４２は、実行されると、３Ｄグラフィックスコンテンツを生成することができ、３Ｄグラフィックスコンテンツは、ディスプレイの２Ｄエリアに制限される。アプリケーション４２は、アプリケーションプロセッサ２２上で実行されると、生成された３Ｄグラフィックスコンテンツを、三角形、矩形、または他のタイプの多角形のようなプリミティブに分割し得る。これらのプリミティブの各々は、ディスプレイ上に表示されるべきピクセルを含み得る。たとえば、これらのプリミティブは、画像内の物体を形成し得る。アプリケーション４２は、アプリケーションプロセッサ２２上で実行されると、プリミティブの頂点の各々にピクセル値を割り当てることもできる。たとえば、ピクセル値は、頂点の３Ｄ座標と、頂点の色値と、頂点の透明度値とを含み得る。ピクセル値は、本開示のすべての態様において、上記の例示的な成分のすべてを含む必要はない。
【００８０】
[0091]アプリケーションプロセッサ２２は次いで、頂点のピクセル値を、さらなる処理のためにＧＰＵ  ３０に転送することができる。たとえば、アプリケーションプロセッサ２２は、グラフィックスドライバ２４を含み得、それはアプリケーションプロセッサ２２上で実行されるソフトウェアであり得る。アプリケーションプロセッサは、グラフィックスドライバ２４を介して、コマンドをＧＰＵ  ３０に送るように構成されてよく、それに応答して、ＧＰＵ  ３０は、受け取られたコマンドに従って機能を実行し得る。たとえば、グラフィックスドライバ２４は、ＧＰＵ  ３０とアプリケーションプロセッサ２２との間のインターフェースとして機能する。アプリケーションプロセッサ２２がコマンドをＧＰＵ  ３０に発行するとき、ＧＰＵ  ３０がコマンドを受信するのは、グラフィックスドライバ２４を通してである。たとえば、アプリケーションプロセッサ２２上で実行されるアプリケーション４２は、ＧＰＵ  ３０に、特定のタスクを実行するように命令し得る。この場合、グラフィックスドライバ２４は、アプリケーション４２から特定のタスクのための命令を受け取ることができ、アプリケーションプロセッサ２２は、その命令をＧＰＵ  ３０に与えることができる。それに応答して、ＧＰＵ  ３０はタスクを実行することができる。
【００８１】
[0092]いくつかの例では、グラフィックスドライバ２４は、特定のアプリケーションプログラミングインターフェース（ＡＰＩ）に従って設計され得る。たとえば、グラフィックスドライバ２４は、ＯｐｅｎＧＬまたはＯｐｅｎＧＬ  ＥＳ（組込みシステム）ＡＰＩに従って設計され得、それらは、ＫｈｒｏｎｏｓグループのＡＰＩであり、それらの仕様は公的に入手可能である。しかしながら、本開示の技法は、ＤｉｒｅｃｔＸ  ９、１０、もしくは１１のようなＭｉｃｒｏｓｏｆｔ  ＤｉｒｅｃｔＸシステム、または任意の他のシェーダベースのグラフィックスシステムおよびＡＰＩにも拡張可能であり得る。説明のために、本開示の技法は、ＡＰＩがＯｐｅｎＧＬ  ＥＳ  ２．０  ＡＰＩである文脈において説明される。しかしながら、本開示の態様はそのようには限定されず、他のＡＰＩまたはシェーダベースのグラフィックスシステムにも拡張され得る。
【００８２】
[0093]アプリケーションプロセッサ２２から受け取られたプリミティブをレンダリングするために、ＧＰＵ  ３０のシェーダプロセッサ３２は、頂点シェーダおよびフラグメントシェーダのような、１つまたは複数のシェーダプログラムを実行して、ディスプレイのピクセルのピクセル値を生成することができる。開発者は、これらの頂点シェーダとフラグメントシェーダとを、本開示において説明の目的で使用されるＯｐｅｎＧＬ  ＥＳ  ２．０  ＡＰＩのようなＡＰＩに従って、開発することができる。これらの頂点シェーダおよびフラグメントシェーダに関するソースコードは、システムメモリ３６に記憶され得る。
【００８３】
[0094]たとえば、アプリケーション４２は、頂点シェーダ３８を利用し得、それはアプリケーション４２によって生成されるモノビューの画像に対して動作するように構成され得る。アプリケーション４２によって生成されたモノビューの画像のピクセル値は、頂点シェーダ３８を使用して、シェーダプロセッサ３２によって処理される必要があり得る。一例として、頂点シェーダ３８は、アプリケーションプロセッサ２２上でのアプリケーション４２の実行中にアプリケーション４２によって特に呼び出される頂点シェーダであり得る。頂点シェーダ３８は、ＧＰＵ  ２０のシェーダプロセッサ３２上で実行され得、アプリケーション４２は、アプリケーションプロセッサ２２上で実行され得るが、頂点シェーダ３８およびアプリケーション４２は、アプリケーション４２によって生成された画像を表示する目的のために、相互に関係し得る。
【００８４】
[0095]頂点シェーダ３８のソースコードは、システムメモリ３６に記憶され得る。アプリケーションプロセッサ２２は、グラフィックスドライバ２４を介して、頂点シェーダ３８のソースコードを取り出し、頂点シェーダ３８のためのソースコードをコンパイラ２８に与えることができる。コンパイラ２８は、頂点シェーダ３８のソースコードをコンパイルして、頂点シェーダ３８のオブジェクトコードを生成し、オブジェクトコードをシステムメモリ３８に記憶することができる。アプリケーションプロセッサ２２は、グラフィックスドライバ３４を介して、ＧＰＵ  ３０に、頂点シェーダ３８のオブジェクトコードをシステムメモリ３６から取り出すよう命令し、ＧＰＵ  ３０に、頂点シェーダ  ３８のオブジェクトコードをシェーダプロセッサ３２上で実行するよう命令することができる。シェーダプロセッサ３２は次いで、頂点シェーダ３８のオブジェクトコードを実行して、アプリケーション４２の実行によって生成された、頂点のピクセル値を処理することができる。ＧＰＵ  ３０は、固定機能パイプライン３４およびシェーダプロセッサ３２とともに、表示用のアプリケーション４２のためのグラフィックスコンテンツを生成することができる。
【００８５】
[0096]システムメモリ３６は、ただ１つの頂点シェーダ３８のためのソースコードを記憶するように示されているが、本開示の態様は、そのようには限定されない。たとえば、アプリケーション４２は、場合によっては、複数の異なる頂点シェーダを利用することができ、これらの頂点シェーダの各々のためのソースコードは、システムメモリ３６に記憶され得る。たとえば、頂点シェーダは、コンテンツに依存するもの、またさらにはシーンに依存するものであってよく、アプリケーション４２は、レンダリングされるべき画像のコンテンツまたはシーンに基づいて特定のシェーダを利用することができる。また、アプリケーション４２は、頂点シェーダ３８の複数のインスタンス化の実行を要求し得る。たとえば、シェーダプロセッサ３２は、頂点シェーダ３８の複数のインスタンス化を同時に（たとえば、並行して）実行することができ、この場合、頂点シェーダ３８の各インスタンス化は、実質的に同様の機能を、しかし異なるピクセル値に対して実行する。システムメモリ３６は同様に、フラグメントシェーダに関するソースコードを記憶することができる。グラフィックスドライバ３４は、フラグメントシェーダに関するソースコードを取り出すことができ、コンパイラ２８は、ソースコードをコンパイルして、フラグメントシェーダに関するオブジェクトコードを、頂点シェーダ３８について上で説明されたのと同様の方式で生成することができる。
【００８６】
[0097]さらに詳細に説明されるように、本開示の１つまたは複数の例示的な技法は、コンパイルの前に、視線角度に基づいて頂点シェーダ３８（たとえば、頂点シェーダ３８のソースコード）を修正することができる。コンパイラ２８は、修正されたソースコードをコンパイルして、修正された頂点シェーダ４０のオブジェクトコードを生成することができる。シェーダプロセッサ３２は、修正された頂点シェーダ４０のオブジェクトコードを実行することができ、このことは、ＧＰＵ  ３０に、立体視３Ｄグラフィックスコンテンツ（たとえば、Ｓ３Ｄの左眼画像および右眼画像用のグラフィックスコンテンツ）を生成させ得る。しかしながら、頂点シェーダ３８に対する修正について説明する前に、以下では、頂点シェーダ３８の例示的な機能を説明し、この説明は、頂点シェーダ３８のソースコードに適用される修正の理解を助け得る。さらに、本開示では、「コマンド」と「命令」という用語は互換的に使用され得る。
【００８７】
[0098]上で説明されたように、アプリケーションプロセッサ２２は、アプリケーション４２を介して、プリミティブの頂点の座標を生成することができる。これらの座標は、ワールド座標と呼ばれることがあり、アプリケーション４２に固有であり得る。言い換えると、アプリケーション４２によって定義された頂点の座標は、必ずしも、その上にプリミティブが表示されるディスプレイの座標であるとは限らないことがあり、場合によっては、可視領域の外部にある頂点の座標であり得る。頂点シェーダ３８は、３Ｄであり得るワールド座標を、ディスプレイの２Ｄ座標（たとえば、ディスプレイ座標）に変換するように設計され得る。この機能を実行するために、頂点シェーダ３８は、ワールド座標を視点座標に、次いで、クリッピング座標に変換することができる。たとえば、頂点シェーダ３８の出力は、実行されるとき、頂点のクリッピング座標であり得る。最終的なディスプレイ座標（たとえば、ディスプレイの座標）は、その後、固定機能パイプライン３４の一部として決定され得る。
【００８８】
[0099]クリッピング座標は視錐台（view frustum）を定義し得る。視錐台は、３Ｄグラフィックスコンテンツの可視領域を定義し得る。ＧＰＵ  ３０は、視錐台の外部に存在するピクセルを選別するために、視錐台を利用し得る。たとえば、固定機能パイプライン３４の固定機能ユニット（たとえば、固定機能パイプライン２４の錐台（frustum）ユニット）は、頂点シェーダ３８によって生成されたクリッピング座標によって定義されるような、視錐台の外にあるピクセルを選別することができる。
【００８９】
[0100]ワールド座標からクリッピング座標を計算する式は、次の通りであり得る。
【数１】
2016509298.tif 000003
【００９０】
上式で、Ｖｃｌｉｐは頂点クリップ座標であり、Ｖｅｙｅは頂点視点座標であり、Ｖｗｏｒｌｄは、アプリケーション４２によって与えられる頂点ワールド座標であり、ＰＲＪは投影行列であり、ＭＶＴはモデルビュー変換行列（またはワールドビュー変換行列）である。いくつかの例では、ＰＲＪおよびＭＶＴ行列は、単一の行列へと組み合わされ得る。しかしながら、理解しやすくするために、これらの行列は別々に記述される。
【００９１】
[0101]投影行列（ＰＲＪ）およびモデルビュー、またはワールドビュー、変換行列（ＭＶＴ）は、ＡＰＩによって定義され得る。モデルビューおよびワールドビューという用語は、互換的に使用され得る。Ｖｃｌｉｐ、Ｖｅｙｅ、およびＶｗｏｒｌｄは、４つの成分（たとえば、ｘ座標、ｙ座標、ｚ座標、およびｗ座標）を含み得る。
【００９２】
[0102]Ｖｃｌｉｐ行列、Ｖｅｙｅ行列、およびＶｗｏｒｌｄ行列は、次のように表され得る。
【数２】
2016509298.tif 000004
【００９３】
[0103]プログラマブルシェーダを伴うＯｐｅｎＧＬ、ＯｐｅｎＧＬ  ＥＳ、およびＯｐｅｎＧＬ  ＥＳ  ２．０  ＡＰＩは、ＰＲＪ行列を次のように定義する。
【数３】
2016509298.tif 000005
【００９４】
上式で、ＬおよびＲは、それぞれ、左および右の垂直クリッピング面のための座標を規定し、ＢおよびＴは、それぞれ、下および上の水平クリッピング面のための座標を規定し、ｚnearおよびｚfarは、それぞれ、近深度クリッピング面および遠深度クリッピング面までの距離を規定する。
【００９５】
[0104]いくつかの例では、クリッピング面は対称的であってよい。たとえば、−ＬはＲに等しくてよく、−ＢはＴに等しくてよい。これらの例では、ＰＲＪ行列は次のように簡略化され得る。
【数４】
2016509298.tif 000006
【００９６】
[0105]プログラマブルシェーダを伴うＯｐｅｎＧＬ、ＯｐｅｎＧＬ  ＥＳ、およびＯｐｅｎＧＬ  ＥＳ  ２．０  ＡＰＩは、ＭＶＴ行列を次のように定義する。
【数５】
2016509298.tif 000007
【００９７】
[0106]ＰＲＪ行列およびＭＶＴ行列の変数はすべて、アプリケーションプロセッサ２２上で実行されるアプリケーション４２によって定義されてよく、グラフィックスドライバ２４は、これらの変数を、頂点シェーダ３８のオブジェクトコードを実行しているシェーダプロセッサ３２に与えることができる。これらの変数を有する式１、４、および５から理解され得るように、頂点シェーダ３８は、頂点の各々のＶｃｌｉｐ座標を決定することができる。ＧＰＵ  ３０は、頂点のクリップ座標を利用し、固定機能パイプライン３４およびフラグメントシェーダの機能とともに、さらなる機能を実行して、画像を表示のためにレンダリングすることができる。このようにして、ＧＰＵ  ３０は、アプリケーション４２によって生成されたグラフィックスコンテンツのためのモノビューを生成することができる。
【００９８】
[0107]本開示の技法によると、頂点シェーダ３８は、ＭＶＴ行列およびＰＲＪ行列のための変数を使用して、Ｖｃｌｉｐ座標を決定することができるが、ＭＶＴ行列およびＰＲＪ行列は、立体ビューを生成するように頂点シェーダ３８を修正する（たとえば、頂点シェーダ３８のソースコードを修正する）のに必要とされないことがある。言い換えると、本開示で説明される技法が修正する命令は、ＭＶＴ行列およびＰＲＪ行列の特定の値を必要としないことがある。
【００９９】
[0108]たとえば、頂点シェーダ３８を設計するための多くの方法があってよく、頂点シェーダ３８は、コンテンツ開発者が頂点シェーダ３８をプログラムするために多くの異なる方法を利用することを可能にする、コンテンツに依存したもの、さらにはシーンに依存したものであり得る。したがって、ＭＶＴ行列およびＰＲＪ行列が開発者によって定義される具体的な方法を決定することは可能ではないことがある。しかしながら、本開示で説明される技法は、開発者が頂点シェーダ３８を開発した方式、または開発者がＭＶＴ行列とＰＲＪ行列とを定義した方式についての知識を必要としない。
【０１００】
[0109]上の例は、モノビューのＶｃｌｉｐ座標を決定するための１つの方法を説明する。クリッピング座標を計算するための多くの異なる技法があってよく、一般に、クリッピング座標を計算するのに利用される具体的な技法は重要ではないことがある。しかしながら、いずれにしても、３Ｄグラフィックスコンテンツの場合、クリッピング座標（Ｖｃｌｉｐ）は、クリッピング座標を計算するのに使用される技法にかかわらず、計算される必要があり得る。たとえば、アプリケーションプロセッサ２２がクリッピング座標を決定することさえも可能であってよく、グラフィックスドライバ２４は、頂点シェーダ３８のオブジェクトコードを実行しているシェーダプロセッサ３２にクリッピング座標を与えることができる。この例では、ＰＲＪ行列およびＭＶＴ行列は、単位行列であり得る。たとえば、アプリケーションプロセッサ２２は、式１の行列乗算を実行し、結果をシェーダプロセッサ３２に与えることができる。この例では、シェーダプロセッサ３２は、受け取られた値を単位行列で乗算して、アプリケーション４２によって生成された頂点の各々のＶｃｌｉｐ座標を生成することができる。
【０１０１】
[0110]しかしながら、いずれの場合にも（たとえば、頂点シェーダ３８を実行するシェーダプロセッサ３２がクリッピング座標を決定する場合、または頂点シェーダ３８を実行するシェーダプロセッサ３２がクリッピング座標を受け取る場合）、頂点シェーダ３８は、クリッピング座標を記憶するために固有の変数を利用することができる。固有の変数は、頂点シェーダ３８がそのために設計されるＡＰＩに特有であり得る。たとえば、頂点シェーダ３８が、プログラマブルシェーダとともにＯｐｅｎＧＬ、ＯｐｅｎＧＬ  ＥＳ、またはＯｐｅｎＧＬ  ＥＳ  ２．０  ＡＰＩに従って設計される場合、頂点シェーダ３８は、クリッピング座標をｇｌ＿Ｐｏｓｉｔｉｏｎ変数に記憶することができる。ｇｌ＿Ｐｏｓｉｔｉｏｎ変数は自動的に宣言され得る。他のグラフィックスＡＰＩにも、同様の変数があり得る。頂点シェーダ３８が、プログラマブルシェーダとともに、ＯｐｅｎＧＬ、ＯｐｅｎＧＬ  ＥＳ、またはＯｐｅｎＧＬ  ＥＳ  ２．０  ＡＰＩに従って設計される場合、頂点シェーダ３８は、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＝ｘclip、ｇｌ＿Ｐｏｓｔｉｏｎ．ｙ＝ｙclip、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｚ＝ｚclip、およびｇｌ＿Ｐｏｓｉｔｉｏｎ．ｗ＝ｗclipのような命令を含んでよく、ここで、式２において上で示されたように、
【数６】
2016509298.tif 000008
【０１０２】
である。
【０１０３】
[0111]本開示で説明される１つまたは複数の例示的な技法において、アプリケーションプロセッサ２２上で実行されるソフトウェアであり得るグラフィックスドライバラッパー２６は、モノビューのクリッピング座標を定義する頂点シェーダ３８の命令を、立体視ビューのクリッピング座標（たとえば、左眼画像のクリッピング座標および右眼画像のクリッピング座標）を定義するように修正することができる。たとえば、グラフィックスドライバラッパー２６は、アプリケーションプロセッサ２２から決定された視線角度を受け取ることができる。アプリケーションプロセッサ２２は、グラフィックスドライバラッパー２６の実行が原因で、立体視ビューのクリッピング座標を定義するように、アプリケーションプロセッサ２２によって決定された視線角度に基づいて頂点シェーダ３８の命令を修正するように構成され得る。
【０１０４】
[0112]たとえば、頂点シェーダ３８の修正された命令がシェーダプロセッサ３２によって初めて実行されるときに、頂点シェーダ３８の修正された命令が視線角度に基づいてある向きにクリッピング座標をずらし、頂点シェーダ３８の修正された命令がシェーダプロセッサ３２によって２回目に実行されるときに、頂点シェーダの修正された命令が視線角度に基づいて別の向きに同じクリッピング座標をずらすように、アプリケーションプロセッサ２２は、グラフィックスドライバラッパー２６を介して、頂点シェーダ３８の命令を修正することができる。しかしながら、クリッピング座標を異なる向きに単にずらすこと、および得られる画像をレンダリングすることは、立体視ビューを、ある一定の量だけディスプレイ１２から常に飛び出るように、またはディスプレイ１２へと常に押し込まれるようにし得る。そのような結果は、閲覧者にとって快適ではないことがある。
【０１０５】
[0113]たとえば、立体視ビューがディスプレイ１２から飛び出すことを仮定する。この場合、閲覧者は、ディスプレイ１２の前方のある距離にある平面上で、立体視ビューを知覚し得る。閲覧者が立体視ビューを知覚するこの平面は、ゼロ視差平面（ＺＤＰ）と呼ばれ得る。しかしながら、閲覧者は、現在のゼロ視差平面とは異なる距離において、ゼロ視差平面を知覚することを望むことがある。
【０１０６】
[0114]ゼロ視差平面の調整のために、アプリケーションプロセッサ２２は、グラフィックスドライバラッパー２６を介して、左眼画像と右眼画像との間の水平視差を、増やし、または減らし得る。たとえば、アプリケーション４２は、単一の画像のビューポートを定義するコマンドを出力し得る。「ビューポート」という用語は、画像がディスプレイ１２上で包含するエリアを指す。たとえば、アプリケーション４２は、ディスプレイ１２上の単一の画像（たとえば、モノビュー）のサイズと位置とを定義し得る。単一の画像のサイズおよび位置のこの定義は、単一の画像のためのビューポートと見なされ得る。ビューポートを定義するために、アプリケーションプロセッサ２２は、アプリケーション４２を介して、ディスプレイ１２上でのモノビュー画像のサイズと位置とをその変数が定義する、ｇｌＶｉｅｗｐｏｒｔコマンドを発行することができる。アプリケーションプロセッサ２２は、グラフィックスドライバラッパー２６を介して、視線角度に基づいて、単一の画像のサイズと位置とを定義するコマンド（たとえば、アプリケーション３２によって発行されたｇｌＶｉｅｗｐｏｒｔコマンド）を、左眼画像および右眼画像のサイズと位置とを定義するコマンド（たとえば、左眼画像のためのビューポートと、右眼画像のためのビューポートとを定義するｇｌＶｉｅｗｐｏｒｔコマンド）に修正することができる。左眼画像のためのｇｌＶｉｅｗｐｏｒｔコマンドは、視線角度に基づいて左眼画像をディスプレイの一部分に制限することができ、右眼画像のためのｇｌＶｉｅｗｐｏｒｔコマンドは、視線角度に基づいて右眼画像をディスプレイの別の部分に制限することができる。これらの２つの部分が少なくとも部分的に重複することが可能であり得る。
【０１０７】
[0115]いくつかの例では、アプリケーションプロセッサ２２は、グラフィックスドライバラッパー２６を介して、左眼画像と右眼画像との間の水平視差を、増やし、または減らすように、ｇｌＶｉｅｗｐｏｒｔコマンドを修正することができる。たとえば、左眼画像がある部分に制限され、右眼画像が別の部分に制限されるとき、左眼画像中の同様の物体のすべてと右眼画像中の同様の物体のすべてとの間に、ある固定された水平視差があり得る。言い換えると、左眼画像および右眼画像における対応する頂点の各々の間の水平視差の量は、同じであり得る。説明のための例として、アプリケーション４２によって生成される画像はボールとブロックとを含んでいたと仮定する。この例では、左眼画像中のボールの頂点と右眼画像中のボールの頂点との間の水平視差は、左眼画像中のブロックの頂点と右眼画像中のブロックの頂点との間の水平視差と同じであり得る。したがって、得られる立体視ビュー、ボールおよびブロックは、ゼロ視差平面に現れることがあり、ゼロ視差平面はディスプレイ１２の前または後にある。ボールおよびブロックがゼロ視差平面に現れるとき、そのボールおよびブロックは、ゼロ視差平面に押し込まれているように、またはゼロ視差平面から飛び出しているようには見えないことがある。
【０１０８】
[0116]ゼロ視差平面の位置（たとえば、ゼロ視差平面がディスプレイ１２に対してどの程度の量だけ前または後にあるか）を調整するために、アプリケーションプロセッサ２２は、グラフィックスドライバラッパー２６を介して、左眼画像中の同様の物体と右眼画像中の同様の物体との間の水平視差を閲覧者が定義することを可能にするように、ｇｌＶｉｅｗｐｏｒｔコマンドの命令を修正することができる。たとえば、閲覧者は、左眼画像中の同様の物体と右眼画像中の同様の物体との間の水平視差を定義する、水平視差値を与えることができる。
【０１０９】
[0117]このようにして、閲覧者はさらに、左眼画像中のすべての同様の物体と右眼画像中のすべての同様の物体が水平方向にずらされる量を定義できるので、閲覧者は、左眼画像と右眼画像との間の水平視差を定義するものと見なされ得る。上で説明されたように、左眼画像と右眼画像との間の水平視差の量は、立体視ビューがその分だけディスプレイ１２の前または後にあるように見える量を定義する。したがって、左眼画像と右眼画像との間の水平視差を定義することによって、閲覧者は、ゼロ視差平面の位置を定義することができる。
【０１１０】
[0118]いくつかの例では、閲覧者が左眼画像と右眼画像との間の水平視差を定義する代わりに、アプリケーションプロセッサ２２が、左眼画像と右眼画像との間の水平視差を推定することができる。一例として、アプリケーションプロセッサ２２またはグラフィックスドライバラッパー２６は、左眼画像と右眼画像との間の水平視差を、増やし、または減らすためにグラフィックスドライバラッパー２６が使用する、水平視差値によってプリロードされ得る。この水平視差値は、閲覧者が一般にディスプレイ１２を見るときのディスプレイ１２からの一般的な距離の仮定に基づき得る。たとえば、デバイス１０がモバイルデバイスである例では、大半の閲覧者は、自分の顔からほぼ同じ距離において、デバイス１０を持つ。したがって、大半の閲覧者は、ディスプレイ１２からほぼ同じ距離だけ前方に、ゼロ視差平面が現れることを好み得る。アプリケーションプロセッサ２２またはグラフィックスドライバラッパー２６は、ディスプレイ１２から一般に好まれる距離だけ前方にあるゼロ視差平面を作成する、水平視差値によってプリロードされ得る。
【０１１１】
[0119]別の例として、カメラプロセッサ４４は、ディスプレイ１２からの閲覧者の距離の推定値を決定するように構成され得る。たとえば、カメラプロセッサ４４は、閲覧者の頭を特定することができ、頭のサイズの測定結果に基づいて、カメラプロセッサ４４は、ディスプレイ１２に対する閲覧者の距離を推定することができる。この例では、アプリケーションプロセッサ２２は、水平視差値を決定するために閲覧者の距離のこの推定値を利用することができ、水平視差値は、左眼画像と右眼画像との間の水平視差の量を定義する。
【０１１２】
[0120]本開示で説明される技法では、ｇｌＶｉｅｗｐｏｒｔコマンドは、頂点シェーダ３８の命令ではなくてよい。むしろ、固定機能パイプライン３４のビューポート変換ユニットは、ｇｌＶｉｅｗｐｏｒｔコマンドに基づいて、左眼画像をある部分へと制限し、右眼画像を別の部分へと制限することができる。これらの例では、ＧＰＵ  ３０は、ゼロ視差平面がディスプレイ１２に対して所望の位置にあるように、視線角度に基づいて左眼画像をディスプレイ１２のある部分に制限し、視線角度に基づいて右眼画像をディスプレイ１２の別の部分に制限するために、ｇｌＶｉｅｗｐｏｒｔコマンドを固定機能パイプライン３４のビューポート変換ユニットに提供することができる。
【０１１３】
[0121]ｇｌＶｉｅｗｐｏｒｔコマンドの修正の上の例では、アプリケーションプロセッサ２２は、グラフィックスドライバラッパー２６を介して、閲覧者が所望のゼロ視差平面において立体視ビューを知覚するように、左眼画像と右眼画像との間の水平視差を定義することができる。いくつかの例では、同様の物体の間の水平視差を閲覧者が異なる量だけ増やしまたは減らすことを可能にすることによって、さらに良好な閲覧体験が実現され得る。たとえば、ｇｌＶｉｅｗｐｏｒｔコマンドの修正において、アプリケーションプロセッサ２２は、グラフィックスドライバラッパー２６を介して、左眼画像中の同様の物体と右眼画像中の同様の物体が同じ量だけずらされるように、ｇｌＶｉｅｗｐｏｒｔコマンドを修正することができる。このことは、立体視ビューがゼロ視差平面においてディスプレイ１２の前または後に現れることをもたらす。しかしながら、閲覧者はまた、一部の物体をゼロ視差平面の前に出現させ、一部の物体をゼロ視差平面の後に出現させ、一部の物体をゼロ視差平面に出現させることを望むことがある。
【０１１４】
[0122]いくつかの例では、閲覧者またはアプリケーションプロセッサ２２がゼロ視差平面の位置を定義する水平視差値を決定するのではなく、閲覧者がゼロ視差平面の位置を定義することができ、または、プロセッサ２２がゼロ視差平面の位置を決定することができる。これらの例では、アプリケーションプロセッサ２２は、グラフィックスドライバラッパー２６を介して、ｇｌＶｉｅｗｐｏｒｔコマンドを２回、すなわち左眼画像に対して１回、および右眼画像に対してもう１回実行させるため以外に、アプリケーション４２によって発行されるｇｌＶｉｅｗｐｏｒｔコマンドを修正する必要は必ずしもないことがある。むしろ、アプリケーションプロセッサ２２は、グラフィックスドライバラッパー２６を介して、アプリケーション４２によって出力されるプリミティブの頂点が左眼画像および右眼画像において異なる量だけずらされるように、頂点シェーダ３８の命令をさらに修正することができる。
【０１１５】
[0123]たとえば、グラフィックスドライバラッパー２６がｇｌＶｉｅｗｐｏｒｔコマンドを修正する例では、グラフィックスドライバラッパー２６は、画像レベルで水平視差（たとえば、右眼画像と左眼画像との間の水平視差）を定義するものとして見なされ得る。たとえば、グラフィックスドライバラッパー２６は、２つのｇｌＶｉｅｗｐｏｒｔコマンド、すなわち、視線角度に基づいて左眼画像をある部分に制限するための１つのコマンドと、視線角度に基づいて右眼画像を別の部分に制限するためのもう１つのコマンドとを、作成することができる。たとえば、アプリケーション４２は、単一の画像のビューポートを定義するｇｌＶｉｅｗｐｏｒｔコマンドを発行し得る。グラフィックスドライバラッパー２６は、左眼画像のビューポートを１回目の実行インスタンスにおいて定義するようにアプリケーション４２によって発行されたｇｌＶｉｅｗｐｏｒｔコマンドを修正し、右眼画像のビューポートを２回目の実行インスタンスにおいて定義するようにアプリケーション４２によって発行されたｇｌＶｉｅｗｐｏｒｔコマンドを修正することができる。
【０１１６】
[0124]アプリケーションプリミティブ２２がグラフィックスドライバラッパー２６を介して頂点シェーダ３８の命令をさらに修正する例では、グラフィックスドライバラッパー２６は、頂点レベルで水平視差（たとえば、左眼画像における頂点と右眼画像における頂点との間の水平視差）を定義するものとして見なされ得る。したがって、視差を調整するために頂点シェーダ３８の命令を修正することは、視差を調整するためにｇｌＶｉｅｗｐｏｒｔコマンドの命令を修正することと比較して、より精密なレベルの視差の調整を行うことができる。グラフィックスドライバラッパー２６が頂点シェーダ３８の命令をさらに調整する例では、ＧＰＵ  ３０は、左眼画像および右眼画像のためのビューポートを定義するために、アプリケーション４２によって発行されたｇｌＶｉｅｗｐｏｒｔコマンドを利用することができる（たとえば、ｇｌＶｉｅｗｐｏｒｔコマンドの修正は必要とされないことがある）。たとえば、グラフィックスドライバラッパー２６は、ｇｌＶｉｅｗｐｏｒｔコマンドを２回、すなわち、左眼画像と右眼画像の各々に対して１回ずつ実行させ得る。しかしながら、この例では、グラフィックスドライバラッパー２６は、アプリケーション４２によって発行されたｇｌＶｉｅｗｐｏｒｔコマンドを修正しなくてよく、一部の物体がゼロ視差平面の前に現れ、一部の物体がゼロ視差平面より後に現れ、一部の物体がゼロ視差平面において現れるように、頂点が異なる量だけずらされることを、頂点シェーダ３８の命令に対する追加の修正が可能にし得る。
【０１１７】
[0125]たとえば、アプリケーション４２は、３次元（たとえば、ｘ、ｙ、ｚ、ｗ座標）においてプリミティブの頂点を定義することができ、ｗ座標は同次座標である。本開示で説明される技法では、アプリケーション２２は、グラフィックスドライバラッパー２６を介して、頂点が左眼画像および右眼画像においてずらされる量を決定するために、頂点のｚ座標の値を利用することができる。たとえば、ｚ座標の値がｚ視差平面の位置に等しい場合、頂点シェーダ３８の修正された命令は、左眼画像および右眼画像において頂点をずらさなくてよい。しかしながら、ｚ座標の値がｚ視差平面の位置に等しくない場合、頂点シェーダ３８の修正された命令は、左眼画像および右眼画像において頂点の位置をずらすことができる。頂点シェーダ３８の修正された命令が頂点の位置をずらす量は、ｚ座標の値に基づき得る。
【０１１８】
[0126]グラフィックスドライバラッパー２６が画像レベルにおいて視差を調整するためにｇｌＶｉｅｗｐｏｒｔコマンドを修正する例では、グラフィックスドライバラッパー２６はさらに、頂点レベルにおいて視差を調整するために頂点シェーダ３８の命令を修正しなくてよい。グラフィックスドライバラッパー２６が頂点レベルにおいて視差を調整するために頂点シェーダ３８の命令をさらに修正する例では、グラフィックスドライバラッパー２６は、画像レベルにおいて視差を調整するためにｇｌＶｉｅｗｐｏｒｔコマンドを修正しなくてよい。しかしながら、本開示の態様はそのようには限定されず、グラフィックスドライバラッパー２６が、画像レベルにおいて視差を調整するためにｇｌＶｉｅｗｐｏｒｔコマンドを修正することと、頂点レベルにおいて頂点の間の視差を調整するために頂点シェーダ３８の命令をさらに修正することとの両方を行うことが、可能であり得る。
【０１１９】
[0127]また、グラフィックスドライバラッパー２６がゼロ視差平面の位置を調整するためにｇｌＶｉｅｗｐｏｒｔコマンドのみを修正するとき、ゼロ視差平面に対して物体がどこに現れるかの位置（たとえば、ゼロ視差平面の前、ゼロ視差平面において、またはゼロ視差平面の後）を調整するためにグラフィックスドライバラッパー２６が頂点シェーダ３８の命令をさらに修正するときよりも速く、ＧＰＵ  ３０は、立体視ビューをレンダリングすることが可能であり得る。これは、固定機能パイプライン３４のビューポート調整ユニットが左眼画像および右眼画像のビューポートを調整する場合と比較して、頂点シェーダ３８がシェーダプロセッサ３２上で実行するのに長くかかるからであり得る。しかしながら、グラフィックスドライバラッパー２６がさらに、ゼロ視差平面に対して物体がどこに現れるかの位置を調整するために頂点シェーダ３８の命令を修正するとき、レンダリングされる立体視ビューは、グラフィックスドライバラッパー２６がｇｌＶｉｅｗｐｏｒｔコマンドを修正するときと比較してより良好な閲覧者体験を提供することができる。これは、頂点シェーダ３８に対する命令のさらなる修正は、一部の物体がゼロ視差平面の前に、ゼロ視差平面において、またはゼロ視差平面の後に現れることを可能にする一方で、ｇｌＶｉｅｗｐｏｒｔコマンドに対する修正では、すべての物体が、ゼロ視差平面に現れる得、それはディスプレイ１２の前または後であり得る。
【０１２０】
[0128]ｇｌＶｉｅｗｐｏｒｔコマンドを修正すべきか、頂点シェーダ３８の命令をさらに修正すべきかは、設計選択の問題であり得る。たとえば、レンダリング時間が重要な因子である場合は、アプリケーションプロセッサ２２は、グラフィックスドライバラッパー２６を介して、ｇｌＶｉｅｗｐｏｒｔコマンドを修正することができる。より理想的な閲覧体験が重要な因子である場合は、アプリケーションプロセッサ２２は、グラフィックスドライバラッパー２６を介して、頂点シェーダ３８の命令をさらに修正することができる。
【０１２１】
[0129]したがって、グラフィックスドライバラッパー２６は、頂点シェーダ３８の修正された命令がオブシェーダプロセッサ３２を実行するときに、ＧＰＵ  ３０が視線角度に基づいてある向きに、また、視線角度に基づいて別の向きにプリミティブの頂点をずらすことができるように、頂点シェーダ３８の命令を修正することができる。いくつかの例では、グラフィックスドライバラッパー２６はさらに、頂点シェーダ３８のさらなる修正された命令がシェーダプロセッサ３２上で実行されるときに、ＧＰＵ  ３０が視線角度に基づいて、また、ゼロ視差平面に基づいてある向きにプリミティブの頂点をずらすことができるように、頂点シェーダ３８の命令を修正することができる。いくつかの例では、グラフィックスドライバラッパー２６は、固定機能パイプライン３４のビューポート変換ユニットがゼロ視差平面の位置を調整するために左眼画像と右眼画像との間の水平視差を増やし、または減らすように、アプリケーション４２によって発行されたｇｌＶｉｅｗｐｏｒｔコマンドの命令を修正することができる。
【０１２２】
[0130]以下は、モノビューを生成するアプリケーション４２からの立体視ビューをＧＰＵ  ３０にレンダリングさせるためにアプリケーションプロセッサ２２、ＧＰＵ  ３０、およびシステムメモリ３６が一緒に機能し得る例示的な方式を説明する。たとえば、アプリケーションプロセッサ２２は、１つまたは複数のセンサ４２およびカメラプロセッサ４４からの１つまたは複数の出力に基づいて、視線角度を決定することができる。一例として、アプリケーションプロセッサ２２は、左眼画像と右眼画像の両方のＧＰＵ  ３０によるレンダリングごとに１回（すなわち、立体視ビューの生成ごとに１回）のように、定期的に視線角度を決定することができる。グラフィックスドライバラッパー２６は、アプリケーション４２によって発行された命令を修正して頂点シェーダ３８の命令を修正するために、この決定された視線角度を利用することができる。
【０１２３】
[0131]たとえば、ＧＰＵ  ３０に画像をレンダリングさせるために、アプリケーションプロセッサ２２は、アプリケーション４２のｇｌＳｈａｄｅｒＳｏｕｒｃｅコマンドを実行することができる。ｇｌＳｈａｄｅｒＳｏｕｒｃｅコマンドは、グラフィックスドライバ２４に、システムメモリ３６から頂点シェーダ３８のソースコードを取り出すよう命令する。本開示の例では、アプリケーション４２によって発行されたｇｌＳｈａｄｅｒＳｏｕｒｃｅコマンドに応答して、グラフィックスドライバラッパー２６は、頂点シェーダ３８のソースコードを、グラフィックスドライバ２４に届く前に途中で捕えることができる。アプリケーションプロセッサ２２は、グラフィックスドライバラッパー２６を介して、頂点シェーダ３８のソースコードを、実行されると修正された頂点シェーダ３８に、アプリケーションプロセッサ２２によって決定された視線角度に基づいて立体視ビューのためのグラフィックスコンテンツを生成させる命令を含むように、修正することができる。たとえば、グラフィックスドライバラッパー２６は、修正された頂点シェーダ３８を２回実行させることができる。１回目の実行において、修正された頂点シェーダ３８は、視線角度に基づいて左眼画像のためのグラフィックスコンテンツを生成することができ、２回目の実行において、修正されたシェーダ３８は、視線角度に基づいて右眼画像のためのグラフィックスコンテンツを生成することができ、または逆も同様である。加えて、いくつかの例では、グラフィックスドライバラッパー２６はさらに、ゼロ視差平面の位置に基づいて頂点の位置を決定するために、頂点シェーダ３８の命令を修正することができる。
【０１２４】
[0132]グラフィックスドライバラッパー２６は、アプリケーションプロセッサ２２によって実行されると、ソースコードエディタとして機能し得る。一例として、グラフィックスドライバラッパー２６は、アプリケーション４２によって発行された命令を監視することができる。アプリケーション４２がｇｌＳｈａｄｅｒＳｏｕｒｃｅコマンドを発行したことをグラフィックスドライバラッパー２６が認識すると、グラフィックスドライバラッパー２６は、頂点シェーダ３８の命令（たとえば、頂点シェーダ３８のソースコード）を捕捉し修正することができる。たとえば、グラフィックスドライバラッパー２６は、視線角度に基づいて左眼画像および右眼画像（たとえば、立体視ビュー）のクリッピング座標を生成するように単一の画像（たとえば、モノビュー）のために生成されたクリッピング座標の値を修正する命令を、頂点シェーダ３８のソースコードに含めることができる。
【０１２５】
[0133]たとえば、上で示されたように、頂点シェーダ３８は、ｘclip座標の値を記憶するｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ変数と、ｙclip座標の値を記憶するｇｌ＿Ｐｏｓｉｔｉｏｎ．ｙ変数とを含み得る。以下でより詳細に論じられるように、グラフィックスドライバラッパー２６は、視線角度に基づいてｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ（たとえば、ｘclip座標）の値を更新する頂点シェーダ３８に第１の命令を含め、視線角度に基づいてｇｌ＿Ｐｏｓｉｔｉｏｎ．ｙ（たとえば、ｙclip座標）の値を更新する頂点シェーダ３８に第２の命令を含めることができる。
【０１２６】
[0134]左眼画像を生成するために、アプリケーションプロセッサ２２によって頂点シェーダ３８に追加された第１の命令は、グラフィックスドライバラッパー２６を介して、頂点シェーダ３８に第１の値をｘclip値へ加算させる。第１の値は、閲覧者の目と視線角度との間の距離に基づき得る。アプリケーションプロセッサ２２によって頂点シェーダ３８に追加された第２の命令は、グラフィックスドライバラッパー２６を介して、頂点シェーダ３８に第２の値をｙclip値へ加算させる。第２の値は、閲覧者の目と視線角度との間の距離と、ディスプレイ１２の高さおよび幅とに基づき得る。
【０１２７】
[0135]右眼画像を生成するために、グラフィックスドライバラッパー２６によって頂点シェーダ３８に追加された命令は、頂点シェーダ３８に、第１の値をｘclip値へ減算させる。右眼画像に対する第１の値は、左眼画像に対する第１の値と同じ値であり得る。グラフィックスドライバラッパー２６によって頂点シェーダ３８に追加された第２の命令は、頂点シェーダ３８に第２の値をｙclip値へ減算させる。右眼画像に対する第２の値は、左眼画像に対する第２の値と同じ値であり得る。
【０１２８】
[0136]たとえば、アプリケーションプロセッサ２２は、グラフィックスドライバラッパー２６を介して、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ変数に記憶された値（たとえば、ｘclip座標）をｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ変数の現在の値に（ｚnear＊ｗworld／（Ｒ−Ｌ）／２）＊Ｘを足したものに変更する命令を追加するように、頂点シェーダ３８のソースコードを修正することができ、ここでｚnear、Ｒ、およびＬはすべて、ＰＲＪ行列（式４）からの変数であり、ｗworldは、Ｖworld行列（式２）からの変数（たとえば、アプリケーション４２によって定義されるような頂点座標）である。アプリケーションプロセッサ２２は、グラフィックスドライバラッパー２６を介して、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｙ変数に記憶された値（たとえば、ｙclip座標）をｇｌ＿Ｐｏｓｉｔｉｏｎ．ｙ変数の現在の値に（ｚnear＊ｗworld／（Ｔ−Ｂ）／２）＊Ｙを足したものに変更する別の命令を追加するように、頂点シェーダ３８のソースコードを修正することができ、ここでｚnear、Ｔ、およびＢはすべて、ＰＲＪ行列（式４）からの変数であり、ｗworldは、Ｖworld行列（式２）からの変数（たとえば、アプリケーション４２によって定義されるような頂点座標）である。
【０１２９】
[0137]Ｘの値は＋Ｄ＊ｃｏｓ（α）または−Ｄ＊ｃｏｓ（α）であってよく、Ｄは、閲覧者の右眼と左眼との間の距離の半分の近似であり、ユーザにより定義可能であっても、またはあらかじめプログラムされた値であってもよく、アルファ、αは視線角度である。一例として、アプリケーションプロセッサ２２は、１つまたは複数のセンサ４２およびカメラプロセッサ４４の出力に基づいて、視線角度を決定することができる。Ｙの値は、Ｄ＊ｓｉｎ（α）または−Ｄ＊ｓｉｎ（α）であり得る。
【０１３０】
[0138]たとえば、左眼と右眼の間の距離は２＊Ｄであると仮定する。この例では、閲覧者の左眼の座標は（−Ｄx、−Ｄy、−Ｄz）であってよく、閲覧者の右眼の座標は（Ｄx、Ｄy、Ｄz）であってよい。Ｄz座標は、左眼と右眼の座標が閲覧者の顔の前および２つの目の中間から開始し得るので、０であると見なされ得る（すなわち、（０、０、０）の位置は、閲覧者の顔の前の、閲覧者の左眼と右眼の間にある点に位置する）。視線角度がアルファである場合、閲覧者の左眼の座標は（−Ｄx＊ｃｏｓ（α）、−Ｄy＊ｓｉｎ（α）、０）であってよく、閲覧者の右眼の座標は（Ｄx＊ｃｏｓ（α）、Ｄy＊ｓｉｎ（α）、０）であってよい。この例では、視線角度が０である場合、左眼および右眼の座標は、（−Ｄx、０、０）および（Ｄx、０、０）になる。しかしながら、視線角度が０ではないとき、視線角度は、（０、０、０）の位置に対する閲覧者の左眼および右眼の位置をビー定義することができる。左眼および右眼の座標は次の通りであると考えられ得る。
【数７】
2016509298.tif 000009
【数８】
2016509298.tif 000010
【０１３１】
[0139]アプリケーションプロセッサ２２は、グラフィックスドライバラッパー２６を介して、頂点シェーダ３８の命令のセットに、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝（ｚnear＊ｗworld／（Ｒ−Ｌ）／２）＊Ｘという命令を追加することができる。この命令は、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＝ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋（ｚnear＊ｗworld／（Ｒ−Ｌ）／２）＊Ｘと等価であり得る。たとえば、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝コマンドは、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝命令によって定義される値を、ｇｌ＿Ｐｏｓｉｔｉｏｎコマンドによって記憶された値に加算する（たとえば、ｘclipに値を加算する）。いくつかの状況では、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝命令はｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝Ｘへと簡略化され得る。ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋変数が（ｚnear＊ｗworld／（Ｒ−Ｌ）／２）＊Ｘまたは単なるＸと等しくなり得る理由が、以下でさらに詳細に説明される。
【０１３２】
[0140]アプリケーションプロセッサ２２はまた、グラフィックスドライバラッパー２６を介して、頂点シェーダ３８の命令のセットに、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｙ＋＝（ｚnear＊ｗworld／（Ｔ−Ｂ）／２）＊Ｙという命令を追加することができる。これは、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｙ＝ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｙ＋（ｚnear＊ｗworld／（Ｔ−Ｂ）／２）＊Ｙと等価であり得る。たとえば、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｙ＋＝コマンドは、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｙ＋＝命令によって定義される値を、ｇｌ＿Ｐｏｓｉｔｉｏｎコマンドによって記憶された値に加算する（たとえば、ｙclipに値を加算する）。いくつかの状況では、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｙ＋＝命令は、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｙ＋＝Ｙ＊ディスプレイ１２の幅がディスプレイ１２の高さにより除算されたものへと簡略化され得る。ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｙ＋変数が（ｚnear＊ｗworld／（Ｔ−Ｂ）／２）＊Ｙまたは単なるＹ＊ディスプレイ１２の幅がディスプレイ１２の高さにより除算されたものと等しくなり得る理由が、以下でさらに詳細に説明される。
【０１３３】
[0141]本開示の技法によると、左眼画像を生成するために、アプリケーションプロセッサ２２は、グラフィックスドライバラッパー２６を介して、変数Ｘの値をＤ＊ｃｏｓ（α）となるように定義することができる。これは、視線位置を左に動かすことが、観測される物体を右に動かすことと等価であるからである。Ｘが＋Ｄ＊ｃｏｓ（α）と等しいとき、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝コマンドは、アプリケーション４２によって生成された頂点の各々のｘclip座標への、定数（たとえば（ｚnear＊ｗworld／（Ｒ−Ｌ）／２）＊Ｄ＊ｃｏｓ（α）または単にＤ＊ｃｏｓ（α））の加算を引き起こし、これは、頂点を、Ｄ＊ｃｏｓ（α）の値だけ左に移動させる。また、左眼画像を生成するために、アプリケーションプロセッサ２２は、グラフィックスドライバ２６を介して、変数Ｙの値をＤ＊ｓｉｎ（α）となるように定義することができる。これは、視線位置を下に動かすことが、観測される物体を上に動かすことと等価であるからである。Ｙが＋Ｄ＊ｓｉｎ（α）と等しいとき、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｙ＋＝コマンドは、アプリケーション４２によって生成された頂点の各々のｙclip座標への、定数（たとえば（ｚnear＊ｗworld／（Ｔ−Ｂ）／２）＊Ｄ＊ｓｉｎ（α）または単にＤ＊ｓｉｎ（α）＊ディスプレイ１２の幅がディスプレイ１２の高さにより除算されたもの）の加算を引き起こし、これは、頂点を、Ｄ＊ｓｉｎ（α）＊幅／高さの値だけ左に移動させ、ここで幅はディスプレイ１２の幅であり、高さはディスプレイ１２の高さである。
【０１３４】
[0142]右眼画像を生成するために、アプリケーションプロセッサ２２は、グラフィックスドライバラッパー２６を介して、変数Ｘの値を−Ｄ＊ｃｏｓ（α）となるように定義することができる。これは、視線位置を右に動かすことが、観測される物体を左に動かすことと等価であるからである。Ｘが−Ｄ＊ｃｏｓ（α）と等しいとき、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝コマンドは、アプリケーション４２によって生成された頂点の各々のｘclip座標からの、定数（たとえば（ｚnear＊ｗworld／（Ｒ−Ｌ）／２）＊−Ｄ＊ｃｏｓ（α）または単に−Ｄ＊ｃｏｓ（α））の減算を引き起こし、これは、頂点を、−Ｄ＊ｃｏｓ（α）の値だけ右に移動させる。また、右眼画像を生成するために、アプリケーションプロセッサ２２は、グラフィックスドライバラッパー２６を介して、変数Ｙの値を−Ｄ＊ｓｉｎ（α）となるように定義することができる。これは、視線位置を上に動かすことが、観測される物体を下に動かすことと等価であるからである。Ｙが−Ｄ＊ｓｉｎ（α）と等しいとき、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｙ＋＝コマンドは、アプリケーション４２によって生成された頂点の各々のｙclip座標からの、定数（たとえば（ｚnear＊ｗworld／（Ｔ−Ｂ）／２）＊−Ｄ＊ｓｉｎ（α）×幅／高さまたは単に−Ｄ＊ｃｏｓ（α）×幅／高さ）の減算を引き起こし、これは、頂点を、−Ｄ＊ｓｉｎ（α）×幅／高さの値だけ右に移動させる。
【０１３５】
[0143]頂点シェーダ３８のソースコードを修正した後、アプリケーションプロセッサ２２は、頂点シェーダ３８の修正されたソースコードをシステムメモリに記憶することができる。いくつかの例では、アプリケーションプロセッサ２２は、頂点シェーダ３８の修正されたソースを、頂点シェーダ３８の修正されていないソースコードがシステムメモリ３６の中に記憶される位置と同じ位置に記憶することができる。別の例では、アプリケーションプロセッサ２２は、頂点シェーダ３８の修正されたソースを、頂点シェーダ３８の修正されていないソースコードが記憶される位置とは異なる、システムメモリ３６中の位置に記憶することができる。
【０１３６】
[0144]ｇｌＳｈａｄｅｒＳｏｕｒｃｅコマンドの発行に続いて、アプリケーション４２は、ｇｌＣｏｍｐｉｌｅＳｈａｄｅｒコマンドを発行する。ｇｌＣｏｍｐｉｌｅＳｈａｄｅｒコマンドは、アプリケーションプロセッサ２２上で実行されるコンパイラ２８に、頂点シェーダ３８の修正されたソースコードをコンパイルさせる。たとえば、ｇｌＣｏｍｐｉｌｅＳｈａｄｅｒコマンドは、コンパイラ２８に、修正された頂点シェーダ３８のためのソースコードをシステムメモリ３６から取り出させ、修正された頂点シェーダ３８をコンパイルさせることができる。コンパイルの後、コンパイラ２８は、得られたオブジェクトコードをシステムメモリ３６に記憶する。たとえば、示されるように、システムメモリ３６は修正された頂点シェーダ４０を含む。修正された頂点シェーダ４０は、頂点シェーダ３８の修正されたソースコードをコンパイラ２８がコンパイルした結果として得られるオブジェクトコードである。
【０１３７】
[0145]その上、上で述べられたように、グラフィックスドライバラッパー２６は、頂点シェーダ２８に、左眼画像を生成するためにｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ変数およびｇｌ＿Ｐｏｓｉｔｉｏｎ．ｙ変数へ定数を加算させて、右眼画像を生成するためにｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ変数およびｇｌ＿Ｐｏｓｉｔｉｏｎ．ｙ変数から定数を減算させる命令を、頂点シェーダ２８のソースコード中に含め得る。修正された頂点シェーダ４０のオブジェクトコードは、修正された頂点シェーダ４０に、左眼画像を生成するためにｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ変数およびｇｌ＿Ｐｏｓｉｔｉｏｎ．ｙ変数へ定数を加算させて、右眼画像を生成するためにｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ変数およびｇｌ＿Ｐｏｓｉｔｉｏｎ．ｙ変数から定数を減算させる命令を含む。より詳細に説明されるように、修正された頂点シェーダ４０は、アプリケーション４２からの描画コマンドに応答して、グラフィックスドライバラッパー２６を介して、アプリケーションプロセッサ２２から定数の値を受け取る。
【０１３８】
[0146]いくつかの例では、上で説明されたように、アプリケーションプロセッサ２２はさらに、グラフィックスドライバラッパー２６を介して、一部の物体がゼロ視差平面の前に、ゼロ視差平面において、またはゼロ視差平面の後に現れるように、左眼画像および右眼画像の中の頂点の位置をさらに調整するために、頂点シェーダ３８の命令を修正することができる。たとえば、上で説明されたように、グラフィックスドライバラッパー２６は、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝Ｘおよびｇｌ＿Ｐｏｓｉｔｉｏｎ．ｙ＋＝Ｙ＊幅／高さという命令を含めるように頂点シェーダ３８の命令を修正することができ、左眼画像に対してはＸが＋Ｄ＊ｃｏｓ（α）に等しくＹが＋Ｄ＊ｓｉｎ（α）に等しく、右眼画像に対してはＸが−Ｄ＊ｃｏｓ（α）に等しくＹが−Ｄ＊ｓｉｎ（α）に等しい。
【０１３９】
[0147]頂点レベルにおける調整をさらに可能にするために、グラフィックスドライバラッパー２６は、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝Ｘ＊（１−（ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｗ／ＺＤＰloc））およびｇｌ＿Ｐｏｓｉｔｉｏｎ．ｙ＋＝Ｙ＊幅／高さ＊（１−（ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｗ／ＺＤＰloc））という命令を含むように、頂点シェーダ３８の命令を修正することができる。ＺＤＰlocは、ディスプレイ１２に対するゼロ視差平面の位置を定義する、ユーザにより定義される値または事前設定された値であり得る。いくつかの他の例では、プロセッサ２２は、カメラプロセッサ４４によって決定されるような閲覧者の位置の推定に基づいて、ゼロ視差平面の位置の推定を決定することができる。ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｗ変数はｗclip座標を記憶する。
【０１４０】
[0148]たとえば、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ変数およびｇｌ＿Ｐｏｓｉｔｉｏｎ．ｙ変数と同様に、頂点シェーダ３８は、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｗ変数にｗclip座標を記憶することができる。本開示で説明される例では、ｗclip座標は、アプリケーション４２によって定義されるようなプリミティブのｚ座標を符号反転したものに等しくなり得る。上で説明されたように、アプリケーション４２は（ｘ、ｙ、ｚ、ｗ）としてプリミティブを定義することができる。これらの座標は、ワールド空間で定義されるものとして見なされ得る（すなわち、頂点のｖworld座標は（ｘworld、ｙworld、ｚworld、ｗworld）である）。
【０１４１】
[0149]本開示で説明される技法では、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｗは−ｚworldに等しくなり得る。ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｗが−ｚworldに等しい理由は、上の式３および式４で定義されるＰＲＪ行列によるものである。ＰＲＪ行列で示されるように、第３列、第４行の値は−１である。上の式１で定義されるように、ＶｃｌｉｐはＰＲＪ＊ＭＶＴ＊Ｖｗｏｒｌｄに等しい。したがって、ＰＲＪ行列がＶｗｏｒｌｄ行列およびＭＶＴ行列によって乗算されるとき、Ｖｗｏｒｌｄのｚworld座標は、ＰＲＪ行列の第３列、第４行の−１によって乗算される。ｗclip座標はｚworldを−１により乗算した結果に等しく（すなわち、ｗclipは−ｚworldに等しい）、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｗ変数はｗclipの値を記憶する（すなわち、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｗは−ｚworldに等しい）。
【０１４２】
[0150]ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝Ｘ＊（１−（ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｗ／ＺＤＰloc））およびｇｌ＿Ｐｏｓｉｔｉｏｎ．ｙ＋＝Ｙ＊幅／高さ＊（１−（ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｗ／ＺＤＰloc））というコマンドを、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝Ｘ＊（１＋（ｚworld／ＺＤＰloc））およびｇｌ＿Ｐｏｓｉｔｉｏｎ．ｙ＋＝Ｙ＊幅／高さ＊（１＋（ｚworld／ＺＤＰloc））で置き換えることが可能であり得る。しかしながら、グラフィックスドライバラッパー２６は、アプリケーション４２によって出力されるｚworld値のすべての入手権を有さないことがある。本開示で説明される技法では、頂点シェーダ３８が一例としてＯｐｅｎＧＬ  ２．０  ＥＳ  ＡＰＩに従って設計される場合、頂点シェーダ３８は、ｗclipに等しいｇｌ＿Ｐｏｓｉｔｉｏｎ．ｗ変数を含むように設計されてよく、ｗclipはこの例では−ｚworldにも等しい。したがって、グラフィックスドライバラッパー２６はｚworld座標の入手権を有さないことがあるが、グラフィックスドライバラッパー２６は、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｗ変数を利用してｚworldの値を決定することができる。
【０１４３】
[0151]ｚworld座標は、アプリケーション４２によって出力された単一の画像内での頂点の相対的な深度の尺度を提供し得る。たとえば、アプリケーション４２によって出力された単一の画像は、ディスプレイ１２の２Ｄエリアに制限され得る。しかし、単一の画像内の物体は、頂点のｚworld座標に基づいて、他の物体の前または後に現れ得る。グラフィックスドライバラッパー２６が、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝Ｘ＊（１−（ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｗ／ＺＤＰloc））およびｇｌ＿Ｐｏｓｉｔｉｏｎ．ｙ＋＝Ｙ＊幅／高さ＊（１−（ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｗ／ＺＤＰloc））というコマンドを含むように頂点シェーダ３８の命令を修正する例では、グラフィックスドライバラッパー２６は、左眼画像に対してある方向に、また右眼画像に対して他の方向に、頂点をどれだけずらすべきかを決定するために、頂点の相対的な深度を考慮することができる。
【０１４４】
[0152]たとえば、単一の画像中の頂点の−ｚworld（すなわち、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｗ変数によって定義されるような）がＺＤＰlocに等しいとき、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝０でありｇｌ＿Ｐｏｓｉｔｉｏｎ．ｙ＋＝０である。この場合、修正された頂点シェーダ３８は、左眼画像に対するｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘおよびｇｌ＿Ｐｏｓｉｔｉｏｎ．ｙがそれぞれ右眼画像に対するｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘおよびｇｌ＿Ｐｏｓｉｔｉｏｎ．ｙに等しいので、左眼画像と右眼画像のいずれかにおいて頂点をずらさなくてよい。しかしながら、単一の画像中の頂点の−ｚworldがＺＤＰlocに等しくないとき、修正された頂点シェーダ３８は、視線角度に基づいて左眼画像について頂点をある方向にずらし、視線角度に基づいて右眼画像について頂点を別の方向にずらすことができる。その上、アプリケーション４２によって生成される単一の画像中の頂点の−ｚworld座標が異なり得るので、修正された頂点シェーダ３８は、左眼画像と右眼画像とを作成するために、単一の画像中の異なる頂点を異なる量だけずらすことができる。
【０１４５】
[0153]言い換えると、ＸおよびＹ＊幅／高さ変数を（１−（ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｗ／ＺＤＰloc））によりさらに乗算することは、左眼画像および右眼画像において頂点がどれだけずらされるべきかの頂点レベルの決定をもたらす。また、単一の画像中の頂点は、ｚworldの値に基づいて異なる量だけずらされ得るので、得られる立体視ビューにおいては、一部の物体はゼロ視差平面の前に現れることがあり、一部の物体はゼロ視差平面に現れることがあり、一部の物体はゼロ視差平面の後に現れることがある。
【０１４６】
[0154]いくつかの例では、ＸおよびＹ＊幅／高さ変数を（１−（ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｗ／ＺＤＰloc））で乗算するように頂点シェーダ３８の命令をさらに修正する代わりに、またはそれに加えて、グラフィックスドライバラッパー２６は、ゼロ視差平面の位置を調整するためにｇｌＶｉｅｗｐｏｒｔを修正することができる。たとえば、アプリケーション４２はまた、プロセッサ２２によって実行されると、単一の画像のビューポートを定義するコマンド（たとえば、ディスプレイ１２上での単一の画像のサイズと場所とを定義するコマンド）を発行することができる。このコマンドは、ｇｌＶｉｅｗｐｏｒｔコマンドであり得る。ｇｌＶｉｅｗｐｏｒｔコマンドは、画像の開始座標（たとえば、ｘおよびｙ座標）と、画像の幅および長さとを定義する。ｇｌＶｉｅｗｐｏｒｔコマンドの開始座標ならびに幅および長さの値は、画像のサイズと位置とを定義する。
【０１４７】
[0155]いくつかの例では、グラフィックスドライバラッパー２６は、アプリケーション４２によって発行されたｇｌＶｉｅｗｐｏｒｔコマンドを捕捉することができる。これらの例では、グラフィックスドライバラッパー２６は、アプリケーション４２によって発行されたｇｌＶｉｅｗｐｏｒｔコマンドを、グラフィックスドライバ２４がＧＰＵ  ３０へ送るのを阻止することができる。代わりに、グラフィックスドライバラッパー２６は、アプリケーション４２によって発行されたｇｌＶｉｅｗｐｏｒｔコマンドの開始座標と幅および長さの値とを、システムメモリ３６に記憶することができる。
【０１４８】
[0156]代替例では、グラフィックスドライバラッパー２６は、アプリケーション４２によって発行されたｇｌＶｉｅｗｐｏｒｔコマンドを、グラフィックスドライバ２４がＧＰＵ  ３０へ送るのを可能にすることができる。この例では、上記と同様に、グラフィックスドライバラッパー２６は、アプリケーション４２によって発行されたｇｌＶｉｅｗｐｏｒｔコマンドの開始座標と幅および長さの値とを記憶することができる。この代替例では、アプリケーション４２によって発行されたｇｌＶｉｅｗｐｏｒｔコマンドをＧＰＵ  ３０が適用する前に、グラフィックスドライバラッパー２６は、アプリケーション４２によって発行されたｇｌＶｉｅｗｐｏｒｔコマンドを修正し、修正されたｇｌＶｉｅｗｐｏｒｔコマンドをＧＰＵ  ３０へ送ることができる。このようにして、ＧＰＵ  ３０は、アプリケーション４２によって発行されたｇｌＶｉｅｗｐｏｒｔコマンドを受け取ったが、ＧＰＵ  ３０は、グラフィックスドライバラッパー２６によって修正された、修正されたｇｌＶｉｅｗｐｏｒｔコマンドを実行することができる。
【０１４９】
[0157]いずれの例においても、グラフィックスドライバラッパー２６は次いで、１つまたは複数のプリミティブを描画するようＧＰＵ  ３０に命令するコマンドを、アプリケーション４２がＧＰＵ  ３０に発行するまで待つことができる。この描画コマンドは、ｇｌＤｒａｗコマンドであり得る。ｇｌＤｒａｗＡｒｒａｙｓおよびｇｌＤｒａｗＥｌｅｍｅｎｔｓのような、ｇｌＤｒａｗコマンドの様々な例がある。描画コマンドのこれらの様々な例の各々は一般に、ｇｌＤｒａｗコマンドと呼ばれる。
【０１５０】
[0158]アプリケーション４２がｇｌＤｒａｗコマンドを発行すると、グラフィックスドライバラッパー２６は、ｇｌＤｒａｗコマンドを捕捉し、グラフィックスドライバ２４がｇｌＤｒａｗコマンドをＧＰＵ  ３０へ送信するのを阻止する。グラフィックスドライバラッパー２６は次いで、左眼画像および右眼画像のためのグラフィックスコンテンツをＧＰＵ  ３０に生成させる命令を生成する。一例として、グラフィックドライバラッパー３６は、修正された頂点シェーダ４０のオブジェクトコードをＧＰＵ  ３０に２回実行させる命令を生成し、左眼画像および右眼画像のためのビューポートを定義するために２つのｇｌＶｉｅｗｐｏｒｔコマンドを発行し、２つのｇｌＤｒａｗコマンドを発行する。
【０１５１】
[0159]グラフィックスドライバラッパー２６が、ＸおよびＹ＊幅／高さ変数を（１−（ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｗ／ＺＤＰloc））で乗算するように頂点シェーダ３８の命令を修正する例では、グラフィックスドライバラッパー２６は、ｇｌＶｉｅｗｐｏｒｔコマンドを修正しなくてよいが、それでも、左眼画像と右眼画像の各々に１つずつ、ｇｌＶｉｅｗｐｏｒｔコマンドを発行することができる。グラフィックスドライバラッパー２６が、ＸおよびＹ＊幅／高さ変数を（１−（ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｗ／ＺＤＰloc））で乗算するように頂点シェーダ３８の命令を修正しない例では、グラフィックスドライバラッパー２６は、ｇｌＶｉｅｗｐｏｒｔコマンドを修正し、２つのｇｌＶｉｅｗｐｏｒｔコマンドを発行することができ、２つのｇｌＶｉｅｗｐｏｒｔコマンドはアプリケーション４２によって発行された異なるｇｌＶｉｅｗｐｏｒｔコマンドである。
【０１５２】
[0160]頂点間の視差の頂点レベルの調整と、左眼画像と右眼画像との間の視差の画像レベルの調整とのいずれかのための技法の概要として、アプリケーション４２によって発行されたｇｌＤｒａｗコマンドをグラフィックスドライバ２４が送信するのを、グラフィックスドライバラッパー２６が阻止した後、グラフィックスドライバラッパー２６は、シェーダプロセッサ３２を使って、修正された頂点シェーダ４０に立体視ビューの第１の画像（たとえば、左眼画像）のクリッピング座標を生成する準備をさせるコマンドをＧＰＵ  ３０へ発行する。次いで、グラフィックスドライバラッパー２６は、ディスプレイ上での第１の画像のサイズと位置とを定義する第１のｇｌＶｉｅｗｐｏｒｔコマンドを、固定機能パイプライン３４のビューポート変換ユニットに発行することができる。グラフィックスドライバラッパー２６は次いで、第１のｇｌＶｉｅｗｐｏｒｔコマンドによって定義されるようなディスプレイの第１の部分に制限された第１の画像をＧＰＵ  ３０にレンダリングさせる第１のｇｌＤｒａｗコマンドを、ＧＰＵ  ３０へ発行することができる。
【０１５３】
[0161]グラフィックスドライバラッパー２６は次いで、シェーダプロセッサ２２を使って修正された頂点シェーダ４０に立体視ビューの第２の画像（たとえば、右眼画像）のクリッピング座標を生成する準備をさせるコマンドを、ＧＰＵ  ３０へ発行する。次いで、グラフィックスドライバラッパー２６は、ディスプレイ上での第２の画像のサイズと位置とを定義するビューポートに対する第２のｇｌＶｉｅｗｐｏｒｔコマンドを、固定機能パイプライン３４のビューポート変換ユニットに発行することができる。グラフィックスドライバラッパー２６は次いで、第２のｇｌＶｉｅｗｐｏｒｔコマンドによって定義されるようなディスプレイの第２の部分に制限された第２の画像をＧＰＵ  ３０にレンダリングさせる第２のｇｌＤｒａｗコマンドを、ＧＰＵ  ３０へ発行することができる。
【０１５４】
[0162]上では概要として説明された本開示の技法が、以下の例において、より詳細に説明される。理解しやすくするためにのみ、以下の例では、本技法は、左眼画像のためのグラフィックスコンテンツを最初に、続いて右眼画像のためのグラフィックスコンテンツを生成するＧＰＵ  ３０を用いて説明されるが、その反対も可能である。
【０１５５】
[0163]たとえば、グラフィックスドライバラッパー２６がｇｌＶｉｅｗｐｏｒｔコマンドを途中で捕え、次いで、アプリケーション４２によって発行されたｇｌＤｒａｗコマンドを阻止した後、グラフィックスドライバラッパー２６は、左眼画像のためのクリッピング座標を生成するようＧＰＵ  ３０に命令する命令を生成する。やはり、いくつかの例では、グラフィックスドライバラッパー２６は、アプリケーション４２によって発行されたｇｌＶｉｅｗｐｏｒｔコマンドの、ＧＰＵ  ３０への送信を阻止し得ることに留意されたい。他の例では、グラフィックスドライバラッパー２６は、アプリケーション４２によって発行されたｇｌＶｉｅｗｐｏｒｔコマンドが、ＧＰＵ  ３０に送信されることを可能にし得る。
【０１５６】
[0164]一例として、アプリケーションプロセッサ２２は、グラフィックスドライバラッパー２６を介して、ＧＰＵ  ３０に、修正された頂点シェーダ４０のオブジェクトコードを実行させる命令を生成する。それに応答して、ＧＰＵ  ３０のシェーダプロセッサ３２は、修正された頂点シェーダ４０のオブジェクトコードを実行する。加えて、アプリケーションプロセッサ２２は、グラフィックスドライバラッパー２６を介して、左眼画像のクリッピング座標を生成するために修正された頂点シェーダ３０がｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ変数に加算すべき定数値を送る。修正された頂点シェーダ４０のオブジェクトコードを実行したことによる、シェーダプロセッサ４２の出力は、左眼画像の頂点のクリッピング座標である。
【０１５７】
[0165]たとえば、上で論じられたように、グラフィックスドライバラッパー２６は、後で説明される理由により、頂点シェーダ３８のソースコードに、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝（ｚnear＊ｗworld／（Ｒ−Ｌ）／２）＊Ｘ、または単にｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝Ｘおよびｇｌ＿Ｐｏｓｉｔｉｏｎ．ｙ＋＝（ｚnear＊ｗworld／（Ｔ−Ｂ）／２）＊Ｙ、または単にｇｌ＿Ｐｏｓｉｔｉｏｎ．ｙ＋＝Ｙ＊幅／高さという命令を含めることができる。上で説明されたように、頂点間の視差の頂点レベルの調整のために、グラフィックスドライバラッパー２６はさらに、頂点シェーダ３８のソースコード中のｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘコマンドとｇｌ＿Ｐｏｓｉｔｉｏｎ．ｙコマンドとを修正することができる。たとえば、これらの例では、グラフィックスドライバラッパー２６は、後で説明される理由により、頂点シェーダ３８のソースコードに、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝（ｚnear＊ｗworld／（Ｒ−Ｌ）／２）＊Ｘ＊（１−（ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｗ／ＺＤＰloc））、または単にｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝Ｘ＊（１−（ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｗ／ＺＤＰloc））およびｇｌ＿Ｐｏｓｉｔｉｏｎ．ｙ＋＝（ｚnear＊ｗworld／（Ｔ−Ｂ）／２）＊Ｙ＊（１−（ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｗ／ＺＤＰloc））、または単にｇｌ＿Ｐｏｓｉｔｉｏｎ．ｙ＋＝Ｙ＊幅／高さ＊（１−（ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｗ／ＺＤＰloc））という命令を含めることができる。
【０１５８】
[0166]ｚnear、ｗworld、Ｒ、Ｌ、Ｔ、およびＢという変数は、式（２）および（４）を参照して上で説明されたように、シェーダプロセッサ３２に知られている可能性があり得る。しかしながら、本開示の態様は、ｚnear、ｗworld、Ｒ、Ｌ、Ｔ、およびＢという変数の値をシェーダプロセッサ３２が知っていることを必要としない。たとえば、ｚnear、ｗworld、Ｒ、Ｌ、Ｔ、およびＢという変数は、各々が定数であり得るので、（ｚnear＊ｗworld／（Ｒ−Ｌ）／２）および（ｚnear＊ｗworld／（Ｔ−Ｂ）／２）の結果は定数値になるであろう。この場合、（ｚnear＊ｗworld／（Ｒ−Ｌ）／２）および（ｚnear＊ｗworld／（Ｔ−Ｂ）／２）の値は適宜、推定され、またはユーザによって提供され、ＸまたはＹの値へと乗算され得る。より詳細に説明されるように、いくつかの例では、（ｚnear＊ｗworld／（Ｒ−Ｌ）／２）は１に簡略化されてよく、（ｚnear＊ｗworld／（Ｔ−Ｂ）／２）はディスプレイ１２の幅／高さに簡略化されてよい。
【０１５９】
[0167]いくつかの例では、シェーダプロセッサ３２はＸおよびＹの値を知らないことがある。左眼画像に対して、グラフィックスドライバラッパー２６は、修正された頂点シェーダ４０のオブジェクトコードを実行するようシェーダプロセッサ３２に命令する命令に加え、ＸおよびＹの値をシェーダプロセッサ３２に送ることができる。いくつかの例では、左眼画像に対してＸの値は＋Ｄ＊ｃｏｓ（α）であってよく、左眼画像に対してＹの値は＋Ｄ＊ｓｉｎ（α）であってよく、ここでＤは、閲覧者の目の間の距離のほぼ半分に等しく、ユーザにより定義され、または事前にプログラムされてよく、アルファ、αは、プロセッサ２２によって決定されるような視線角度に等しい。変数Ｘの値は＋Ｄ＊ｃｏｓ（α）であるので、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝コマンドは、シェーダプロセッサ３２に、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ変数に記憶された値へＤ＊ｃｏｓ（α）の値を加算させる（たとえば、ｘclipの値にＤ＊ｃｏｓ（α）を加算させる）。また、Ｙの値は＋Ｄ＊ｓｉｎ（α）であるので、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｙ＋＝コマンドは、シェーダプロセッサ３２に、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｙ変数に記憶された値へＤ＊ｓｉｎ（α）＊幅／高さの値を加算させる（たとえば、Ｄ＊ｓｉｎ（α）＊幅／高さを加算させる）。
【０１６０】
[0168]やはり、頂点の頂点レベルの調整のために、追加されるｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝コマンドは、シェーダプロセッサ３２に、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ変数に記憶された値へＤ＊ｃｏｓ（α）＊（１−（ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｗ）／（ＺＤＰloc））の値を加算させ、加算されたｇｌ＿Ｐｏｓｉｔｉｏｎ．ｙ＋＝コマンドは、シェーダプログラムプロセッサ３２に、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｙ変数に記憶された値へＤ＊ｓｉｎ（α）＊（１−（ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｗ）／（ＺＤＰloc））の値を加算させる。しかしながら、頂点のそのような頂点レベルの調整は、すべての例において必須ではない。
【０１６１】
[0169]グラフィックスドライバラッパー２６は、左眼画像のためのビューポートも定義する。たとえば、アプリケーション４２がｇｌＤｒａｗコマンドを発行した前に、アプリケーション４２は、グラフィックスドライバラッパー２６が途中で捕えたｇｌＶｉｅｗｐｏｒｔコマンドを発行している。グラフィックスドライバラッパー２６はまた、開始座標と、幅および長さの値とを、システムメモリ３６に記憶している。グラフィックスドライバラッパー２６が、頂点間の視差の頂点レベルの調整のために頂点シェーダ３８の命令を修正した例では、グラフィックスドライバラッパー２６は、ｇｌＶｉｅｗｐｏｒｔコマンドの命令を修正しなくてよく、代わりに、アプリケーション４２によって発行されるｇｌＶｉｅｗｐｏｒｔコマンドと同じである２つのｇｌＶｉｅｗｐｏｒｔコマンドできる。グラフィックスドライバラッパー２６が、頂点間の視差の頂点レベルの調整のために頂点シェーダ３８の命令を修正しない例では、グラフィックスドライバ２６は、ゼロ視差平面の位置を決定するために、以下で説明されるようにｇｌＶｉｅｗｐｏｒｔコマンドの命令を修正することができる。
【０１６２】
[0170]ゼロ視差平面の画像レベルの調整のために左眼画像のためのビューポートを定義するために、グラフィックスドライバラッパー２６は、アプリケーション４２によって発行された、途中で捕えられたｇｌＶｉｅｗｐｏｒｔコマンドを修正することができる。たとえば、ｇｌＶｉｅｗｐｏｒｔコマンドは、４つの変数を含み、最初の２つの変数は、ディスプレイ上の画像の開始座標を定義し、最後の２つの変数は、画像の幅と長さとを定義する。幅および長さ変数は、必ずしも座標値ではない。むしろ、幅および長さ変数は、画像が開始座標から伸長する量を定義する。たとえば、アプリケーション４２は、ｇｌＶｉｅｗｐｏｒｔ（０、０、幅、長さ）と記述するｇｌＶｉｅｗｐｏｒｔコマンドを発行することができる。この例では、（０、０）は、ディスプレイの左下を指す。変数「幅」はディスプレイの幅を指し、変数「長さ」はディスプレイの長さを指す。したがって、この例では、アプリケーション４２は、画像のビューポートを、ディスプレイの全体を包含するように定義するが、これはモノビュー画像と矛盾しない。しかしながら、アプリケーション４２は、示されたもの以外の異なる変数をｇｌＶｉｅｗｐｏｒｔコマンドに割り当てることができる。
【０１６３】
[0171]本開示によれば、グラフィックスドライバラッパー２６は、ｇｌＶｉｅｗｐｏｒｔコマンド（たとえば、前述の例のｇｌＶｉｅｗｐｏｒｔ（０、０、幅、長さ））を途中で捕え、このビューポートコマンドのための変数を修正することができる。たとえば、グラフィックスドライバラッパー２６は、ｇｌＶｉｅｗｐｏｒｔコマンドの変数を、左眼画像をディスプレイの所望の部分に制限するように修正することができる。説明しやすくするために、本技法は、左眼画像をディスプレイの左半分に、右眼画像をディスプレイの右半分に制限することを説明するが、態様はそのように限定されない。
【０１６４】
[0172]左眼画像に対して、グラフィックスドライバラッパー２６は、アプリケーション４２によって発行されたｇｌＶｉｅｗｐｏｒｔコマンドを、ｇｌＶｉｅｗｐｏｒｔ（０、０、幅／２、長さ）に修正することができる。この例では、幅／２は、ディスプレイの幅の半分である。たとえば、修正されたｇｌＶｉｅｗｐｏｒｔコマンドは、左眼画像がディスプレイの左端から始まり（たとえば、ｘ軸上の原点から始まり）、「幅／２」の距離だけ右に伸びることを示し、このことは、左眼画像をディスプレイの左半分に制限する。また、修正されたｇｌＶｉｅｗｐｏｒｔコマンドは、左眼画像がディスプレイの下から始まり（たとえば、ｙ軸上の原点から始まり）、「長さ」の距離だけ上に伸びることを示し、このことは、画像をディスプレイの上および下に制限する。
【０１６５】
[0173]いずれの例（たとえば、ｇｌＶｉｅｗｐｏｒｔコマンドが修正される例またはｇｌＶｉｅｗｐｏｒｔコマンドが修正されない例）でも、グラフィックスドライバラッパー２６は次いで、第１のｇｌＤｒａｗコマンドをＧＰＵ  ３０に出すことができる。ｇｌＤｒａｗコマンドに応答して、ＧＰＵ  ３０は、固定機能パイプライン３４とフラグメントシェーダとを通じて、修正された頂点シェーダ４０のオブジェクトコードの実行によって生成された左眼画像のクリッピング座標を処理することができる。ｇｌＶｉｅｗｐｏｒｔコマンドの修正を伴う例では、第１のｇｌＶｉｅｗｐｏｒｔコマンドは、左眼画像をディスプレイの左半分に制限することができる。ｇｌＶｉｅｗｐｏｒｔコマンドの修正を伴わない例では、第１のｇｌＶｉｅｗｐｏｒｔコマンドは、左眼画像をディスプレイの左半分に制限しなくてよい。ｇｌＤｒａｗコマンドは次いで、ＧＰＵ  ３０に、左眼画像を一時的な記憶のためにフレームバッファへとレンダリングさせることができる。たとえば、フレームバッファは、右眼画像が生成されるまで、左眼画像を記憶することができる。次いで、ＧＰＵ  ３０は、フレームバッファの全体をディスプレイプロセッサ（図示されず）に出力することができる。ディスプレイプロセッサは、ディスプレイに、立体視ビューを生成するために左眼画像と右眼画像とを表示させることができる。
【０１６６】
[0174]グラフィックスドライバラッパー２６は、右眼画像を生成するためではあっても、左眼画像を生成するための同じステップを繰り返すことができる。たとえば、グラフィックスドライバラッパー２６は、シェーダプロセッサ３２に、修正された頂点シェーダ４０のオブジェクトコードを実行させるための別の命令を発行する。加えて、グラフィックスドライバラッパー２６は、右眼画像のクリッピング座標を生成するために修正された頂点シェーダ４０がｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ変数から減算すべき、また、左眼画像のクリッピング座標を生成するために修正された頂点シェーダ４０がｇｌ＿Ｐｏｓｉｔｉｏｎ．ｙ変数から減算すべき、定数値を送る。修正された頂点シェーダ４０のオブジェクトコードを実行したことによる、シェーダプロセッサ３２の出力は、右眼画像の頂点のクリッピング座標である。
【０１６７】
[0175]上で説明されたように、グラフィックスドライバラッパー２６は、命令ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝（ｚnear＊ｗworld／（Ｒ−Ｌ）／２）＊Ｘ、または単にｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝Ｘを頂点シェーダ３８のソースコードに追加し、命令ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｙ＋＝（ｚnear＊ｗworld／（Ｔ−Ｂ）／２）＊Ｙ、または単にｇｌ＿Ｐｏｓｉｔｉｏｎ．ｙ＋＝Ｙ＊幅／高さを追加することができる。左眼画像に対して、変数Ｘの値は＋Ｄ＊ｃｏｓ（α）であり得、変数Ｙの値は＋Ｄ＊ｓｉｎ（α）であり得る。本開示の例では、右眼画像に対して、変数Ｘの値は−Ｄ＊ｃｏｓ（α）であり得、変数Ｙの値は−Ｄ＊ｓｉｎ（α）であり得る。変数Ｘの値は−Ｄ＊ｃｏｓ（α）であるので、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝コマンドは、シェーダプロセッサ３２に、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ変数に記憶された値からＤ＊ｃｏｓ（α）の値を減算させる。また、変数Ｙの値は−Ｄ＊ｓｉｎ（α）であるので、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｙ＋＝コマンドは、シェーダプロセッサ３２に、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｙ変数に記憶された値からＤ＊ｓｉｎ（α）＊幅／高さの値を減算させる。
【０１６８】
[0176]いくつかの例（たとえば、左眼画像と右眼画像との間の視差の画像レベルの調整のための）では、グラフィックスドライバラッパー２６はまた、右眼画像のためのビューポートを定義する。上で論じられたように、左眼画像に対して、グラフィックスドライバラッパー２６は、左眼画像をディスプレイの左半分に制限するために、ビューポートを、ｇｌＶｉｅｗｐｏｒｔ（０、０、幅／２、長さ）となるように定義する。右眼画像に対して、グラフィックスドライバラッパー２６は、ビューポートを、ｇｌＶｉｅｗｐｏｒｔ（幅／２、０、幅／２、長さ）となるように定義することができる。この例では、（幅／２、０）座標は、右眼画像がディスプレイの中央から始まり、右に伸びることを示す。また、ｇｌＶｉｅｗｐｏｒｔコマンド中の（幅／２、長さ）変数は、右眼画像がディスプレイの幅の半分およびディスプレイの全長だけ伸びることを示す。
【０１６９】
[0177]したがって、この例では、修正されたｇｌＶｉｅｗｐｏｒｔコマンド（たとえば、ｇｌＶｉｅｗｐｏｒｔ（幅／２、０、幅／２、長さ））は、右眼画像をディスプレイの右半分に制限する。たとえば、修正されたｇｌＶｉｅｗｐｏｒｔコマンドは、右眼画像がディスプレイの中央から始まり（たとえば、ｘ軸上の幅／２の点から始まり）、「幅／２」の距離だけ右に伸びることを示し、このことは、右眼画像をディスプレイの右半分に制限する。また、修正されたｇｌＶｉｅｗｐｏｒｔコマンドは、右眼画像が、ディスプレイの下から始まり（たとえば、ｙ軸上の原点から始まり）、「長さ」の距離だけ上に伸びることを示し、このことは、画像をディスプレイの上および下に制限する。
【０１７０】
[0178]グラフィックスドライバラッパー２６は次いで、第２のｇｌＤｒａｗコマンドをＧＰＵ  ３０に発行することができる。ｇｌＤｒａｗコマンドに応答して、ＧＰＵ  ３０は、固定機能パイプライン３４とフラグメントシェーダとを通じた、修正された頂点シェーダ４０のオブジェクトコードの実行によって生成された右眼画像のクリッピング座標を処理することができる。ｇｌＤｒａｗコマンドは次いで、ＧＰＵ  ３０に、右眼画像を一時的な記憶のためにフレームバッファへとレンダリングさせることができる。この場合、ＧＰＵ  ３０は、左眼画像をフレームバッファにすでに記憶していてよく、ＧＰＵ  ３０は、立体視ビューを生成するために、記憶された左眼画像と右眼画像とをフレームバッファから取り出し表示するように、ディスプレイプロセッサに命令することができる。
【０１７１】
[0179]上で説明されたように、グラフィックスドライバラッパー２６は、命令ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝コマンドとｇｌ＿Ｐｏｓｉｔｉｏｎ．ｙ＋＝コマンドとを、頂点シェーダ３８のソースコードに追加することができる。立体視ビューの飛び出しまたは押し込みの効果を引き起こすために、視線角度に基づいて、左眼画像と右眼画像との間にわずかなずれを引き起こす頂点シェーダ３８のソースコードに追加されるものは、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝コマンドおよびｇｌ＿Ｐｏｓｉｔｉｏｎ．ｙ＋＝コマンドである。
【０１７２】
[0180]ｇｌＶｉｅｗｐｏｒｔコマンドに対する修正の上の例では、ｇｌＶｉｅｗｐｏｒｔコマンドに対する修正は、左眼画像をディスプレイ１２の左半分に制限し、右眼画像をディスプレイ１２の右半分に制限した。しかしながら、左眼画像をディスプレイ１２の左半分に制限し、右眼画像をディスプレイ１２の右半分に制限することは、視線角度αを考慮しないことがある。また、左眼画像をディスプレイ１２の左半分に制限し、右眼画像をディスプレイ１２の右半分に制限することは、ＺＤＰの所望の位置を閲覧者が設定することを可能にしないことがある。
【０１７３】
[0181]以下は、グラフィックスドライバラッパー２６が、視線角度を考慮し、所望の位置へのゼロ視差平面の設定を可能にするために、ｇｌＶｉｅｗｐｏｒｔコマンドを修正し得る方式を説明する。たとえば、上のように、アプリケーション４２によって定義されるビューポートはｇｌＶｉｅｗｐｏｒｔ（０、０、幅、高さ）であると仮定し、ここでディスプレイ１２の左下の位置は（０、０）であり、ディスプレイ１２の右上の位置は（幅、高さ）である。
【０１７４】
[0182]この場合、左眼画像に対して、グラフィックスドライバラッパー２６は、ｇｌＶｉｅｗｐｏｒｔ（−ＶＰｓｈｉｆｔ＊ｃｏｓ（α）、−ＶＰｓｈｉｆｔ＊ｓｉｎ（α）、幅−ＶＰｓｈｉｆｔ＊ｃｏｓ（α）、高さ−Ｖｐｓｈｉｆｔ＊ｓｉｎ（α））となるように、ｇｌＶｉｅｗｐｏｒｔコマンドを修正することができ、（−ＶＰｓｈｉｆｔ＊ｃｏｓ（α）、−ＶＰｓｈｉｆｔ＊ｓｉｎ（α））は左眼画像の左下であり、（幅−ＶＰｓｈｉｆｔ＊ｃｏｓ（α）、高さ−Ｖｐｓｈｉｆｔ＊ｓｉｎ（α））は左眼画像の右上である。右眼画像に対して、グラフィックスドライバラッパー２６は、ｇｌＶｉｅｗｐｏｒｔ（ＶＰｓｈｉｆｔ＊ｃｏｓ（α）、ＶＰｓｈｉｆｔ＊ｓｉｎ（α）、幅＋ＶＰｓｈｉｆｔ＊ｃｏｓ（α）、高さ＋Ｖｐｓｈｉｆｔ＊ｓｉｎ（α））となるように、ｇｌＶｉｅｗｐｏｒｔコマンドを修正することができ、（ＶＰｓｈｉｆｔ＊ｃｏｓ（α）、ＶＰｓｈｉｆｔ＊ｓｉｎ（α））は右眼画像の左下であり、（幅＋ＶＰｓｈｉｆｔ＊ｃｏｓ（α）、高さ＋ＶＰｓｈｉｆｔ＊ｓｉｎ（α））は右眼画像の右上である。
【０１７５】
[0183]上の例では、ＶＰｓｈｉｆｔ変数は、左眼画像と右眼画像との間の水平視差の量を定義し得る。たとえば、ＶＰｓｈｉｆｔは、上で説明された水平視差の値であり得る。水平視差の値は、左眼画像のビューポートと右眼画像のビューポートが互いに対してシフトされている量（すなわち、ビューポートシフトの量）、したがって変数ＶＰｓｈｉｆｔを示すことができる。閲覧者は、ゼロ視差平面の位置を定義するために、ＶＰｓｈｉｆｔの値を定義することができる。別の例として、プロセッサ２２は、閲覧者がディスプレイ１２に対してどれだけ離れているかの推定に基づいて、ＶＰｓｈｉｆｔの値を決定するように構成され得る。別の例として、アプリケーション２２またはグラフィックスドライバラッパー２６は、ＶＰｓｈｉｆｔの値によって事前構成され得る。
【０１７６】
[0184]いくつかの例では、グラフィックスドライバラッパー２６はさらに、ビューポート伸長のために、左眼画像および右眼画像のためのｇｌＶｉｅｗｐｏｒｔコマンドを修正することができる。ビューポート伸長は、左眼画像と右眼画像とに重複があり得るように、左眼画像および右眼画像のビューポートを拡張する。たとえば、ビューポート伸長がなければ、左眼画像および右眼画像はディスプレイのそれぞれの部分に制限され得るので、重複はないことがある。重複を増やし、または減らすために、アプリケーションプロセッサ２２はさらに、グラフィックスドライバラッパー２６を介して、ビューポート伸長を含むようにｇｌＶｉｅｗｐｏｒｔコマンドを修正することができる。ビューポート伸長はまた、ゼロ視差平面の位置に影響を与えることがあり、ゼロ視差平面の位置を所望の位置へと調節するためのさらに別の方法を提供し得る。
【０１７７】
[0185]ビューポート伸長を含めるようにｇｌＶｉｅｗｐｏｒｔコマンドを修正することは、すべての例において必須ではない。その上、本開示で説明される技法によれば、アプリケーションプロセッサ２２は、グラフィックスドライバラッパー２６を介して、視線角度に基づいてビューポート伸長を含むようにｇｌＶｉｅｗｐｏｒｔコマンドを修正することができる。たとえば、アプリケーションプロセッサ２２は、グラフィックスドライバラッパー２６を介して、次のようにｇｌＶｉｅｗｐｏｒｔコマンドを修正することができる。左眼画像のビューポートのために、アプリケーションプロセッサ２２は、グラフィックスドライバラッパー２６を介して、ｇｌＶｉｅｗｐｏｒｔコマンドをｇｌＶｉｅｗｐｏｒｔ（−ＶＰｓｈｉｆｔ＊ｃｏｓ（α）、−ＶＰｓｈｉｆｔ＊ｓｉｎ（α）、幅、高さ）へと修正することができる。右眼画像のビューポートのために、アプリケーションプロセッサ２２は、グラフィックスドライバラッパー２６を介して、ｇｌＶｉｅｗｐｏｒｔコマンドをｇｌＶｉｅｗｐｏｒｔ（０、０、幅＋ＶＰｓｈｉｆｔ＊ｃｏｓ（α）、高さ＋ＶＰｓｈｉｆｔ＊ｓｉｎ（α））へと修正することができる。
【０１７８】
[0186]上で説明されたように、本開示で説明される技法は、モノビューのための画像を生成するための命令を、実行またはランタイム中に、立体視ビューのための画像を生成するように修正することができる。たとえば、閲覧者は、アプリケーション４２を実行のために選択することができ、アプリケーション４２は、アプリケーション４２の実行によって生成されたグラフィックスを処理するために頂点シェーダ３８の実行を必要とし得る。アプリケーション４２がデバイス１０上で実行または稼動している間、グラフィックスドライバ２４、グラフィックスドライバラッパー２６、およびコンパイラ２８は、アプリケーションプロセッサ２２上でそれぞれの機能を実行して、アプリケーションプロセッサ２２に、頂点シェーダ３８のソースコードを修正させ、修正された頂点シェーダ４０のためのオブジェクトコードを生成させることができる。言い換えると、３ＤグラフィックスからＳ３Ｄグラフィックスへの変換は、事前にプログラムされたＳ３Ｄグラフィックスコンテンツまたは事前に記録されたＳ３Ｄ画像もしくはビデオを必要とするのではなく、グラフィックスドライバラッパー２６を介して、アプリケーションプロセッサ２２によってランタイム中に実行される。
【０１７９】
[0187]また、上の例は、アプリケーションプロセッサ２２がグラフィックスドライバラッパー２６を介して頂点シェーダ３８に命令を追加し、頂点シェーダ３８の命令を修正し、ビューポートを定義する命令を修正する文脈で説明されるが、本開示の態様は、そのようには限定されない。いくつかの例では、グラフィックスドライバラッパー２６ではなく、アプリケーションプロセッサ２２が、グラフィックスドライバ２４またはコンパイラ２８を介して、頂点シェーダ３８の命令と、アプリケーション４２によって出力された命令とを修正することが可能であり得る。しかしながら、これらの例は、グラフィックスドライバ２４またはコンパイラ２８に対する修正を必要とし得る。
【０１８０】
[0188]グラフィックスドライバ２４またはコンパイラ２８に対する修正は、ＧＰＵ  ３０が立体視ビューのための左眼画像と右眼画像とを生成するように、グラフィックスドライバラッパー２６を開発し、アプリケーションプロセッサ２２に、グラフィックスドライバラッパー２６を介して、本開示で説明される機能を実行させるよりも困難であり得る。たとえば、デバイス１０は、以前から存在するグラフィックスドライバ２４およびコンパイラ２８をロードされていることがあり、グラフィックスドライバ２４とコンパイラ２８とを変更することは困難であり得る。アプリケーションプロセッサ２２に頂点シェーダ３８に対する修正を実行させるためにグラフィックスドライバラッパー２６を追加することによって、例示的な技法は、以前から存在するグラフィックスドライバ２４およびコンパイラ２８に対する修正を必要としなくてよい。
【０１８１】
[0189]さらに、上で説明された技法は、ＧＰＵ  ３０が、アプリケーション４２に対する修正を伴わずに、立体視ビューのための画像を生成することを可能にし得る。たとえば、立体視ビューを生成するためのいくつかの他の技法は、アプリケーション４２の開発者が、左眼画像および右眼画像のためのピクセル値を生成するようにアプリケーション４２のソースコードを修正することを必要とし得る。これらの技法は、立体視ビューのために開発者のアプリケーションを修正するための、アプリケーション４２の開発者からの支援を必要としており、これは、アプリケーション４２の開発者にとって面倒な作業になり得る。上で説明された例示的な技法は、アプリケーション４２の開発者からの支援を何ら伴わずに、モノビューのために開発された、アプリケーション４２のための立体視ビューを提供することができる。
【０１８２】
[0190]その上、ランタイム中に３ＤグラフィックスをＳ３Ｄグラフィックスに変換するための、いくつかの他の技法が提案されている。しかしながら、これらの他の技法は、視線角度を考慮しないことがある。たとえば、これらの他の技法では、視線角度が変化すると、得られる立体視ビューは理想的なものではないように見え得る。視線角度を考慮することによって、本技法は、閲覧者がディスプレイ１２を見ている角度に関係なく、またはディスプレイ１２の角度に関係なく、より豊かな閲覧体験を提供する。
【０１８３】
[0191]また、上で説明された技法は、立体視ビューのため左眼画像と右眼画像とを生成するための、システムメモリ２６に対する複数の呼出しを必要としないことがある。たとえば、立体視ビューを生成するためのいくつかの他の技法では、ＧＰＵは左眼画像を生成する。左眼画像の生成が完了すると、ＧＰＵは、右眼画像を生成するために、左眼画像を生成する間、システムメモリ３６に記憶された深度情報を利用する。しかしながら、深度情報を取り出すための、システムメモリ３６に対する反復的な呼出しは、計算負荷が高いことがあり、過度の電力消費を必要とすることがある。
【０１８４】
[0192]上で説明された例示的な技法は、右眼画像を生成するために左眼画像の深度情報を求める、システムメモリ３６に対するそのような複数の呼出しを必要としないことがある。たとえば、グラフィックスドライバラッパー２６は、頂点シェーダ３８のソースコードと、ビューポートを定義する命令とを修正して、一方の画像の深度情報を他方の画像を生成するために必ずしも必要とすることなく、左眼画像と右眼画像とを互いに独立に生成することができる。
【０１８５】
[0193]上で説明されたように、グラフィックスドライバラッパー２６は、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝（ｚnear＊ｗworld／（Ｒ−Ｌ）／２）＊Ｘまたは単にｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝Ｘというコマンドを、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ変数の値を修正する頂点シェーダ２８のソースコードに含め、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｙ＋＝（ｚnear＊ｗworld／（Ｔ−Ｂ）／２）＊Ｙまたは単にｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝Ｙ＊幅／高さを含めることができ、ＸはＤ＊ｃｏｓ（α）または−Ｄ＊ｃｏｓ（α）に等しく、ＹはＤ＊ｓｉｎ（α）または−Ｄ＊ｓｉｎ（α）に等しい。やはり、頂点の頂点レベルの調整が望まれる場合、グラフィックスドライバラッパー２６はさらに、変数ＸおよびＹを（１−ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｗ／ＺＤＰloc）と乗算することができ、ここで、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｗはｗclip座標を記憶し、それは−ｚworldに等しく、ＺＤＰlocは所望されるゼロ視差平面の位置である。以下は、このように頂点シェーダ３８のソースコード中に命令を含める理由を与える。
【０１８６】
[0194]式（１）において上で示されたように、Ｖｃｌｉｐ＝ＰＲＪ＊Ｖｅｙｅ＝ＰＲＪ＊ＭＶＴ＊Ｖｗｏｒｌｄである。Ｖｃｌｉｐの式は、左眼および右眼のクリッピング座標を生成するように修正され得る。たとえば、左眼および右眼のクリッピング座標は、次の通りであり得る。
【数９】
2016509298.tif 000011
【数１０】
2016509298.tif 000012
【０１８７】
[0195]ＶＴｌｅｆｔ−ｅｙｅおよびＶＴｒｉｇｈｔ−ｅｙｅは、モノビューからの左眼および右眼の仮定された距離に基づく４ｘ４行列であり得る。モノビューの座標は（０、０、０）であってよく、左眼は、式６に記載されるように（Ｄ＊ｃｏｓ（α）、Ｄ＊ｓｉｎ（α）、０）に位置するものと見なされ得、右眼は、（−Ｄ＊ｃｏｓ（α）、−Ｄ＊ｓｉｎ（α）、０）に位置するものと見なされ得る。言い換えると、位置（０、０、０）は、閲覧者の右眼と左眼との中間にあるものと見なされ得る。左眼が、右眼と左眼との中間から（Ｄ＊ｃｏｓ（α）、Ｄ＊ｓｉｎ（α））だけ離れて位置すると見なされ、右眼が、右眼と左眼との中間から（−Ｄ＊ｃｏｓ（α）、−Ｄ＊ｓｉｎ（α））だけ離れて位置すると見なされる場合、Ｄは、閲覧者の右眼と左眼との間の距離の半分を示し、アルファ、αは、視線角度を示す。
【０１８８】
[0196]ＶＴｌｅｆｔ−ｅｙｅおよびＶＴｒｉｇｈｔ−ｅｙｅの行列は、次のように定義され得る。
【数１１】
2016509298.tif 000013
【０１８９】
および
【数１２】
2016509298.tif 000014
【０１９０】
[0197]ＶＴｌｅｆｔ−ｅｙｅおよびＶＴｒｉｇｈｔ−ｅｙｅは、２つの行列の和として書き直され得る。たとえば、ＶＴｌｅｆｔ−ｅｙｅは、次のように書き直され得る。
【数１３】
2016509298.tif 000015
【０１９１】
[0198]ＶＴｒｉｇｈｔ−ｅｙｅは、次のように書き直され得る。
【数１４】
2016509298.tif 000016
【０１９２】
[0199]Ｖｃｌｉｐ＿ｌｅｆｔ−ｅｙｅについての式（式７）にＶＴｌｅｆｔ−ｅｙｅ行列を代入することによって、Ｖｃｌｉｐ＿ｌｅｆｔ−ｅｙｅは、
【数１５】
2016509298.tif 000017
【０１９３】
に等しい。
【０１９４】
[0200]Ｖｃｌｉｐ＿ｒｉｇｈｔ−ｅｙｅについての式（式８）にＶＴｒｉｇｈｔ−ｅｙｅ行列を代入することによって、Ｖｃｌｉｐ＿ｒｉｇｈｔ−ｅｙｅは、
【数１６】
2016509298.tif 000018
【０１９５】
に等しい。
【０１９６】
[0201]式１０と１１の両方において（たとえば、Ｖｃｌｉｐ＿ｌｅｆｔ−ｅｙｅおよびＶｃｌｉｐ＿ｒｉｇｈｔ−ｅｙｅに対して）、
【数１７】
2016509298.tif 000019
【０１９７】
は、ＰＲＪ＊ＭＶＴ＊Ｖｗｏｒｌｄに簡略化され得る。それは、
【数１８】
2016509298.tif 000020
【０１９８】
が単位行列であり、１を乗算することと等価であるからである。
【０１９９】
[0202]式１において上に記載されたように、ＰＲＪ＊ＭＶＴ＊Ｖｗｏｒｌｄは、Ｖｃｌｉｐに等しい。したがって、Ｖｃｌｉｐ＿ｌｅｆｔ−ｅｙｅおよびＶｃｌｉｐ＿ｒｉｇｈｔ−ｅｙｅの式（たとえば、それぞれ、式１０および１１）は、次のように書き直され得る。
【数１９】
2016509298.tif 000021
【０２００】
、
および
【数２０】
2016509298.tif 000022
【０２０１】
[0203]ＰＲＪおよびＭＶＴの行列（それぞれ、式４および５）を代入し、式１１の行列乗算を実行することによって、Ｖｃｌｉｐ＿ｌｅｆｔ−ｅｙｅの式は、
【数２１】
2016509298.tif 000023
【０２０２】
に簡略化され得る。
【０２０３】
Ｖｗｏｒｌｄに代入すると、
【数２２】
2016509298.tif 000024
【０２０４】
である。
【０２０５】
行列を乗算することによって、得られるＶｃｌｉｐ＿ｌｅｆｔ−ｅｙｅの値は、
【数２３】
2016509298.tif 000025
【０２０６】
に等しい。
【０２０７】
より具体的には、
【数２４】
2016509298.tif 000026
【０２０８】
である。
【０２０９】
Ｖｃｌｉｐ＿ｌｅｆｔ−ｅｙｅの上の式では、ｘclipは単一の画像のｘクリッピング座標であり、ｙclipは単一の画像のｙクリッピング座標である。（（ｚnear／（（Ｒ−Ｌ）／２）＊Ｄ＊ｃｏｓ（α）＊ｗworldは、左眼画像についてｘclipに加算される値である。（（ｚnear／（（Ｔ−Ｂ）／２）＊Ｄ＊ｓｉｎ（α）＊ｗworldは、左眼画像についてｙclipに加算される値である。ｚnearおよびｗworldの値は、アプリケーション４２によって生成された単一の画像に対するそれらの値と同じである。ｘclipおよびｙclipに加算される値は、視線角度（α）と、ディスプレイ１２の幅と高さの比とに基づく。
【０２１０】
[0204]Ｖｃｌｉｐ＿ｌｅｆｔ−ｅｙｅの場合と同様の代入を行うと、Ｖｃｌｉｐ＿ｒｉｇｈｔ−ｅｙｅの式は、
【数２５】
2016509298.tif 000027
【０２１１】
に簡略化され得る。
【０２１２】
より具体的には、
【数２６】
2016509298.tif 000028
【０２１３】
である。
【０２１４】
[0205]式１４および１５から、定数
【数２７】
2016509298.tif 000029
【０２１５】
を計算されたｘclip座標に加算し、定数
【数２８】
2016509298.tif 000030
【０２１６】
を計算されたｙclipに加算し、他のすべてのクリッピング座標を同じに保つことによって、頂点シェーダ３８は、左眼画像のクリッピング座標を生成できることが理解され得る。同様に、定数
【数２９】
2016509298.tif 000031
【０２１７】
をｘclip座標から減算し、定数
【数３０】
2016509298.tif 000032
【０２１８】
をｙclip座標から減算し、他のすべてのクリッピング座標を同じに保つことによって、頂点シェーダ３８は、右眼画像のクリッピング座標を生成できる。少なくともこれらの理由により、グラフィックスドライバラッパー１６は、命令ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝ｚnear＊ｗworld／（（Ｒ−Ｌ）／２）＊Ｘを含み得、ここでＸは＋Ｄ＊ｃｏｓ（α）に等しく、命令ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｙ＋＝ｚnear＊ｗworld／（（Ｔ−Ｂ）／２）＊Ｙであり、左眼画像を生成するためにＹは＋Ｄ＊ｓｉｎ（α）に等しく、右眼画像を生成するためにＸは−Ｄ＊ｃｏｓ（α）に等しくＹは−Ｄ＊ｓｉｎ（α）に等しい。
【０２１９】
[0206]いくつかの例では、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝コマンドを単なるｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝Ｘへとさらに簡略化することが可能であり得る。たとえば、ｗworld変数は１に設定されることが一般的である。また、ＯｐｅｎＧＬ、ＯｐｅｎＧＬ  ＥＳ、およびＯｐｅｎＧＬ  ＥＳ  ２．０は、プログラマブルシェーダによって、錐台を、
【数３１】
2016509298.tif 000033
【０２２０】
となるように定義し、ここでｆｏｖxは、ＯｐｅｎＧＬ、ＯｐｅｎＧＬ  ＥＳ、およびＯｐｅｎＧＬ  ＥＳ  ２．０において定義される錐台である。視線角度が４５度に設定されることも一般的であり、これは、ｃｏｔ（ｆｏｖx）が１に等しいことを意味する。これは、
【数３２】
2016509298.tif 000034
【０２２１】
が１に等しいことを意味する。したがって、これらの例では、
【数３３】
2016509298.tif 000035
【０２２２】
が単なるＸへと簡略化される（たとえば、
【数３４】
2016509298.tif 000036
【０２２３】
が１に等しく、ｗworldが１に等しい）。これらの例では、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝変数は、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝Ｘへと簡略化され得る。
【０２２４】
[0207]また、ディスプレイ１２の幅はＲ−Ｌに等しくてよく、ディスプレイ１２の高さはＴ−Ｂに等しくてよい。したがって、命令ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｙ＋＝ｚnear＊ｗworld／（（Ｔ−Ｂ）／２）＊Ｙは、命令ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｙ＋＝Ｙ＊幅／高さへと簡略化され得る。
【０２２５】
[0208]したがって、上の式は、命令ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝（ｚnear＊ｗworld／（Ｒ−Ｌ）／２）＊Ｘまたはｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝Ｘ、およびｇｌ＿Ｐｏｓｉｔｉｏｎ．ｙ＋＝（ｚnear＊ｗworld／（Ｔ−Ｂ）／２）＊Ｙまたはｇｌ＿Ｐｏｓｉｔｉｏｎ．ｙ＋＝Ｙを頂点シェーダ３８に追加することが、２回実行されると、１回目の実行ではＸが＋Ｄ＊ｃｏｓ（α）に等しくＹが＋Ｄ＊ｓｉｎ（α）に等しく、２回目の実行ではＸが−Ｄ＊ｃｏｓ（α）に等しくＹが−Ｄ＊ｓｉｎ（α）に等しい場合、視線角度に基づいて立体視ビューを生成するためにモノビュー画像をずらすのになぜ十分であり得るかという理由を示す数学的基礎を提供する。さらに、（ｚnear＊ｗworld／（Ｒ−Ｌ）／２）が１に等しくない例、および（ｚnear＊ｗworld／（Ｔ−Ｂ）／２）が幅／高さに等しくない例であっても、ｚnear＊ｗworld／（Ｒ−Ｌ）／２＊Ｄは、その値が閲覧者の選択するものであり得る定数値であってよく、同様に、ｚnear＊ｗworld／（Ｔ−Ｂ）／２＊Ｄは、その値が閲覧者の選択するものであり得る定数値であってよい。
【０２２６】
[0209]言い換えると、本開示で説明される技法では、ｚnear、ｗworld、Ｒ、Ｌ、Ｔ、Ｂ、およびＤの実際の値は必要とされないことがある。むしろ、閲覧者は、ｚnear＊ｗworld／（Ｒ−Ｌ）／２＊Ｄのために第１の値を選択し、ｚnear＊ｗworld／（Ｒ−Ｌ）／２＊Ｄのために第２の値を選択することができる。グラフィックスドライバラッパー２６は、第１の値をｃｏｓ（α）と乗算し、得られた値を頂点シェーダ３８に提供することができる。頂点シェーダ３８中のｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝コマンドは、そのグラフィックスドライバラッパー２６が頂点シェーダ３８に含まれ、左眼画像のための修正された頂点シェーダ４０のオブジェクトコードの１回目の実行において頂点のｘクリッピング座標を決定するために、グラフィックスドライバラッパー２６によって提供された値をｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘの現在の値に加算することができる。また、グラフィックスドライバラッパー２６は、第２の値をｓｉｎ（α）と乗算し、得られた値を頂点シェーダ３８に提供することができる。頂点シェーダ３８中のｇｌ＿Ｐｏｓｉｔｉｏｎ．ｙ＋＝コマンドは、そのグラフィックスドライバラッパー２６が頂点シェーダ３８に含まれ、左眼画像のための修正された頂点シェーダ４０のオブジェクトコードの１回目の実行において頂点のｙクリッピング座標を決定するために、グラフィックスドライバラッパー２６によって提供された値をｇｌ＿Ｐｏｓｉｔｉｏｎ．ｙの現在の値に加算することができる。
【０２２７】
[0210]同様に、グラフィックスドライバラッパー２６は、第１の値を−１およびｃｏｓ（α）と乗算し、得られた値を頂点シェーダ３８に提供することができる。頂点シェーダ３８中のｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝コマンドは、そのグラフィックスドライバラッパー２６が頂点シェーダ３８に含まれ、右眼画像のための修正された頂点シェーダ４０のオブジェクトコードの２回目の実行において頂点のｘクリッピング座標を決定するために、グラフィックスドライバラッパー２６によって提供された値をｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘの現在の値に加算することができる。また、グラフィックスドライバラッパー２６は、第２の値を−１およびｓｉｎ（α）と乗算し、得られた値を頂点シェーダ３８に提供することができる。頂点シェーダ３８中のｇｌ＿Ｐｏｓｉｔｉｏｎ．ｙ＋＝コマンドは、そのグラフィックスドライバラッパー２６が頂点シェーダ３８に含まれ、右眼画像のための修正された頂点シェーダ４０のオブジェクトコードの２回目の実行において頂点のｙクリッピング座標を決定するために、グラフィックスドライバラッパー２６によって提供された値をｇｌ＿Ｐｏｓｉｔｉｏｎ．ｙの現在の値に加算することができる。
【０２２８】
[0211]いくつかの例では、閲覧者は、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝コマンドおよびｇｌ＿Ｐｏｓｉｔｉｏｎ．ｙ＋＝コマンドの修正のための第１の値および第２の値の値、ならびに／または、ＶＰｓｈｉｆｔおよびＺＤＰlocの値を選択することができる。これは、閲覧者が、立体視効果を望まれるように精密に調整することを可能にし得る。たとえば、閲覧者は、頂点がずらされる量とゼロ視差平面の位置とを定義することによって、立体視効果を個人設定することが可能であり得る。
【０２２９】
[0212]このように、本開示の技法は、モノビューのために設計された頂点シェーダ３８に対する小さな修正を、修正された頂点シェーダがコンパイルされ実行される（たとえば、修正された頂点シェーダ４０のオブジェクトコードの実行）とき、得られた画像が閲覧者に立体視ビューを提供し得るように、提供することができる。立体視ビューは、閲覧者に３Ｄ体験を提供することができ、これは、ディスプレイの２Ｄエリアによって限定された画像を見るのと比較して、より豊かでより十分な体験であり得る。
【０２３０】
[0213]図６は、ゼロ視差平面の位置を示す概念図である。たとえば、元の視点の位置は（０、０、０）の位置であり得る。左眼は元の視点から距離Ｄ離れていてよく、右眼は元の視点から距離−Ｄ離れていてよい。たとえば、左眼は（−Ｄ＊ｃｏｓ（α）、−Ｄ＊ｓｉｎ（α））に位置していてよく、右眼は（Ｄ＊ｃｏｓ（α）、Ｄ＊ｓｉｎ（α））に位置していてよい。
【０２３１】
[0214]左眼視点および右眼視点から延びる角度がつけられた線は、それぞれ、左眼および右眼が見るエリアを示す。左眼視点および右眼視点から延びる直線は、ディスプレイ１２の方向に対する閲覧者の方向（すなわち、視線角度）を示す。この例では、視線角度は０である。
【０２３２】
[0215]図６に示されるように、ＺＤＰの位置はディスプレイ１２の前の、アプリケーション４２によって定義されるｚnearおよびｚfarクリッピング面内にある。ＺＤＰの位置は２つの要因に基づき得る。１つの要因は、選択されるＤの値であり得る。別の要因は、左眼画像と右眼画像との間の視差を示すＶＰｓｈｉｆｔの値（すなわち、水平視差値）であり得る。ＤおよびＶＰｓｈｉｆｔの値を選択することによって、閲覧者は、ＺＤＰの所望の位置を選択することができる。これらの例では、アプリケーション４２によって生成される画像中のすべての物体は、ＺＤＰ内に（たとえば、ディスプレイ１２の面内に制限されるのではなく、ディスプレイ１２の前に）現れ得る。上で説明されたように、アプリケーションプロセッサ２２がＤおよびＶＰｓｈｉｆｔの値を決定することが可能であり得る。
【０２３３】
[0216]その上、いくつかの例では、ＶＰｓｈｉｆｔは必要ではないことがあり、閲覧者またはアプリケーションプロセッサ２２がＺＤＰの位置を決定することができる。これらの例では、グラフィックスドライバラッパー２６は、一部の物体がＺＤＰの前に現れ、一部の物体がＺＤＰにおいて現れ、一部の物体がＺＤＰの後に現れるように、ＺＤＰの位置に基づいて、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ変数およびｇｌ＿Ｐｏｓｉｔｉｏｎ．ｙ変数に記憶された値を修正することができる。
【０２３４】
[0217]図７は、本開示で説明される１つまたは複数の技法による、左眼画像と右眼画像との間の水平視差を示す概念図である。たとえば、図７は右眼画像４５Ａと左眼画像４５Ｂとを示す。この例では、水平視差はＶＰｓｈｉｆｔ＊２であると示される。図７に示されるように、水平視差は画像レベルにある（すなわち、右眼画像４５Ａおよび左眼画像４５Ｂの中のすべての頂点の間の視差は同じである）。上で説明されたように、アプリケーションプロセッサ２２または閲覧者が、ＶＰｓｈｉｆｔの値を選択することができる。ＶＰｓｈｉｆｔの値を選択することによって、閲覧者またはアプリケーションプロセッサ２２は、ゼロ視差平面の位置を定義することができる。
【０２３５】
[0218]図８は、本開示で説明される１つまたは複数の例示的技法を実施し得るグラフィックス処理ユニット（ＧＰＵ）の例を示すブロック図である。たとえば、図８は、ＧＰＵ  ３０のコンポーネントをより詳細に示す。図８に示されるように、ＧＰＵ  ３０は、コマンドプロセッサ６６と、シェーダプロセッサ３２と、固定機能パイプライン３４とを含む。コマンドプロセッサ６６は、ＧＰＵ  ３０とアプリケーションプロセッサ２２との間のインターフェースとして機能し得る。たとえば、コマンドプロセッサ６６は、アプリケーションプロセッサ２２からコマンドを受け取ることができ、コマンドがシェーダプロセッサ３２に転送されるべきか固定機能パイプライン３４に転送されるべきか決定することができる。別の例として、コマンドプロセッサ６６は、アプリケーションプロセッサ２２から視線角度を受け取ることができる。
【０２３６】
[0219]一例として、上で説明されたように、アプリケーション４２を実行するアプリケーションプロセッサ２２は、ＧＰＵ  ３０に、修正された頂点シェーダ４０のオブジェクトコードを実行するように命令することができる。この例では、コマンドプロセッサ６６は、アプリケーションプロセッサ２２からコマンドを受け取ることができ、シェーダプロセッサ３２に、修正された頂点シェーダ４０のオブジェクトコードを実行するように命令することができる。別の例として、いくつかの例では、上で説明されたように、グラフィックスドライバラッパー２６は、アプリケーション４２によって発行されたｇｌＶｉｅｗｐｏｒｔコマンドを修正し、修正されたｇｌＶｉｅｗｐｏｒｔコマンドをＧＰＵ  ３０に与えることができる。この例では、コマンドプロセッサ６６は、修正されたｇｌＶｉｅｗｐｏｒｔコマンドを受け取り、このコマンドが固定機能パイプライン３４のビューポート変換ユニット５４のためのものであると決定することができる。コマンドプロセッサ６６は、修正されたｇｌＶｉｅｗｐｏｒｔコマンドを、左眼画像および右眼画像のためのビューポートを適用するためのビューポート変換ユニット５４に転送することができる。
【０２３７】
[0220]たとえば、上で説明されたように、アプリケーション４２は、ＧＰＵ  ３０への送信をグラフィックスドライバラッパー２６が阻止する、ｇｌＤｒａｗコマンドを発行することができる。ｇｌＤｒａｗコマンドは、修正された頂点シェーダ４０のオブジェクトコードを実行するための第１の命令をシェーダプロセッサ４２へグラフィックスドライバラッパー２６が発行することを引き起こし得る。次に、シェーダプロセッサ４２は、修正された頂点シェーダ４０のオブジェクトコードを実行し、得られたクリッピング座標を、そのローカルメモリまたはシステムメモリ３６に記憶する。
【０２３８】
[0221]ｇｌＤｒａｗコマンドはまた、グラフィックスドライバラッパー２６に、第１のｇｌＶｉｅｗｐｏｒｔ命令を発行させ、この命令はコマンドプロセッサ６６によって受け取られる。左眼画像と右眼画像との間の水平視差の画像レベルの調整が必要とされない例では、グラフィックスドライバラッパー２６は、第１のｇｌＶｉｅｗｐｏｒｔコマンドを修正しなくてよい。左眼画像と右眼画像との間の水平視差の画像レベルの調整が必要とされる例では、グラフィックスドライバラッパー２６は、視線角度およびＶＰｓｈｉｆｔの値に基づいて、第１のｇｌＶｉｅｗｐｏｒｔコマンドを修正することができる。
【０２３９】
[0222]次いで、グラフィックスドライバラッパー２６は、コマンドプロセッサ６６によって受け取られる第１のｇｌＤｒａｗコマンドを発行する。コマンドプロセッサ６６は、それに応答して、固定機能パイプライン３４およびシェーダプロセッサ３２の固定機能ユニットに、立体視ビューの第１の画像（たとえば、左眼画像）のためのグラフィックスコンテンツを生成するための、それぞれの機能を実行させる。たとえば、より詳細に論じられるように、第１のｇｌＤｒａｗコマンドに応答して、水平視差の画像レベルの調整が所望されるとき、ビューポート変換ユニット５４は、第１の画像をディスプレイの第１の部分に制限し、フラグメント単位動作ユニット６２は、第１の画像のグラフィックスコンテンツをフレームバッファ６４に出力する。
【０２４０】
[0223]立体視ビューの第１の画像がフレームバッファ６４に記憶された後、ＧＰＵ  ３０は、立体視ビューの第２の画像のためのグラフィックスコンテンツを生成するためのステップを繰り返す。たとえば、グラフィックスドライバラッパー２６は、修正された頂点シェーダ４０のオブジェクトコードを実行するための第２の命令をシェーダプロセッサ３２に発行する。次に、シェーダプロセッサ３２は、修正された頂点シェーダ４０のオブジェクトコードを実行し、得られたクリッピング座標を、そのローカルメモリまたはシステムメモリ３６に記憶する。グラフィックスドライバラッパー２６はまた、第２のｇｌＶｉｅｗｐｏｒｔ命令を発行し、この命令はコマンドプロセッサ６６によって受け取られる。やはり、ｇｌＶｉｅｗｐｏｒｔ命令は、画像レベルにおける視差の調整が望まれる場合は修正されてよく、画像レベルの視差の調整が望まれない場合は修正されなくてよい。
【０２４１】
[0224]次いで、グラフィックスドライバラッパー２６は、コマンドプロセッサ６６によって受け取られる第２のｇｌＤｒａｗコマンドを発行する。コマンドプロセッサ６６は、それに応答して、固定機能パイプライン３４およびシェーダプロセッサ３２の固定機能ユニットに、立体視ビューの第２の画像（たとえば、右眼画像）のためのグラフィックスコンテンツを生成するための、それぞれの機能を実行させる。たとえば、第２のｇｌＤｒａｗコマンドに応答して、水平視差の画像レベルの調整が所望されるとき、ビューポート変換ユニット５４は、第２の画像をディスプレイの第２の部分に制限し、フラグメント単位動作ユニット６２は、第２の画像のグラフィックスコンテンツをフレームバッファ６４に出力する。
【０２４２】
[0225]図８の破線ボックスに示されるように、シェーダプロセッサ３２は、修正された頂点シェーダ４０とフラグメントシェーダ５８とを含む。破線ボックスは、シェーダプロセッサ３２が実際には修正された頂点シェーダ４０とフラグメントシェーダ５８とを含まなくてもよいことを示すためのものである。むしろ、シェーダプロセッサ３２は、修正された頂点シェーダ４０およびフラグメントシェーダ５８のオブジェクトコードを実行することができる。修正された頂点シェーダ４０およびフラグメントシェーダ５８のオブジェクトは、システムメモリ３６に記憶され得る。
【０２４３】
[0226]固定機能パイプライン３４は、プリミティブ組立ユニット４８、錐台ユニット５０、透視除算ユニット５２、ビューポート変換ユニット５４、ラスタ化ユニット５６、およびフラグメント単位動作ユニット６２のような、１つまたは複数の固定機能ユニットを含み得る。固定機能パイプライン３４のこれらの固定機能ユニットの各々は、特定のグラフィックス関連機能を実行するように配線接続されたハードウェアユニットでよい。固定機能パイプライン３４のこれらの固定機能ユニットは、別個のコンポーネントとして示されるが、本開示の態様は、そのように限定されない。固定機能パイプライン３４の固定機能ユニットの１つまたは複数は、共通の固定機能ユニットへと互いに組み合わされ得る。また、図８に示されるものよりも多くの、固定機能パイプライン３４の固定機能ユニットがあってもよい。固定機能パイプライン３４の１つまたは複数の固定機能ユニットは、理解しやすくするために、別々に示されている。
【０２４４】
[0227]その上、固定機能パイプライン３４の固定機能ユニットの具体的な順序は、例示の目的で示されており、限定的と見なされるべきではない。たとえば、固定機能パイプライン３４の固定機能ユニットを並べ替えることが可能であり得る。一例として、フラグメント単位動作ユニット６２の機能の１つは、重複するピクセルによって塞がれるピクセルを選別するためのものであってよい。この機能が、固定機能パイプライン３４中でより早く実行されることが可能であってもよい。
【０２４５】
[0228]固定機能パイプライン３４のこれらの固定機能ユニットは、シェーダプロセッサ３２と比較して、非常に限定された機能的な柔軟性を提供し得る。たとえば、シェーダプロセッサ３２は、修正された頂点シェーダ４０およびフラグメントシェーダ５８のようなプログラマブルシェーダプログラムを実行するように特に設計され得る。これらのシェーダプログラムは、シェーダプロセッサ３２を、シェーダプログラムによって定義された方式で機能させる。言い換えると、シェーダプログラムは、シェーダプロセッサ３２の機能を定義することができるが、固定機能パイプライン３４の固定機能ユニットの機能は設定される。
【０２４６】
[0229]上で説明されたように、グラフィックスドライバラッパー２６は、ＧＰＵ  ３０に、修正された頂点シェーダ４０のオブジェクトコードを２回実行するように命令することができ、ここで１回目の実行は、視線角度に基づく立体視ビューの画像の一方（たとえば、左眼画像）の頂点のクリッピング座標の生成のためであり、２回目の実行は、視線角度に基づく立体視ビューの他方の画像（たとえば、右眼画像）の頂点のクリッピング座標の生成のためである。修正された頂点シェーダ４０のオブジェクトコードを実行するための、これらの命令の各々に応答して、コマンドプロセッサ６６は、シェーダプロセッサ３２に、修正された頂点シェーダ４０のオブジェクトコードを取り出し、修正された頂点シェーダ４０のオブジェクトコードを実行するように命令することができる。上で説明されたように、コンパイラ２８は、修正された頂点シェーダのソースコードをコンパイルし、得られたオブジェクトコードを、修正された頂点シェーダ４０のオブジェクトコードとして記憶することができる。
【０２４７】
[0230]図８に示されるように、修正された頂点シェーダ４０は、頂点アレイ４６とテクスチャ６０とを入力として受け取ることができる。頂点アレイ４６は、上で説明されたように、アプリケーション４２によって生成された頂点のピクセル値を生成するための情報（たとえば、頂点の座標、頂点の色値、および頂点の透明度値）を含み得る。たとえば、頂点アレイ４６の頂点の座標は、アプリケーション４２によって定義されるようなワールド座標であり得る。テクスチャ６０は、グラフィックスコンテンツのより現実的なビューを提供するように、生成されたグラフィックスに重なる、テクスチャのピクセル値であり得る。
【０２４８】
[0231]シェーダプロセッサ３２上で実行される修正された頂点シェーダ４０は、頂点の各々のクリッピング座標を生成することができる。たとえば、修正された頂点シェーダ４０は、アプリケーション４２によって定義され頂点アレイ４６に記憶されたような頂点のワールド座標を、図１を参照して上で論じられたような式１の行列乗算を実行することによって、頂点の各々のクリッピング座標へと変換することができる。さらに、シェーダプロセッサ３２上で実行される修正された頂点シェーダ４０は、修正された頂点シェーダ４０のオブジェクトコードの１回目の実行において左眼画像に対するずれを提供し、修正された頂点シェーダ４０のオブジェクトコードの２回目の実行において右眼画像に対するずれを提供するために、視線角度に基づいて、頂点の各々のクリッピング座標に対するｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ変数とｇｌ＿Ｐｏｓｉｔｉｏｎ．ｙ変数とを更新することができる。また、修正された頂点シェーダ４０は、追加的な従来の頂点シェーダタスクを実行することができる。たとえば、修正された頂点シェーダ４０は、頂点に対して照明機能を実行することができる。
【０２４９】
[0232]修正された頂点シェーダ４０がモデルビュー変換（たとえば、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝コマンドとｇｌ＿Ｐｏｓｉｔｉｏｎ．ｙ＋＝コマンドとを用いた変位を含む、クリッピング座標へのワールドビュー座標の変換）を実行した後、修正された頂点シェーダ４０は、頂点のクリッピング座標を、固定機能パイプライン３４のプリミティブ組立ユニット４８に与える。プリミティブ組立ユニット４８は、頂点をプリミティブへと組み立てるために、頂点のクリッピング座標を利用することができる。たとえば、プリミティブ組立ユニット４８は、頂点のクリッピング座標に基づいて複数の三角形を組み立てることができ、ここで三角形の各々の頂点は、修正された頂点シェーダ４０から受け取られた頂点に対応する。複数の三角形は、プリミティブの一例である。一般に、プリミティブ組立ユニット４８は、受け取られた頂点のクリッピング座標に基づいて、受け取られた頂点を、任意の多角形へと組み立てることができる。
【０２５０】
[0233]プリミティブ組立ユニット４８は、組み立てられたプリミティブを錐台ユニット５０に送ることができる。錐台ユニット５０は、組み立てられたプリミティブがビューボリューム内にあるかどうか決定することができる。たとえば、上で述べられたように、ＯｐｅｎＧＬ、ＯｐｅｎＧＬ  ＥＳ、およびＯｐｅｎＧＬ  ＥＳ  ２．０が、特定のビューボリュームを（ｆｏｖx）として定義することができる。しかしながら、錐台は、たとえば、ｇｌＦｒｕｓｔｒｕｍ関数を使用して、ユーザにより定義可能であり得る。錐台ユニット５０は、プリミティブ全体がビューボリューム内にあるか、全体がビューボリュームの外側にあるか、または部分的にビューボリューム内にあり部分的にビューボリュームの外側にあるかを決定することができる。錐台ユニット５０は、さらなる処理から、全体がビューボリュームの外側にあるプリミティブを選別することができ、プリミティブの部分は、ビューボリュームの外側にあるものである。錐台ユニット５０は、さらなる処理のために、全体がビューボリューム内にあるプリミティブと、ビューボリューム内にあるプリミティブの部分とを保つことができる。
【０２５１】
[0234]錐台ユニット５０は、残りのプリミティブと、プリミティブの部分とを、透視除算（perspective divide）ユニット５２に送ることができる。透視除算ユニット５２は、プリミティブの深度に基づいて、プリミティブを拡大または縮小することができる。たとえば、プリミティブの各々は、ｘ、ｙ、およびｚ座標によって定義され得る。ｚ座標は、プリミティブがどれだけ近いか、または離れているかを示し得る。この段階で、ＧＰＵ  ３０は、立体視ビューのための画像の１つのためのグラフィックスコンテンツを生成中であることに留意されたい。したがって、プリミティブの近接の概念は、立体視ビューではなくモノビューの文脈におけるものである。
【０２５２】
[0235]たとえば、透視除算ユニット５２は、一部のプリミティブを縮小し、他のプリミティブを拡大することができる。このことは、モノビューにおいて、拡大されたプリミティブと比較して縮小されたプリミティブがさらに離れているという知覚を生み出し得る。上で説明されたように、閲覧者が立体視ビューを知覚するのは、これらのモノビュー画像が表示されるときである。言い換えると、透視除算ユニット５２は、左眼画像と右眼画像とを、ディスプレイの２Ｄエリアに表示される３Ｄ画像にさせることができる。閲覧者がこれらの３Ｄ画像を見ると、左眼画像および右眼画像における、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝コマンドおよびｇｌ＿Ｐｏｓｉｔｉｏｎ．ｙ＋＝コマンドの追加によって引き起こされるずれが、閲覧者に、３Ｄボリュームを包含する立体３Ｄ（Ｓ３Ｄ）画像を知覚させる。
【０２５３】
[0236]透視除算ユニット５２は、プリミティブをビューポート変換ユニット５４に送ることができる。ビューポート変換ユニット５４は、画像のサイズと位置とを、定義されたビューポートに合うように修正する。たとえば、ビューポート変換ユニット５４の前に、修正された頂点シェーダ４０および固定機能パイプライン３４の固定機能ユニットが、画像がディスプレイ全体に表示されるべきであるかのように、グラフィックスデータを処理する。ビューポート変換ユニット５４の機能は、定義されたビューポートに画像が制限されるように、画像のサイズと場所とを修正することであり得る。
【０２５４】
[0237]左眼画像中の頂点と右眼画像中の頂点との間の視差の頂点レベルの調整が望まれる例では、ビューポート変換ユニット５４は、アプリケーション４２によって定義される単一の画像のビューポートと同じとなるように左眼画像のビューポートを定義できることを理解されたい。同様に、この例では、ビューポート変換ユニット５４は、アプリケーション４２によって定義される単一の画像のビューポートと同じとなるように、右眼画像のビューポートを定義することができる。左眼画像中の頂点と右眼画像中の頂点との間の視差の頂点レベルの調整が望まれない例では、ビューポート変換ユニット５４は、修正されたｇｌＶｉｅｗｐｏｒｔコマンドによって定義されるようなある部分に左眼画像を制限し、修正されたｇｌＶｉｅｗｐｏｒｔコマンドによって定義されるような別の部分に右眼画像を制限することができる。
【０２５５】
[0238]たとえば、上で説明されたように、頂点シェーダ４０、それは左眼画像のためのグラフィックスコンテンツ（たとえば、頂点のクリッピング座標）を生成し得る、のオブジェクトコードの１回目の実行の後、グラフィックスドライバラッパー２６は、左眼画像をディスプレイ１２のある部分（たとえば、ディスプレイ１２の左半分）に制限するように、左眼画像のビューポートを修正することができる。たとえば、頂点シェーダ４０のオブジェクトコードの１回目の実行の後、グラフィックスドライバラッパー２６は、ｇｌＶｉｅｗｐｏｒｔ（０、０、幅、長さ）コマンド、それはアプリケーション４２によって以前に発行され、ＧＰＵ  ３０により阻止される、を、ｇｌＶｉｅｗｐｏｒｔ（−ＶＰｓｈｉｆｔ＊ｃｏｓ（α）、−ＶＰｓｈｉｆｔ＊ｓｉｎ（α）、幅−Ｖｐｓｈｉｆｔ＊ｃｏｓ（α）、高さ−Ｖｐｓｈｉｆｔ＊ｓｉｎ（α））に修正し、この第１の修正されたｇｌＶｉｅｗｐｏｒｔコマンドをＧＰＵ  ４０に与えることができる。コマンドプロセッサ６６は、第１の修正されたｇｌＶｉｅｗｐｏｒｔコマンドをビューポート変換ユニット５４に与えることができる。ビューポート変換ユニット５４は次いで、透視除算ユニット５２から受け取られたプリミティブのサイズを、この例では、これらのプリミティブがディスプレイの１つの半分に制限されるように修正することができる。
【０２５６】
[0239]頂点シェーダ４０のオブジェクトコードの２回目の実行の後、ビューポート変換ユニット５４は、同様の機能を、右眼画像に対してではあるが実行することができる。たとえば、頂点シェーダ４０のオブジェクトコードの２回目の実行は、右眼画像のグラフィックスコンテンツ（たとえば、頂点のクリッピング座標）の生成のためであってよい。頂点シェーダ４０のオブジェクトコードのこの２回目の実行の後、ｇｌＶｉｅｗｐｏｒｔ（０、０、幅、長さ）コマンド、それはグラフィックスドライバラッパー２６は、アプリケーション４２によって以前に発行され、ＧＰＵ  ３０により阻止される、を、ｇｌＶｉｅｗｐｏｒｔ（ＶＰｓｈｉｆｔ＊ｃｏｓ（α）、ＶＰｓｈｉｆｔ＊ｓｉｎ（α）、幅＋ＶＰｓｈｉｆｔ＊ｃｏｓ（α）、高さ＋ＶＰｓｈｉｆｔ＊ｓｉｎ（α））に修正し、この第２の修正されたｇｌＶｉｅｗｐｏｒｔコマンドをＧＰＵ  ３０に与えることができる。コマンドプロセッサ６６は、第２の修正されたｇｌＶｉｅｗｐｏｒｔコマンドをビューポート変換ユニット５４に転送することができる。このように、ＧＰＵ  ４０は、左眼画像から右眼画像を生成するために深度情報に依存することなく、また、右眼画像から左眼画像を生成するために深度情報に依存することなく、アプリケーション３２のランタイム中にアプリケーション３２によって生成されたモノビュー画像から、立体視ビューのための左眼画像と右眼画像とを生成するように動作可能であり得る。
【０２５７】
[0240]ビューポート変換ユニット５４は、第１の修正されたｇｌＶｉｅｗｐｏｒｔコマンドおよび第２の修正されたｇｌＶｉｅｗｐｏｒｔコマンドの各々の後にビューポートを修正した後、プリミティブをラスタ化ユニット５６に転送することができる。ラスタ化ユニット５６は、プリミティブを、ディスプレイのピクセルへと変換することができる。たとえば、ラスタ化ユニット５６は、ディスプレイのどのピクセルがプリミティブの各々によって包含されるかを決定することができる。ラスタ化ユニット５６は、これらのピクセルの各々の、ディスプレイ上での場所を決定することもできる。
【０２５８】
[0241]ラスタ化ユニット５６は、そのグラフィックスデータをフラグメントシェーダ５８に出力することができる。ピクセルシェーダと呼ばれることがあるフラグメントシェーダ５８は、シェーダプロセッサ３２上で実行されるシェーダプログラムであってよい。たとえば、フラグメントシェーダ５８のためのソースコードはシステムメモリ３６に記憶されてよく、コンパイラ２８は、フラグメントシェーダ５８のソースコードをコンパイルして、フラグメントシェーダ５８のオブジェクトコードを生成することができる。あるいは、システムメモリ３６は、フラグメントシェーダ５８のためのオブジェクトコードを、必ずしもコンパイラ２８によって生成されることなく記憶することができる。
【０２５９】
[0242]フラグメントシェーダ５８は、ディスプレイ上のピクセルの各々の色値を出力することができる。たとえば、フラグメントシェーダ５８は、赤緑青（ＲＧＢ）成分に基づいて、各ピクセルの色を定義することができる。フラグメントシェーダ５８は、１つの説明のための例として、赤成分を定義するのに８ビット、緑成分を定義するのに８ビット、および青成分を定義するのに８ビットを利用することができる。フラグメントシェーダ５８は、色値をフラグメント単位動作ユニット６２に出力することができる。
【０２６０】
[0243]フラグメント単位動作ユニット６２は、可視ではないピクセルを選別することができる。たとえば、さらに離れた物体のピクセルは、フラグメント単位動作ユニット６２がｚバッファから決定することができる、より近い物体のピクセルと重複し得る。この重複により、さらに離れた物体のピクセルは、全体が塞がれることになり得る。この場合、フラグメント単位動作ユニット６２は、重複させられたピクセルを選別することができる。フラグメント単位動作ユニット６２は、ピクセルを一緒に混合することもできる。たとえば、重複するピクセルは、重複させられるピクセルを完全には塞がないように、半透明であってよい。この場合、フラグメント単位動作ユニット６２は、これらのピクセルの色を一緒に混合することができる。
【０２６１】
[0244]フラグメント単位動作ユニット６２の出力は、ディスプレイ上のピクセルのピクセル値（たとえば、色）であり得る。フラグメント単位動作ユニット６２は、ピクセル値を、一時的な記憶のために、システムメモリ３６のフレームバッファ６４に出力することができる。フレームバッファ６４は、ディスプレイ上のピクセルの各々のピクセル値を出力することができる。
【０２６２】
[0245]フレームバッファ６４は、記憶位置の２Ｄアレイと見なされ得る。フレームバッファ６４を伴う記憶位置の数は、ディスプレイ１２のピクセルの数の２倍であり得る。また、フレームバッファ６４内の２つの記憶位置は、ディスプレイ上の１つの位置に対応し得る。たとえば、フレームバッファ６４は、２つの半分を含んでよく、各々の半分は、ディスプレイ１２の全体のための記憶位置を含む。この例では、フレームバッファ６４内の、第１の半分の中の左上の記憶位置および第２の半分の中の左上の記憶位置は、ディスプレイの左上のピクセルに対応してよく、フレームバッファ６４内の、第１の半分の中の左上の記憶位置の右側の記憶位置および第２の半分の中の左上の記憶位置の右側の記憶位置は、ディスプレイの左上のピクセルの右側のピクセルに対応してよく、以下同様である。
【０２６３】
[0246]第１のｇｌＤｒａｗコマンドの完了の後で、第１の半分のフレームバッファ６４の中に位置する記憶位置は、左眼画像のピクセル値を記憶することができる。同様に、第２のｇｌＤｒａｗコマンドの完了の後で、フレームバッファ６４の第２の半分の中に位置する記憶位置は、右眼画像のピクセル値を記憶することができる。したがって、第１および第２のｇｌＤｒａｗコマンドの完了の後、フレームバッファ６４は、左眼画像のピクセル値と、右眼画像のピクセル値とを記憶することができる。
【０２６４】
[0247]図９は、本開示で説明される１つまたは複数の例示的な技法を実施し得るグラフィックス処理ユニット（ＧＰＵ）の別の例を示すブロック図である。たとえば、図９は、ＯｐｅｎＧＬ  ＥＳ  ２．０グラフィックスパイプラインを示し、本開示で説明される技法がＯｐｅｎＧＬ  ＥＳ  ２．０グラフィックスパイプラインにおいて実施され得る方式を示す。図８と同様の図９のユニットは、同じ参照番号が与えられており、図９に関してさらに説明されない。
【０２６５】
[0248]図９は、グラフィックスドライバ２４が実装するＡＰＩできる、ＯｐｅｎＧＬ  ＥＳ  ２．０  ＡＰＩ  ６６を示す。言い換えると、ＯｐｅｎＧＬ  ＥＳ  ２．０  ＡＰＩ  ６６は、グラフィックスドライバ２４の一例であり得る。示されるように、ＯｐｅｎＧＬ  ＥＳ  ２．０は、頂点アレイ４６と、修正された頂点シェーダ４０に対するコマンドと、テクスチャ６０と、フラグメントシェーダ５８に対するコマンドとを出力する。修正された頂点シェーダ４０は、頂点アレイ４６からのワールド座標頂点とテクスチャ６０からのテクスチャとを受け取り、視線角度に基づいてクリッピング座標を作成する。プリミティブ組立ユニット４８、ラスタ化ユニット５６、フラグメントシェーダ５８、フラグメント単位動作ユニット６２、およびフレームバッファ６４は、図７に関して説明された機能と同様の機能を実行することができる。
【０２６６】
[0249]図１０Ａ〜図１０Ｃは、本開示で説明される１つまたは複数の技法による、例示的な結果を示す概念図である。図１０Ａ〜図１０Ｃの例では、アプリケーション４２によって生成される単一の画像の解像度はディスプレイ１２の解像度の半分であり得る。したがって、図１０Ａ〜図１０Ｃでは、左眼画像はディスプレイ１２の半分に現れ、右眼画像はディスプレイ１２の他の半分に現れる。たとえば、図１０Ａは左眼画像６８Ａと右眼画像６８Ｂとを示し、図１０Ｂは左眼画像７０Ａと右眼画像７０Ｂとを示し、図１０Ｃは左眼画像７２Ａと右眼画像７２Ｂとを示す。図１０Ａ〜図１０Ｃでは、閲覧者の左眼は左眼画像のみを見ることができ、右眼画像を見ることができず、閲覧者の右眼は右眼画像のみを見ることができ、左眼画像を見ることができない。
【０２６７】
[0250]図１０Ａは、視線角度が０である（すなわち、横向きモードにある）ときの例示的な結果を示す。図１０Ｂは、閲覧者がデバイス１０を垂直方向に回転して、視線角度が図１０Ａの例に対してメイ９０°になる例を示す。図１０Ｂの例では、９０°だけデバイス１０の閲覧者方向、レンダリングされた画像コンテンツが９０°だけ変化しても、左眼画像７０Ａと右眼画像７０Ｂとの間の視差はそれでも水平な向きにある。したがって、図９Ｃに示されるもののような任意の所与の視線角度に対して、左眼画像７２Ａと右眼画像７２Ｂとの間の視差は依然として水平な向きにある。
【０２６８】
[0251]図１１は、図５の例示的なデバイスをさらに詳細に示すブロック図である。たとえば、図１１は、図５のデバイス１０をさらに詳細に示す。たとえば、上で示されるように、デバイス１０の例は、限定はされないが、モバイルワイヤレス電話、ＰＤＡ、ビデオディスプレイを含むビデオゲーミングコンソール、モバイルビデオ会議ユニット、ラップトップコンピュータ、デスクトップコンピュータ、テレビジョンセットトップボックスなどを含む。
【０２６９】
[0252]図１１に示されるように、デバイス１０は、ディスプレイ１２と、アプリケーションプロセッサ２２と、ＧＰＵ  ３０と、フレームバッファ６４を含むシステムメモリ３６と、カメラプロセッサ４４と、送受信機モジュール７４と、ユーザインターフェース７６と、ディスプレイプロセッサ７８と、カメラ８０とを含み得る。ディスプレイ１２、アプリケーションプロセッサ２２、ＧＰＵ  ３０、システムメモリ３６、１つまたは複数のセンサ４２、およびカメラプロセッサ４４は、図１および図５に示されるものと実質的に同様または同一であり得る。簡潔のために、図１１には示されるが図１および図５には示されていないコンポーネントのみが、詳細に説明される。
【０２７０】
[0253]デバイス１０は、図１１に示されるように、明快のために図１１に示されていない追加のモジュールまたはユニットを含み得る。たとえば、デバイス１０は、デバイス１０がモバイルワイヤレス電話である例において電話通信を実現するために、そのいずれもが図１１に示されていないスピーカーおよびマイクロフォンを含んでよく、またはデバイス１０がメディアプレーヤである場合にスピーカーを含んでよい。さらに、デバイス１０に示される様々なモジュールおよびユニットは、デバイス１０のすべての例において必要であるとは限らない。たとえば、ユーザインターフェース７６およびディスプレイ１２は、デバイス１０がデスクトップコンピュータ、または外部ユーザインターフェースもしくはディスプレイとインターフェースするように備えられた他のデバイスである例において、デバイス１０の外部にあってよい。
【０２７１】
[0254]カメラ８０は、ビデオまたは画像を撮影するように構成された前面光学カメラであり得る。カメラ８０は、撮影されたビデオまたは画像をカメラプロセッサ４４に出力することができる。カメラプロセッサ４４は、上で説明されたような撮影されたビデオまたは画像に基づいて閲覧者の方向を決定することができる。
【０２７２】
[0255]ユーザインターフェース７６の例は、限定はされないが、トラックボール、マウス、キーボード、および他のタイプの入力デバイスを含む。ユーザインターフェース７６はまた、タッチスクリーンであってよく、ディスプレイ１２の一部として組み込まれ得る。送受信機モジュール７４は、デバイス１０と別のデバイスまたはネットワークとの間のワイヤレス通信または有線通信を可能にするための回路を含み得る。送受信機モジュール７４は、有線通信またはワイヤレス通信のための１つまたは複数の変調器と、復調器と、増幅器と、アンテナと、他のそのような回路とを含み得る。
【０２７３】
[0256]ディスプレイプロセッサ７８は、ディスプレイ１２に立体視ビューを表示させるように構成され得る。ディスプレイ１２に、立体ビューを表示させるためにディスプレイプロセッサ７８が利用することができる様々な技法があってよく、本開示の態様は、これらの技法のうちいずれをも利用することができる。たとえば、ディスプレイプロセッサ７８は、立体視ビューを与えるために、フレームバッファ６４の一方の半分から左眼画像を取り出し、フレームバッファ６４の他方の半分から右眼画像を取り出し、２つの画像を一緒に交互配置することができる。
【０２７４】
[0257]別の例として、ディスプレイプロセッサ７８は、ディスプレイ１２のリフレッシュレートを制御することができる。この例では、各リフレッシュサイクル中に、ディスプレイプロセッサ７８は、左眼画像と右眼画像との間で循環することができる。たとえば、ディスプレイプロセッサ７８は、フレームバッファ６４の一方の半分から左眼画像を取り出し、ディスプレイ１２の全体に左眼画像を拡張し、１つのリフレッシュサイクルの間ディスプレイ１２に左眼画像を表示することができる。次いで、次のリフレッシュサイクルの間、ディスプレイプロセッサ７８は、フレームバッファ６４の他方の半分に記憶された右眼画像に対してではあるが、実質的に同様の機能を実行することができる。言い換えると、ディスプレイ１２は、左眼画像を表示し、次いで右眼画像を表示し、次いで左眼画像を表示することができ、以下同様である。
【０２７５】
[0258]閲覧者は、ディスプレイプロセッサ７８のリフレッシュレートと同期する特殊な眼鏡を着用していることがある。たとえば、ディスプレイ１２が左眼画像を表示している間、特殊な眼鏡は、閲覧者の左眼のみが左眼画像を捉えるように、右レンズのシャッターを閉じることができる。次いで、ディスプレイ１２が右眼画像を表示している間、特殊な眼鏡は、閲覧者の右眼のみが右眼画像を捉えるように、左レンズのシャッターを閉じることができ、以下同様である。リフレッシュレートが十分に高速である場合、閲覧者は、画像がディスプレイ１２から飛び出し、またはディスプレイに押し込まれて、３Ｄボリュームを取り囲む、立体視ビューを知覚する。
【０２７６】
[0259]いくつかの例では、いくつかの従来のディスプレイプロセッサは、ディスプレイ１２に立体視ビューを表示させるように構成されなくてもよい。これらの例では、閲覧者は、デバイス１０を、ディスプレイ１２に立体視ビューを提示させるように構成された、ディスプレイプロセッサ７８のようなディスプレイプロセッサを含むディスプレイに結合し得る。たとえば、閲覧者は、デバイス１０を、送受信機モジュール７４を介して立体視ビュー対応テレビジョンに結合し得る。たとえば、閲覧者は、送受信機モジュール７４を、高解像度マルチメディアインターフェース（ＨＤＭＩ（登録商標））配線を介してテレビジョンに結合し得る。この例では、アプリケーションプロセッサ２２またはＧＰＵ  ３０は、送受信機モジュール７４に、フレームバッファ６４に記憶されたピクセル値をテレビジョンのディスプレイプロセッサへ送信するように命令し得る。次いで、このテレビジョンのディスプレイプロセッサは、テレビジョンに、立体視ビューを形成するように左眼画像と右眼画像とを表示させ得る。
【０２７７】
[0260]図１２は、本開示で説明される１つまたは複数の例示的な技法による例示的な動作を示すフローチャートである。説明のために、図３への参照を行う。
【０２７８】
[0261]プロセッサ２２は、モノビューのための画像を生成するためにアプリケーション４２を実行することができる（８２）。プロセッサ２２は、アプリケーション４２のランタイム中に、図１２の他のブロックを実施することができる。たとえば、プロセッサ２２は、ディスプレイ１２に対する視線角度を決定することができる。いくつかの例では、プロセッサ２２は、立体視ビューの生成ごとに１回、ディスプレイ１２に対する視線角度を決定することができる。視線角度を決定するために、プロセッサ２２は、たとえばカメラプロセッサ４４によって少なくとも１つの閲覧者の方向を決定し、たとえば１つまたは複数のセンサ４２によってディスプレイの方向を決定することができる。
【０２７９】
[0262]プロセッサ２２は、グラフィックスドライバラッパー２６を介して、頂点シェーダ３８のための命令を受け取ることができる（８４）。頂点シェーダ３８は、アプリケーション４２の実行によって生成されたモノビューの画像に対して動作するように構成され得る。
【０２８０】
[0263]プロセッサ２２は、グラフィックスドライバラッパー２６を介して、修正された頂点シェーダ（たとえば、命令の包含の後にコンパイラ２８が頂点シェーダ３８をコンパイルした後の修正された頂点シェーダ４０）を生成するために、視線角度に基づく１つまたは複数の命令を含めるように頂点シェーダの命令を修正することができる（８６）。この例では、修正された頂点シェーダ４０は、ＧＰＵ  ３０のシェーダプロセッサ３２で実行されるとき、立体視ビューの頂点の頂点座標を生成することができる。
【０２８１】
[0264]たとえば、プロセッサ２２は、グラフィックスドライバラッパー２６を介して、アプリケーション４２によって生成されたモノビューの画像の頂点の第１のクリッピング座標（たとえば、ｘclip）を視線角度に基づいて修正する第１の命令を、頂点シェーダ３８に追加することができる。たとえば、グラフィックスドライバラッパー２６は、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝Ｘというコマンドを追加することができ、ここでＸは、修正された頂点シェーダ４０の１回目の実行ではＤ＊ｃｏｓ（α）に等しく、修正された頂点シェーダ４０の２回目の実行では−Ｄ＊ｃｏｓ（α）に等しい。プロセッサ２２は、グラフィックスドライバラッパー２６を介して、アプリケーション４２によって生成されたモノビューの画像の頂点の第２のクリッピング座標（たとえば、ｙclip）を視線角度に基づいて修正する第２の命令を、頂点シェーダ３８に追加することができる。たとえば、グラフィックスドライバラッパー２６は、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｙ＋＝Ｙ＊幅／高さを追加することができ、ここで幅および高さはディスプレイ１２の幅および高さであり、Ｙは、修正された頂点シェーダ４０の１回目の実行ではＤ＊ｓｉｎ（α）に等しく、修正された頂点シェーダ４０の２回目の実行では−Ｄ＊ｓｉｎ（α）に等しい。
【０２８２】
[0265]いくつかの例では、選択肢として、グラフィックスドライバラッパー２６が追加する第１の命令および第２の命令は、ゼロ視差平面の位置にも基づき得る。たとえば、グラフィックスドライバラッパー２６は、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝Ｘ＊（１−ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｗ／ＺＤＰloc）を追加することができ、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｙ＋＝Ｙ＊幅／高さ＊（１−ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｗ／ＺＤＰloc）を追加することができる。ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｗ変数は、−ｚworldに等しいｗclip座標を記憶し、ｚworldはアプリケーション４２によって定義されるような頂点のｚ座標である。ＺＤＰlocは、ディスプレイ１２に対するゼロ視差平面の位置を示す。
【０２８３】
[0266]選択肢として、プロセッサ２２は、グラフィックスドライバラッパー２６を介して、アプリケーション４２によって発行されるビューポートコマンド（たとえば、ｇｌＶｉｅｗｐｏｒｔ）を修正することができる（９０）。ビューポートコマンドのこの修正は任意選択であり得るので、点線で示される。プロセッサ２２は、グラフィックスドライバラッパー２６を介して、立体視ビューの第１の画像と第２の画像との間の水平視差（たとえば、左眼画像と右眼画像との間の水平視差）を調整するために、ｇｌＶｉｅｗｐｏｒｔコマンドを修正することができる。水平視差を調整することによって、グラフィックスドライバラッパー２６は、ゼロ視差平面の位置を調整するために、修正されたｇｌＶｉｅｗｐｏｒｔコマンドを利用することができる。
【０２８４】
[0267]プロセッサ２２は、グラフィックスドライバラッパー２６を介して、修正された頂点シェーダ４０を実行するようにＧＰＵ  ３０に命令することができる（９２）。たとえば、プロセッサ２２は、グラフィックスドライバラッパー２６を介して、視線角度に基づいて立体視ビューの第１の画像（たとえば、左眼画像）を生成するために、シェーダプロセッサ３２上で修正された頂点シェーダ４０のオブジェクトコードの第１のインスタンスを実行するように、ＧＰＵ  ３０に命令することができる。プロセッサ２２は、グラフィックスドライバラッパー２６を介して、視線角度に基づいて立体視ビューの第２の画像（たとえば、右眼画像）を生成するために、シェーダプロセッサ３２上で修正された頂点シェーダ４０のオブジェクトコードの第２のインスタンスを実行するように、ＧＰＵ  ３０に命令することができる。
【０２８５】
[0268]以下の擬似コードは、グラフィックスドライバラッパー２６およびアプリケーション４２の機能の例を与える。この擬似コードは、理解を助けることが意図されており、限定的と見なされるべきではない。
【０２８６】
１．グラフィックスドライバラッパー２６が、頂点シェーダ２８のソースコードを途中で捕えるために、アプリケーション４２によって発行されたｇｌＳｈａｄｅｒＳｏｕｒｃｅを途中で捕える。
【０２８７】
２．グラフィックスドライバラッパー２６が、「ｕｎｉｆｏｒｍ  ｆｌｏａｔ  Ｘ」と「ｕｎｉｆｏｒｍ  ｆｌｏａｔ  Ｙ」とを頂点シェーダ３８の命令に挿入し、ここで、「ｕｎｉｆｏｒｍ」はプログラマブルシェーダに関して、ＯｐｅｎＧＬおよびＯｐｅｎＧＬ  ＥＳにおいてユーザにより定義される標準的な属性変数である。
【０２８８】
３．グラフィックスドライバラッパー２６が、頂点シェーダ３８のソースコードに、「ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝Ｘ」および「ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝Ｙ＊幅／高さ」コマンドを挿入する。
【０２８９】
３ａ．グラフィックスドライバラッパー２６が、「ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝Ｘ＊（１−ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｗ／ＺＤＰloc）」および「ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｙ＋＝Ｙ＊幅／高さ＊（１−ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｗ／ＺＤＰloc）」を挿入する。
【０２９０】
４．アプリケーション４２が、修正された頂点シェーダ４０のオブジェクトコードを生成するように、コンパイラ２８に、頂点シェーダ３８の修正されたソースコード命令をコンパイルさせる、ｇｌＣｏｍｐｉｌｅＳｈａｄｅｒコマンドを実行する。
【０２９１】
５．アプリケーション４２が、修正された頂点シェーダ４０のオブジェクトコードへのリンクに対して次のコマンドを実行する。
【０２９２】
ｐｒｏｇｒａｍＯｂｊｅｃｔ＝ｇｌＣｒｅａｔｅＰｒｏｇｒａｍ（）；
ｇｌＡｔｔａｃｈＳｈａｄｅｒ（ｐｒｏｇｒａｍＯｂｊｅｃｔ、ｖｅｒｔｅｘＳｈａｄｅｒ）；
ｇｌＡｔｔａｃｈＳｈａｄｅｒ（ｐｒｏｇｒａｍＯｂｊｅｃｔ、ｆｒａｇｍｅｎｔＳｈａｄｅｒ）；
ｇｌＬｉｎｋＰｒｏｇｒａｍ（ｐｒｏｇｒａｍＯｂｊｅｃｔ）
６．グラフィックスドライバラッパー２６が、アプリケーション４２によって呼び出されるときにｇｌＤｒａｗコマンド（たとえば、ｇｌＤｒａｗＡｒｒａｙｓおよびｇｌＤｒａｗＥｌｅｍｅｎｔｓ）を途中で捕え、コマンドがＧＰＵ  ３０に送信されるのを阻止する。
【０２９３】
７．グラフィックスドライバラッパー２６が次のコマンドを発行する：
ｇｌＧｅｔＩｎｔｅｇｅｒ（ＧＬ＿ＣＵＲＲＥＮＴ＿ＰＲＯＧＲＡＭ、＆ｐｒｏｇｒａｍ）；／／現在の頂点シェーダに対するポインタを得るため
いくつかの例では、上で説明されたように左眼画像のためのビューポートを生成するように、ｇｌＶｉｅｗｐｏｒｔコマンドを修正する。
【０２９４】
ｐ１＝ｇｌＧｅｔＵｎｉｆｏｒｍＬｏｃａｔｉｏｎ（ｐｒｏｇｒａｍ、Ｘ）；ｕｎｉｆｏｒｍ  Ｘに対するポインタを得るため
ｐ２＝ｇｌＧｅｔＵｎｉｆｏｒｍＬｏｃａｔｉｏｎ（ｐｒｏｇｒａｍ、Ｙ）；ｕｎｉｆｏｒｍ  Ｙに対するポインタを得るため
ｇｌＵｎｉｆｏｒｍ１ｆ（ｐ１、Ｄ＊ｃｏｓ（α））；／／Ｄ＊ｃｏｓ（α）に等しくＸの値を設定するため
ｇｌＵｎｉｆｏｒｍ１ｆ（ｐ２、Ｄ＊ｓｉｎ（α））；／／Ｄ＊ｓｉｎ（α）に等しくＹの値を設定するため
ｇｌＤｒａｗコマンド／／ＧＰＵ  ３０に左眼画像のためのグラフィックスコンテンツを生成させるため
８．右眼画像のためのグラフィックスコンテンツを生成するための次の修正を伴って、７から続くステップを繰り返す：
上で説明されたように右眼画像のためのビューポートを生成するように、ｇｌＶｉｅｗｐｏｒｔコマンドを修正する。
【０２９５】
ｇｌＵｎｉｆｏｒｍ１ｆ（ｐ１、−Ｄ＊ｃｏｓ（α））；／／−Ｄ＊ｃｏｓ（α）に等しくＸの値を設定するため
ｇｌＵｎｉｆｏｒｍ１ｆ（ｐ２、−Ｄ＊ｓｉｎ（α））；／／−Ｄ＊ｓｉｎ（α）に等しくＹの値を設定するため
ｇｌＤｒａｗコマンド／／ＧＰＵ  ３０に右眼画像のためのグラフィックスコンテンツを生成させるため
[0269]１つまたは複数の例では、説明された機能は、ハードウェア、ソフトウェア、ファームウェア、またはそれらの任意の組合せで実装され得る。ソフトウェアで実装される場合、機能は、１つまたは複数の命令またはコードとしてコンピュータ可読媒体上に記憶され得る。コンピュータ可読媒体はコンピュータデータ記憶媒体を含み得る。データ記憶媒体は、本開示で説明された技法を実装するための命令、コードおよび／またはデータ構造を取り出すために、１つもしくは複数のコンピュータ、または１つもしくは複数のプロセッサによってアクセスされ得る任意の利用可能な媒体であり得る。限定ではなく、例として、そのようなコンピュータ可読媒体は、ランダムアクセスメモリ（ＲＡＭ）、読取り専用メモリ（ＲＯＭ）、ＥＥＰＲＯＭ、ＣＤ−ＲＯＭもしくは他の光ディスクストレージ、磁気ディスクストレージもしくは他の磁気ストレージデバイス、または命令もしくはデータ構造の形態の所望のプログラムコードを記憶するために使用されコンピュータによってアクセスされ得る、任意の他の媒体を備え得る。本明細書で使用されるディスク（disk）およびディスク（disc）は、コンパクトディスク（disc）（ＣＤ）、レーザーディスク（登録商標）（disc）、光ディスク（disc）、デジタル多用途ディスク（disc）（ＤＶＤ）、フロッピー（登録商標）ディスク（disk）およびＢｌｕ−ｒａｙ（登録商標）ディスク（disc）を含み、ディスク（disk）は、通常、データを磁気的に再生し、ディスク（disc）は、データをレーザーで光学的に再生する。上記の組合せもコンピュータ可読媒体の範囲内に含まれるべきである。
【０２９６】
[0270]コードは、１つもしくは複数のデジタル信号プロセッサ（ＤＳＰ）などの１つもしくは複数のプロセッサ、汎用マイクロプロセッサ、特定用途向け集積回路（ＡＳＩＣ）、フィールドプログラマブル論理アレイ（ＦＰＧＡ）、または他の等価な集積回路もしくはディスクリート論理回路によって実行され得る。したがって、本明細書で使用される「プロセッサ」という用語は、前述の構造、または本明細書で説明される技法の実装に好適な任意の他の構造のいずれかを指し得る。また、本技法は、１つまたは複数の回路または論理要素中で完全に実装され得る。
【０２９７】
[0271]本開示の技法は、ワイヤレスハンドセット、集積回路（ＩＣ）、またはＩＣのセット（すなわち、チップセット）を含む、多種多様なデバイスまたは装置において実装され得る。本開示では、開示されている技法を実行するように構成されたデバイスの機能的態様を強調するために様々なコンポーネント、モジュール、またはユニットが説明されるが、それらのコンポーネント、モジュール、またはユニットは、必ずしも異なるハードウェアユニットによる実現を必要とするとは限らない。むしろ、上で説明されたように、様々なユニットが、好適なソフトウェアおよび／またはファームウェアとともに、上で説明された１つまたは複数のプロセッサを含めて、ハードウェアユニットにおいて組み合わせられるか、または相互動作ハードウェアユニットの集合によって与えられ得る。
【０２９８】
[0272]様々な例が説明されてきた。これら例および他の例は、以下の特許請求の範囲内にある。
【図１】
2016509298.tif 000037
【図２】
2016509298.tif 000038
【図３】
2016509298.tif 000039
【図４】
2016509298.tif 000040
【図５】
2016509298.tif 000041
【図６】
2016509298.tif 000042
【図７】
2016509298.tif 000043
【図８】
2016509298.tif 000044
【図９】
2016509298.tif 000045
【図１０Ａ】
2016509298.tif 000046
【図１０Ｂ】
2016509298.tif 000047
【図１０Ｃ】
2016509298.tif 000048
【図１１】
2016509298.tif 000049
【図１２】
2016509298.tif 000050
【国際調査報告】
2016509298.tif 000051
2016509298.tif 000052
2016509298.tif 000053