(57)【特許請求の範囲】
【請求項１】
プロセッサを用いて、モノビューの画像を生成するように構成されており、グラフィックス処理ユニット（ＧＰＵ）のシェーダプロセッサ上で実行されるべき頂点シェーダに対する命令を受信することと、
前記プロセッサを用いて、前記頂点シェーダの前記命令を、前記頂点シェーダが前記ＧＰＵの前記シェーダプロセッサ上で実行されると前記頂点シェーダに、前記頂点シェーダの第１の実行の後に立体ビューの第１の画像用のグラフィックスコンテンツを生成させるとともに、前記頂点シェーダの第２の実行の後に前記立体ビューの第２の画像用のグラフィックスコンテンツを生成させる１つまたは複数の命令を含むように修正することと、
前記プロセッサを用いて、前記モノビューの前記画像用のビューポートを定義するコマンドを、前記第１の画像用のビューポートを定義する、前記シェーダプロセッサとは異なる前記ＧＰＵの固定機能ユニット向けの第１のコマンド、および前記第２の画像用のビューポートを定義する、前記ＧＰＵの前記固定機能ユニット向けの第２のコマンドに修正することとを備える方法。
【請求項２】
前記ＧＰＵの前記シェーダプロセッサを用いて、前記頂点シェーダの前記修正された命令のオブジェクトコードを実行することと、
前記ＧＰＵの前記固定機能ユニットを用いて、前記第１の画像用の前記ビューポートを定義する前記第１のコマンド、および前記第２の画像用の前記ビューポートを定義する前記第２のコマンドを実行することとをさらに備える、請求項１に記載の方法。
【請求項３】
前記画像用の前記ビューポートを定義する前記コマンドを、前記第１のコマンドが前記第１の画像をディスプレイの第１の部分に制限するように構成され、前記第２のコマンドが前記第２の画像を前記ディスプレイの第２の部分に制限するように構成されるように修正する、請求項１に記載の方法。
【請求項４】
前記画像用の前記ビューポートを定義する前記コマンドを修正することが、前記第１の画像用の前記ビューポートをシフトし、またはシフトおよびストレッチすることと、前記第２の画像用の前記ビューポートをシフトし、またはシフトおよびストレッチすることとをさらに備える、請求項１に記載の方法。
【請求項５】
前記画像用の前記ビューポートを定義する前記コマンドを修正することが、ｇｌＶｉｅｗｐｏｒｔ（０，０，ｗｉｄｔｈ，ｌｅｎｇｔｈ）コマンドを、ｇｌＶｉｅｗｐｏｒｔ（０，０，ｗｉｄｔｈ／２，ｌｅｎｇｔｈ）コマンドを備える前記第１のコマンド、およびｇｌＶｉｅｗｐｏｒｔ（ｗｉｄｔｈ／２，０，ｗｉｄｔｈ／２，ｌｅｎｇｔｈ）コマンドを備える前記第２のコマンドに修正することを備え、ｗｉｄｔｈがディスプレイの幅に等しく、ｌｅｎｇｔｈが前記ディスプレイの長さに等しい、請求項１に記載の方法。
【請求項６】
前記画像用の前記ビューポートを定義する前記コマンドを修正することが、ｇｌＶｉｅｗｐｏｒｔ（０，０，ｗｉｄｔｈ，ｌｅｎｇｔｈ）コマンドを、ｇｌＶｉｅｗｐｏｒｔ（０−Ｖｐｓ，０，ｗｉｄｔｈ／２，ｌｅｎｇｔｈ）コマンドまたはｇｌＶｉｅｗｐｏｒｔ（０−Ｖｐｓ，０，ｗｉｄｔｈ／２＋Ｖｐｓ，ｌｅｎｇｔｈ）コマンドを備える前記第１のコマンド、およびｇｌＶｉｅｗｐｏｒｔ（ｗｉｄｔｈ／２＋Ｖｐｓ，０，ｗｉｄｔｈ／２，ｌｅｎｇｔｈ）コマンドまたはｇｌＶｉｅｗｐｏｒｔ（ｗｉｄｔｈ／２，０，ｗｉｄｔｈ／２＋Ｖｐｓ，ｌｅｎｇｔｈ）コマンドを備える前記第２のコマンドに修正することを備え、ｗｉｄｔｈがディスプレイの幅に等しく、ｌｅｎｇｔｈが前記ディスプレイの長さに等しく、Ｖｐｓが、前記立体ビューが前記ディスプレイからポップアウトまたは前記ディスプレイにプッシュインする量を定義する、請求項１に記載の方法。
【請求項７】
前記固定機能ユニットが、前記ＧＰＵの固定機能パイプラインのビューポート変換ユニットを備える、請求項１に記載の方法。
【請求項８】
前記頂点シェーダの命令を受信することが、前記プロセッサ上で実行するグラフィックスドライバラッパーを用いて前記頂点シェーダの前記命令を受信することを備え、前記頂点シェーダの前記命令を修正することが、前記プロセッサ上で実行する前記グラフィックスドライバラッパーを用いて前記頂点シェーダの前記命令を修正することを備え、前記ビューポートを定義する前記コマンドを修正することが、前記プロセッサ上で実行する前記グラフィックスドライバラッパーを用いて、前記ビューポートを定義する前記コマンドを修正することを備える、請求項１に記載の方法。
【請求項９】
前記頂点シェーダの前記命令を修正することが、前記モノビューの前記画像についての少なくとも１つのクリッピング座標を修正する命令を前記頂点シェーダに追加することを備える、請求項１に記載の方法。
【請求項１０】
少なくとも１つのクリッピング座標を修正する前記命令を前記頂点シェーダに追加することが、前記少なくとも１つのクリッピング座標を記憶する変数を更新する命令を前記頂点シェーダに追加することを備える、請求項９に記載の方法。
【請求項１１】
前記少なくとも１つのクリッピング座標を記憶する前記変数を更新する前記命令を前記頂点シェーダに追加することが、前記第１の実行において前記少なくとも１つのクリッピング座標に定数値を加算するための命令を追加することと、前記第２の実行において前記少なくとも１つのクリッピング座標から前記定数値を減算するための命令を追加することとを備える、請求項１０に記載の方法。
【請求項１２】
前記モノビューの前記画像についての前記少なくとも１つのクリッピング座標を修正する前記命令を前記頂点シェーダに追加することが、ｇｌ．Ｐｏｓｉｔｉｏｎ．ｘ＋＝Ｘコマンドを追加することを備え、Ｘが、前記第１の実行では＋Ｄに、および前記第２の実行では−Ｄに等しく、Ｄが、閲覧者の左目と右目との間の距離の半分の推定値に等しい、請求項１０に記載の方法。
【請求項１３】
前記頂点シェーダの前記命令を１つまたは複数の命令を含むように修正することが、前記モノビューの前記画像についての１つのクリッピング座標を修正する命令を前記頂点シェーダに追加することのみを備える、請求項１に記載の方法。
【請求項１４】
シェーダプロセッサ、および固定機能パイプラインの、前記シェーダプロセッサとは異なる固定機能ユニットを含むグラフィックス処理ユニット（ＧＰＵ）と、
プロセッサとを備え、前記プロセッサが、
モノビューの画像を生成するように構成されており、前記ＧＰＵの前記シェーダプロセッサ上で実行されるべき頂点シェーダについての命令を受信し、
前記頂点シェーダの前記命令を、前記頂点シェーダが前記ＧＰＵの前記シェーダプロセッサ上で実行されると前記頂点シェーダに、前記頂点シェーダの第１の実行の後に立体ビューの第１の画像用のグラフィックスコンテンツを生成させるとともに、前記頂点シェーダの第２の実行の後に前記立体ビューの第２の画像用のグラフィックスコンテンツを生成させる１つまたは複数の命令を含むように修正し、
前記モノビューの前記画像用のビューポートを定義するコマンドを、前記第１の画像用のビューポートを定義する、前記シェーダプロセッサとは異なる前記ＧＰＵの前記固定機能ユニット向けの第１のコマンドと、前記第２の画像用のビューポートを定義する、前記ＧＰＵの前記固定機能ユニット向けの第２のコマンドとに修正するように動作可能である、装置。
【請求項１５】
前記ＧＰＵの前記シェーダプロセッサが、前記頂点シェーダの前記修正された命令のオブジェクトコードを実行するように構成され、前記ＧＰＵの前記固定機能ユニットが、前記第１の画像用の前記ビューポートを定義する前記第１のコマンドと、前記第２の画像用の前記ビューポートを定義する前記第２のコマンドとを実行するように構成される、請求項１４に記載の装置。
【請求項１６】
前記プロセッサが、前記画像用の前記ビューポートを定義する前記コマンドを、前記第１のコマンドが前記第１の画像をディスプレイの第１の部分に制限するように構成され、前記第２のコマンドが前記第２の画像を前記ディスプレイの第２の部分に制限するように構成されるように修正するように動作可能である、請求項１４に記載の装置。
【請求項１７】
前記プロセッサが、前記画像用の前記ビューポートを定義する前記コマンドを、前記第１の画像用の前記ビューポートをシフトし、またはシフトおよびストレッチし、前記第２の画像用の前記ビューポートをシフトし、またはシフトおよびストレッチするように修正するようにさらに動作可能である、請求項１４に記載の装置。
【請求項１８】
前記画像用の前記ビューポートを定義する前記コマンドを修正するために、前記プロセッサが、ｇｌＶｉｅｗｐｏｒｔ（０，０，ｗｉｄｔｈ，ｌｅｎｇｔｈ）コマンドを、ｇｌＶｉｅｗｐｏｒｔ（０，０，ｗｉｄｔｈ／２，ｌｅｎｇｔｈ）コマンドを備える前記第１のコマンド、およびｇｌＶｉｅｗｐｏｒｔ（ｗｉｄｔｈ／２，０，ｗｉｄｔｈ／２，ｌｅｎｇｔｈ）コマンドを備える前記第２のコマンドに修正するように動作可能であり、ｗｉｄｔｈがディスプレイの幅に等しく、ｌｅｎｇｔｈが前記ディスプレイの長さに等しい、請求項１４に記載の装置。
【請求項１９】
前記画像用の前記ビューポートを定義する前記コマンドを修正するために、前記プロセッサが、ｇｌＶｉｅｗｐｏｒｔ（０，０，ｗｉｄｔｈ，ｌｅｎｇｔｈ）コマンドを、ｇｌＶｉｅｗｐｏｒｔ（０−Ｖｐｓ，０，ｗｉｄｔｈ／２，ｌｅｎｇｔｈ）コマンドまたはｇｌＶｉｅｗｐｏｒｔ（０−Ｖｐｓ，０，ｗｉｄｔｈ／２＋Ｖｐｓ，ｌｅｎｇｔｈ）コマンドを備える前記第１のコマンド、およびｇｌＶｉｅｗｐｏｒｔ（ｗｉｄｔｈ／２＋Ｖｐｓ，０，ｗｉｄｔｈ／２，ｌｅｎｇｔｈ）コマンドまたはｇｌＶｉｅｗｐｏｒｔ（ｗｉｄｔｈ／２，０，ｗｉｄｔｈ／２＋Ｖｐｓ，ｌｅｎｇｔｈ）コマンドを備える前記第２のコマンドに修正するように動作可能であり、ｗｉｄｔｈがディスプレイの幅に等しく、ｌｅｎｇｔｈが前記ディスプレイの長さに等しく、Ｖｐｓが、前記立体ビューが前記ディスプレイからポップアウトする量を定義する、請求項１４に記載の装置。
【請求項２０】
前記固定機能ユニットがビューポート変換ユニットを備える、請求項１４に記載の装置。
【請求項２１】
前記プロセッサが、グラフィックスドライバラッパーを実行して、頂点シェーダに対する命令を受信し、前記頂点シェーダの前記命令を修正し、前記画像用のビューポートを定義する前記コマンドを修正するように動作可能である、請求項１４に記載の装置。
【請求項２２】
前記頂点シェーダの前記命令を修正するために、前記プロセッサが、前記モノビューの前記画像についての少なくとも１つのクリッピング座標を修正する命令を前記頂点シェーダに追加するように動作可能である、請求項１４に記載の装置。
【請求項２３】
少なくとも１つのクリッピング座標を修正する前記命令を前記頂点シェーダに追加するために、前記プロセッサが、前記少なくとも１つのクリッピング座標を記憶する変数を更新する命令を前記頂点シェーダに追加するように動作可能である、請求項２２に記載の装置。
【請求項２４】
前記少なくとも１つのクリッピング座標を記憶する前記変数を更新する前記命令を前記頂点シェーダに追加するために、前記プロセッサが、前記第１の実行において前記少なくとも１つのクリッピング座標に定数値を加算するための命令を追加し、前記第２の実行において前記少なくとも１つのクリッピング座標から前記定数値を減算するための命令を追加するように動作可能である、請求項２３に記載の装置。
【請求項２５】
前記モノビューの前記画像についての前記少なくとも１つのクリッピング座標を修正する前記命令を前記頂点シェーダに追加するために、前記プロセッサが、ｇｌ．Ｐｏｓｉｔｉｏｎ．ｘ＋＝Ｘコマンドを追加するように動作可能であり、Ｘが、前記第１の実行では＋Ｄに、および前記第２の実行では−Ｄに等しく、Ｄが、閲覧者の左目と右目との間の距離の半分の推定値に等しい、請求項２３に記載の装置。
【請求項２６】
前記頂点シェーダの前記命令を、１つまたは複数の命令を含むように修正するために、前記プロセッサが、前記モノビューの前記画像についての１つのクリッピング座標を修正する命令を前記頂点シェーダに追加するようにのみ動作可能である、請求項１４に記載の装置。
【請求項２７】
シェーダプロセッサ、および固定機能パイプラインの、前記シェーダプロセッサとは異なる固定機能ユニットを含むグラフィックス処理ユニット（ＧＰＵ）と、
プロセッサとを備え、前記プロセッサが、
モノビューの画像を生成するように構成されており、前記ＧＰＵの前記シェーダプロセッサ上で実行されるべき頂点シェーダについての命令を受信するための手段と、
前記頂点シェーダの前記命令を、前記頂点シェーダが前記ＧＰＵの前記シェーダプロセッサ上で実行されると前記頂点シェーダに、前記頂点シェーダの第１の実行の後に立体ビューの第１の画像用のグラフィックスコンテンツを生成させるとともに、前記頂点シェーダの第２の実行の後に前記立体ビューの第２の画像用のグラフィックスコンテンツを生成させる１つまたは複数の命令を含むように修正するための手段と、
前記モノビューの前記画像用のビューポートを定義するコマンドを、前記第１の画像用のビューポートを定義する、前記シェーダプロセッサとは異なる前記ＧＰＵの固定機能ユニット向けの第１のコマンド、および前記第２の画像用のビューポートを定義する、前記ＧＰＵの前記固定機能ユニット向けの第２のコマンドに修正するための手段とを含む、装置。
【請求項２８】
前記ＧＰＵの前記シェーダプロセッサが、前記頂点シェーダの前記修正された命令のオブジェクトコードを実行するように構成され、前記ＧＰＵの前記固定機能ユニットが、前記第１の画像用の前記ビューポートを定義する前記第１のコマンドと、前記第２の画像用の前記ビューポートを定義する前記第２のコマンドとを実行するように構成される、請求項２７に記載の装置。
【請求項２９】
前記画像用の前記ビューポートを定義する前記コマンドを修正するための手段が、前記第１のコマンドが前記第１の画像をディスプレイの第１の部分に制限するように構成され、前記第２のコマンドが前記第２の画像を前記ディスプレイの第２の部分に制限するように構成されるように、前記コマンドを修正するための手段を備える、請求項２７に記載の装置。
【請求項３０】
前記画像用の前記ビューポートを定義する前記コマンドを修正するための手段が、前記第１の画像用の前記ビューポートをシフトし、またはシフトおよびストレッチするための手段と、前記第２の画像用の前記ビューポートをシフトし、またはシフトおよびストレッチするための手段とをさらに備える、請求項２７に記載の装置。
【請求項３１】
前記頂点シェーダの前記命令を修正するための手段が、前記モノビューの前記画像についての少なくとも１つのクリッピング座標を修正する命令を前記頂点シェーダに追加するための手段を備える、請求項２７に記載の装置。
【請求項３２】
前記頂点シェーダの前記命令を１つまたは複数の命令を含むように修正するための手段が、前記モノビューの前記画像についての１つのクリッピング座標を修正する命令を前記頂点シェーダに追加するためだけの手段を備える、請求項２７に記載の装置。
【請求項３３】
命令を備える非一時的コンピュータ可読記憶媒体であって、前記命令が、実行されたとき、１つまたは複数のプロセッサに、
モノビューの画像を生成するように設計されており、グラフィックス処理ユニット（ＧＰＵ）のシェーダプロセッサ上で実行されるべき頂点シェーダについての命令を受信させ、
前記頂点シェーダの前記命令を、前記頂点シェーダが前記ＧＰＵの前記シェーダプロセッサ上で実行されると前記頂点シェーダに、前記頂点シェーダの第１の実行の後に立体ビューの第１の画像用のグラフィックスコンテンツを生成させるとともに、前記頂点シェーダの第２の実行の後に前記立体ビューの第２の画像用のグラフィックスコンテンツを生成させる１つまたは複数の命令を含むように修正させ、
前記モノビューの前記画像用のビューポートを定義するコマンドを、前記第１の画像用のビューポートを定義する、前記シェーダプロセッサとは異なる前記ＧＰＵの固定機能ユニット向けの第１のコマンドと、前記第２の画像用のビューポートを定義する、前記ＧＰＵの前記固定機能ユニット向けの第２のコマンドとに修正させる、非一時的コンピュータ可読記憶媒体。
【請求項３４】
前記ＧＰＵの前記シェーダプロセッサを用いて、前記頂点シェーダの前記修正された命令のオブジェクトコードを実行させ、
前記ＧＰＵの前記固定機能ユニットを用いて、前記第１の画像用の前記ビューポートを定義する前記第１のコマンドと、前記第２の画像用の前記ビューポートを定義する前記第２のコマンドとを実行させるための命令をさらに備える、請求項３３に記載の非一時的コンピュータ可読記憶媒体。
【請求項３５】
前記画像用の前記ビューポートを定義する前記コマンドを修正するための前記命令が、前記モノビューの前記画像用の前記ビューポートを定義する前記コマンドを、前記第１の画像をディスプレイの第１の部分に制限する前記第１のコマンドと、前記第２の画像を前記ディスプレイの第２の部分に制限する前記第２のコマンドとに修正するための命令を備える、請求項３３に記載の非一時的コンピュータ可読記憶媒体。
【請求項３６】
前記画像用の前記ビューポートを定義する前記コマンドを修正するための前記命令が、前記第１の画像用の前記ビューポートをシフトし、またはシフトおよびストレッチし、前記第２の画像用の前記ビューポートをシフトし、またはシフトおよびストレッチするための命令をさらに備える、請求項３３に記載の非一時的コンピュータ可読記憶媒体。
【請求項３７】
前記頂点シェーダの前記命令を修正するための前記命令が、前記モノビューの前記画像についての少なくとも１つのクリッピング座標を修正する命令を、前記頂点シェーダに追加するための命令を備える、請求項３３に記載の非一時的コンピュータ可読記憶媒体。
【請求項３８】
前記頂点シェーダの前記命令を、１つまたは複数の命令を含むように修正するための前記命令が、前記モノビューの前記画像についての１つのクリッピング座標を修正する命令を前記頂点シェーダに追加するだけのための命令を備える、請求項３３に記載の非一時的コンピュータ可読記憶媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本出願は、各々の内容がそれぞれの全体において参照により本明細書に組み込まれている、２０１１年３月１４日に出願した米国特許仮出願第６１／４５２，２８９号、および２０１１年４月１２日に出願した米国特許仮出願第６１／４７４，６３８号の利益を主張する。
【０００２】
本開示は、グラフィックスデータ処理に関し、より詳細には、立体ビューのためのグラフィックスデータ処理に関する。
【背景技術】
【０００３】
立体ビューは、３次元（３Ｄ）ボリュームを取り囲むように見える知覚画像を指す。立体ビューを生成するために、デバイスは、ディスプレイの２次元（２Ｄ）エリア上に２つの画像を表示する。これらの２つの画像は、実質的に同様の内容を含むが、２つの画像中の１つまたは複数の対応するピクセルの水平軸に沿ってわずかなずれを有する。これらの２つの画像を、２Ｄエリア上で同時視認することにより、閲覧者は、２つの画像を表示している２Ｄディスプレイからポップアウトし、またはディスプレイにプッシュインした画像を知覚する。このように、２つの画像は、ディスプレイの２Ｄエリア上に表示されるが、閲覧者は、３Ｄボリュームを取り囲むように見える画像を知覚する。
【０００４】
立体ビューの２つの画像は、それぞれ、左目画像および右目画像と呼ばれる。左目画像は、閲覧者の左目には可視であり、右目画像は、閲覧者の左目には可視でない。同様に、右目画像は、閲覧者の右目には可視であり、左目画像は、閲覧者の右目には可視でない。たとえば、閲覧者は特殊眼鏡を装着する場合があり、眼鏡の左レンズは右目画像を遮断し、左目画像を通し、眼鏡の右レンズは左目画像を遮断し、右目画像を通す。
【０００５】
左目画像および右目画像は、水平軸に沿ってわずかなずれのある、実質的に同様の内容を含むが、閲覧者の両目によって同時に可視ではない（たとえば、特殊眼鏡により）ので、閲覧者の脳は、２つの画像を混合させることによって、対応するピクセルの間のわずかなずれを解消する。混合により、閲覧者は、２つの画像を、３Ｄボリュームをもつ画像として知覚する。
【発明の概要】
【０００６】
概して、本開示の技法は、モノビューを生成する命令を、立体ビューを生成するように修正することを対象とする。たとえば、グラフィックス処理ユニット（ＧＰＵ）のシェーダプログラムは、モノビューを生成するように設計することができる。本開示に記載する技法は、このようなシェーダプログラムの命令を修正することができる。たとえば、例示的技法は、シェーダプログラムによって生成された値を修正する命令を追加することができる。本技法は、アプリケーションによって発行された命令を、ＧＰＵにモノビューではなく立体ビュー用の画像を生成させるように修正することもできる。たとえば、本開示に記載する技法は、ビューポートを定義するコマンドを修正することができる。ビューポートは、ディスプレイ上での画像のサイズと場所とを定義し得る。たとえば、修正に先立って、コマンドが、モノビュー用のビューポートを定義し得る。例示的技法は、モノビュー用のビューポートを定義するコマンドを、立体ビューの画像の各々のためのビューポートを定義するように修正することができる。
【０００７】
一例では、本開示は、プロセッサを用いて、モノビューの画像を生成するように構成されておりグラフィックス処理ユニット（ＧＰＵ）のシェーダプロセッサ上で実行されるべき頂点シェーダに対する命令を受信することを含む方法について記載する。この方法は、プロセッサを用いて、頂点シェーダの命令を、頂点シェーダがＧＰＵのシェーダプロセッサ上で実行されると頂点シェーダに、頂点シェーダの第１の実行の後に立体ビューの第１の画像用のグラフィックスコンテンツを、また頂点シェーダの第２の実行の後に立体ビューの第２の画像用のグラフィックスコンテンツを生成させる１つまたは複数の命令を含むように修正することも含む。この方法は、プロセッサを用いて、モノビューの画像用のビューポートを定義するコマンドを、第１の画像用のビューポートを定義する、シェーダプロセッサとは異なる、ＧＰＵの固定機能ユニット向けの第１のコマンドと、第２の画像用のビューポートを定義する、ＧＰＵの固定機能ユニット向けの第２のコマンドとに修正することをさらに含む。
【０００８】
別の例では、本開示は、シェーダプロセッサ、および固定機能パイプラインの、シェーダプロセッサとは異なる固定機能ユニットを含むグラフィックス処理ユニット（ＧＰＵ）と、プロセッサとを含む装置について記載する。プロセッサは、モノビューの画像を生成するように構成されておりＧＰＵのシェーダプロセッサ上で実行されるべき頂点シェーダについての命令を受信するように動作可能である。プロセッサは、頂点シェーダの命令を、頂点シェーダがＧＰＵのシェーダプロセッサ上で実行されると頂点シェーダに、頂点シェーダの第１の実行の後に立体ビューの第１の画像用のグラフィックスコンテンツと、頂点シェーダの第２の実行の後に立体ビューの第２の画像用のグラフィックスコンテンツとを生成させる１つまたは複数の命令を含むように修正するようにも動作可能である。プロセッサは、モノビューの画像用のビューポートを定義するコマンドを、第１の画像用のビューポートを定義する、シェーダプロセッサとは異なる、ＧＰＵの固定機能ユニット向けの第１のコマンドと、第２の画像用のビューポートを定義する、ＧＰＵの固定機能ユニット向けの第２のコマンドとに修正するようにさらに動作可能である。
【０００９】
別の例では、本開示は、シェーダプロセッサ、および固定機能パイプラインの、シェーダプロセッサとは異なる固定機能ユニットを含むグラフィックス処理ユニット（ＧＰＵ）と、プロセッサとを含む装置について記載する。プロセッサは、モノビューの画像を生成するように構成されておりＧＰＵのシェーダプロセッサ上で実行されるべき頂点シェーダについての命令を受信するための手段を含む。プロセッサは、頂点シェーダの命令を、頂点シェーダがＧＰＵのシェーダプロセッサ上で実行されると頂点シェーダに、頂点シェーダの第１の実行の後に立体ビューの第１の画像用のグラフィックスコンテンツと、頂点シェーダの第２の実行の後に立体ビューの第２の画像用のグラフィックスコンテンツとを生成させる１つまたは複数の命令を含むように修正するための手段も含む。プロセッサは、モノビューの画像用のビューポートを定義するコマンドを、第１の画像用のビューポートを定義する、シェーダプロセッサとは異なる、ＧＰＵの固定機能ユニット向けの第１のコマンドと、第２の画像用のビューポートを定義する、ＧＰＵの固定機能ユニット向けの第２のコマンドとに修正するための手段をさらに含む。
【００１０】
別の例では、本開示は、命令を備える非一時的コンピュータ可読記憶媒体について記載する。これらの命令は、実行されると、１つまたは複数のプロセッサに、モノビューの画像を生成するように構成されておりグラフィックス処理ユニット（ＧＰＵ）のシェーダプロセッサ上で実行されるべき頂点シェーダについての命令を受信させる。これらの命令はまた、１つまたは複数のプロセッサに、頂点シェーダの命令を、頂点シェーダがＧＰＵのシェーダプロセッサ上で実行されると頂点シェーダに、頂点シェーダの第１の実行の後に立体ビューの第１の画像用のグラフィックスコンテンツと、頂点シェーダの第２の実行の後に立体ビューの第２の画像用のグラフィックスコンテンツとを生成させる１つまたは複数の命令を含むように修正させる。これらの命令はまた、１つまたは複数のプロセッサに、モノビューの画像用のビューポートを定義するコマンドを、第１の画像用のビューポートを定義する、シェーダプロセッサとは異なる、ＧＰＵの固定機能ユニット向けの第１のコマンドと、第２の画像用のビューポートを定義する、ＧＰＵの固定機能ユニット向けの第２のコマンドとに修正させる。
【００１１】
本開示の１つまたは複数の態様の詳細について添付の図面および以下の説明において述べる。本開示の他の特徴、目的、および利点は、説明および図面、ならびに特許請求の範囲から明らかになろう。
【図面の簡単な説明】
【００１２】
【図１】本開示に記載する１つまたは複数の例示的技法を実装し得るデバイスの例を示すブロック図。
【図２】本開示に記載する１つまたは複数の例示的技法を実装し得るグラフィックス処理ユニット（ＧＰＵ）の例を示すブロック図。
【図３】図１の例示的デバイスをさらに詳しく示すブロック図。
【図４】本開示に記載する１つまたは複数の例示的技法による例示的動作を示すフローチャート。
【発明を実施するための形態】
【００１３】
本開示に記載する例示的技法は、実行またはランタイム中の立体３次元（Ｓ３Ｄ）グラフィックスのレンダリングを対象とする。従来の３Ｄグラフィックスレンダリングでは、グラフィックス処理ユニット（ＧＰＵ）は、３Ｄグラフィックスを、単一視点（たとえば、モノビュー）から生成する。この単一視点は、閲覧者の右目と左目の両方によって可視である単一画像を意味し得る。
【００１４】
Ｓ３Ｄグラフィックスは、Ｓ３Ｄグラフィックスが立体ビューを生成するという点で、３Ｄグラフィックスとは異なる。立体ビューという用語は、双眼視点から生成される画像を指す。双眼視点には、２つの画像があってよく、一方の画像は両目のうち一方には可視であるが他方には可視でなく、その逆も同様である。たとえば、閲覧者が双眼鏡を装着しているとき、双眼鏡の左レンズに入る光は左目には可視であるが、右目には可視でなく、その逆も成り立つ。双眼視点は、立体ビューと呼ばれ得る。
【００１５】
たとえば、Ｓ３Ｄグラフィックスにおいて、ＧＰＵは、左目用の画像、および右目用の別の画像、すなわち、立体ビューを生成することができる。立体ビューという用語は、ディスプレイ上に各々が表示される２つの画像（たとえば、左目画像および右目画像）を指し、モノビューは、ディスプレイ上に表示される単一画像を指す。左目画像と右目画像の組合せは、閲覧者にとって、画像を表示しているディスプレイから画像がポップアウトし、またはプッシュインしているかのように見え得る。こうすることにより、より現実的および豊かな視認体験が生じ得る。
【００１６】
本開示において、Ｓ３Ｄ画像（たとえば、立体ビュー）および３Ｄ画像（たとえば、モノビュー）の概念は混同されるべきでない。３Ｄ画像とは、ディスプレイの２次元（２Ｄ）エリアに制限された画像である。たとえば、３Ｄ画像内のオブジェクトは、３Ｄ画像内の他のオブジェクトよりもさらに遠くまたは近くに見え得る。ただし、これらのオブジェクトはすべて、ディスプレイの２Ｄエリアに限定される。Ｓ３Ｄ画像とは、右目画像と左目画像とを組み合わせた、閲覧者の脳から得られる知覚画像である。得られた画像（すなわち、Ｓ３Ｄ画像）は、ディスプレイの２Ｄエリアに制限されないように見える。そうではなく、Ｓ３Ｄ画像は、３Ｄボリュームを取り囲むように見え、この場合、画像は、ディスプレイからポップアウトし、またはディスプレイにプッシュインするように見える。たとえば、Ｓ３Ｄ画像内のオブジェクトは、３Ｄ画像の場合のように２Ｄエリアではなく、３Ｄボリューム内の他のオブジェクトよりもさらに遠くまたは近くに見える。
【００１７】
Ｓ３Ｄ画像を一緒に形成する右目画像および左目画像は、３Ｄ画像であり得る。脳が３Ｄ右目画像と３Ｄ左目画像とを組み合わせるとき、閲覧者にＳ３Ｄ画像を知覚させるのは、閲覧者の脳である。右目画像および左目画像の内容は、単一３Ｄ画像の内容と実質的に同様であり得る。本開示に記載する技法は、モノビュー用のグラフィックスコンテンツをＧＰＵに生成させる命令を、立体ビュー用のグラフィックスコンテンツをＧＰＵに生成させる命令に修正することができる。言い換えれば、修正に先立って、命令は、ＧＰＵに単一３Ｄ画像を生成させる。修正に続いて、命令は、ＧＰＵに、２つの３Ｄ画像（たとえば、３Ｄ左目画像および３Ｄ右目画像）を生成させることができる。
【００１８】
本開示に記載する技法は概して、３Ｄ画像について開示されるが、本開示の態様は、そのように限定されないことに留意されたい。本開示の技法は、２Ｄグラフィックスにも拡張することができる。たとえば、モノビューの単一画像は２Ｄ画像であってよく、本開示の技法は、立体ビュー用の２つの２Ｄ画像をＧＰＵに生成させるように、命令を修正することができる。この場合、閲覧者は、立体ビュー用の２つの画像を表示しているディスプレイからポップアウトされ、またはディスプレイにプッシュインされる単一画像を知覚することになる。混同を避けるために、後で説明する技法は、モノビュー用の単一画像と、立体ビュー用の左目および右目画像とに言及するが、これらの画像は３Ｄ画像または２Ｄ画像であり得ることを理解されたい。
【００１９】
本開示に記載する例示的技法は、ＧＰＵによって実施されるべきである、アプリケーションによって発行された命令と、ＧＰＵによって実行されるべき頂点シェーダプログラムの命令とを修正することができる。たとえば、アプリケーションプロセッサがアプリケーションを実行することができる。アプリケーションは、単一画像（たとえば、モノビュー）を生成するように設計されていてよく、単一画像のグラフィックスコンテンツを複数のプリミティブとして生成することができる。さらに、アプリケーションは、プリミティブの各頂点について、色、透明度、および座標値などのピクセル値を決定することができる。
【００２０】
アプリケーションの実行の間（たとえば、ランタイム中）、アプリケーションは、頂点シェーダプログラムの命令を取り出すためのコマンドを発行する。頂点シェーダプログラムの出力は、実行されるとき、単一画像（たとえば、モノビュー）向けのアプリケーションによって生成されたプリミティブの頂点についてのクリッピング座標であってよい。例示的技法は、頂点シェーダプログラムの命令を、左目画像および右目画像（たとえば、立体ビュー）用のプリミティブの頂点についてのクリッピング座標を生成するように修正することができる。
【００２１】
また、アプリケーションの実行中、アプリケーションは、単一画像内のプリミティブのうち１つまたは複数を描画するよう、ＧＰＵに命令するための描画命令をＧＰＵへ発行する。たとえば、本開示の技法において、アプリケーションプロセッサ上で実行するアプリケーションは、単一画像用のグラフィックスコンテンツをＧＰＵが生成する予定であるかのように、命令を出力する。本明細書に記載する技法は、描画命令など、アプリケーションによって発行された命令のうち１つまたは複数を、左目画像および右目画像用のグラフィックスコンテンツを生成するように修正する。このように、アプリケーションの観点からの、命令に対する修正は行われない。
【００２２】
たとえば、本開示に記載する技法は、アプリケーションによって発行された命令を監視する。アプリケーションが描画命令を発行すると、本技法は、このような描画命令を捕捉し、２つの描画命令を発行し、ここで、１つの命令は、左目画像用のグラフィックコンテンツを生成するためのものであり、１つの命令は、右目画像用のグラフィックスコンテンツを生成するためのものである。
【００２３】
さらに、本技法は、アプリケーションによって発行されたビューポート命令を修正する。たとえば、アプリケーションは、単一画像のビューポートを定義するビューポート命令を発行する。ビューポートは、ディスプレイ上での画像のサイズと場所とを定義する。たとえば、ビューポートは、画像の開始座標と、画像の幅および長さとを定義し得る。画像の幅および長さは、画像によって取り囲まれる水平距離と垂直距離とを示す値であり得る。幅および長さは、必ずしも座標値である必要はなく、むしろ、幅および長さは、画像の開始座標から始まる距離を定義する。アプリケーションは、単一画像についてのビューポートの定義をＧＰＵへ与えることができる。
【００２４】
本開示の技法は、ディスプレイ上での、左目画像および右目画像の各々のサイズと場所とを定義する、左目画像および右目画像についてのビューポート命令を生成するように、ビューポート命令を修正する。このように、変更されたビューポート命令は、左目画像をディスプレイの一部分に、および右目画像をディスプレイの他の部分に制限することができる。いくつかの例では、変更されたビューポート命令は、左目画像をディスプレイの左半分に、および右目画像をディスプレイの右半分に制限することができる。ただし、本開示の態様はそのように限定されるわけではなく、変更されたビューポート命令は、別の非限定的例として、左目画像をディスプレイの上半分に、および右目画像をディスプレイの下半分に制限することもできる。いくつかの事例では、例示的技法は、右目画像および左目画像についてのビューポートを、より良好な視認体験を提供することが可能なようにさらに修正することができる。たとえば、本技法は、右目画像および左目画像についてのビューポートをシフトまたはストレッチすることができる。
【００２５】
ビューポートを修正する命令は、シェーダプログラムを修正する命令の一部でなくてもよい。たとえば、ＧＰＵは、シェーダコアと呼ばれることがあるシェーダプロセッサと、１つまたは複数の固定機能ユニットとを含み得る。頂点シェーダプログラムは、シェーダプロセッサ上で実行することができ、定義されたビューポートに画像を制限するためのビューポートのアプリケーションは、固定機能ユニットのうち少なくとも１つ（たとえば、固定機能ユニットのうちのビューポート変換ユニット）によって実施することができる。例示的技法では、シェーダプロセッサは、修正されたシェーダプログラムを実行して、立体ビュー用のグラフィックスコンテンツを生成することができ、少なくとも１つの固定機能ユニットは、左目画像および右目画像の各々についての定義されたビューポートを適用して、これらの画像を、ディスプレイのそれぞれの半分に制限することができる。言い換えれば、ビューポート修正は、修正されたシェーダプログラムの実行の外部で起こり得る。
【００２６】
図１は、本開示に記載する１つまたは複数の例示的技法を実装し得るデバイスの例を示すブロック図である。たとえば、図１は、デバイス１０を示す。デバイス１０の例には、限定はしないが、モバイルワイヤレス電話、携帯情報端末（ＰＤＡ）、ビデオディスプレイを含むビデオゲーミングコンソール、モバイルビデオ会議ユニット、ラップトップコンピュータ、デスクトップコンピュータ、テレビジョンセットトップボックス、デジタルメディアプレーヤ、スマートフォンなどがある。図１に示すように、デバイス１０は、アプリケーションプロセッサ１２と、グラフィックス処理ユニット（ＧＰＵ）２０と、システムメモリ２６とを含み得る。デバイス１０は、図１に示すものの他にも、構成要素を含み得る。これらの構成要素は、明快のために図１には示していないが、図３にさらに示してある。
【００２７】
アプリケーションプロセッサ１２は、デバイス１０の中央処理ユニット（ＣＰＵ）であり得る。ＧＰＵ２０は、ディスプレイ上での表示のためにグラフィックスデータを出力するように動作可能な処理ユニットであり得る。アプリケーションプロセッサ１２およびＧＰＵ２０の例には、限定はしないが、デジタル信号プロセッサ（ＤＳＰ）、汎用マイクロプロセッサ、特定用途向け集積回路（ＡＳＩＣ）、フィールドプログラマブル論理アレイ（ＦＰＧＡ）、あるいは他の等価な集積回路またはディスクリート論理回路がある。
【００２８】
システムメモリ２６は、コンピュータ可読記憶媒体の例であり得る。たとえば、システムメモリ２６は、アプリケーションプロセッサ１２およびＧＰＵ２０に、本開示において各々による機能を実施させる命令を記憶することができる。このように、システムメモリ２６は、１つまたは複数のプロセッサ、たとえば、アプリケーションプロセッサ１２またはＧＰＵ２０に、様々な機能を実施させる命令を備えるコンピュータ可読記憶媒体と見なされ得る。
【００２９】
システムメモリ２６の例には、限定はしないが、ランダムアクセスメモリ（ＲＡＭ）、読取り専用メモリ（ＲＯＭ）、電気的消去可能プログラマブル読取り専用メモリ（ＥＥＰＲＯＭ）、ＣＤ−ＲＯＭまたは他の光ディスクストレージ、磁気ディスクストレージ、または他の磁気ストレージデバイス、フラッシュメモリ、あるいは命令またはデータ構造の形態の所望のプログラムコードを搬送または記憶するために使用され得、コンピュータまたはプロセッサによってアクセスされ得る、任意の他の媒体がある。システムメモリ２６は、いくつかの例では、非一時的記憶媒体と見なされ得る。「非一時的」という用語は、記憶媒体が、搬送波または伝搬信号では実施されないことを示し得る。ただし、「非一時的」という用語は、システムメモリ２６が非移動性であることを意味するものと解釈されるべきでない。一例として、システムメモリ２６は、デバイス１０から取り外され、別のデバイスに移され得る。別の例として、システムメモリ２６と実質的に同様の記憶デバイスが、デバイス１０に挿入され得る。いくつかの例では、非一時的記憶媒体は、時間経過に伴って変動し得るデータを（たとえば、ＲＡＭに）記憶することができる。
【００３０】
ＧＰＵ２０は、シェーダプロセッサ２２と固定機能パイプライン２４とを含み得る。シェーダコアと呼ばれることもあるシェーダプロセッサ２２は、頂点シェーダおよびフラグメントシェーダなどのシェーダプログラムがその上で実行するＧＰＵ２０のコアであり得る。固定機能パイプライン２４は、固定機能を実施するハードウェアユニットを含み得る。言い換えれば、頂点シェーダおよびフラグメントシェーダなどのシェーダプログラムは、シェーダプロセッサ２２上で実行し、機能的柔軟性を可能にするソフトウェアユニットであってよく、固定機能パイプライン２４は、固定機能および最低限の機能的柔軟性を有するハードウェアユニットを含む。
【００３１】
本開示に記載する例示的技法は、修正されたシェーダプログラムがシェーダプロセッサ２２上で実行されると、ＧＰＵ２０がＳ３Ｄ画像（たとえば、立体ビュー）についてのグラフィックスデータを生成するように、単一３次元（３Ｄ）画像（たとえば、モノビュー用）を生成するように設計されたシェーダプログラムを修正することができる。やはり、上述したように、立体ビューは、左目画像と右目画像とを含む。左目画像および右目画像は、モノビュー画像と実質的に同様のグラフィックスコンテンツを含むが、左目画像および右目画像の１つまたは複数の対応するピクセルは、互いに対して、水平軸に沿ってずらされ得る。たとえば、右目画像は左目画像の上に位置することを想像されたい。この場合、右目画像中の内容すべてが、左目画像中の同一の内容と完全に整列するわけではない。そうではなく、右目画像中の１つまたは複数のオブジェクトは、左目画像中の同一のオブジェクトの左または右にあってよい。
【００３２】
左目画像は、閲覧者の左目には可視であり、右目画像は、閲覧者の左目から遮断される。右目画像は、閲覧者の右目には可視であり、左目画像は、閲覧者の右目から遮断される。いくつかの例では、閲覧者は、左目画像が右目に可視になり、右目画像が左目に可視になるのを阻止する特殊眼鏡を装着することができる。ただし、本開示の態様は、閲覧者が特殊眼鏡を装着することを必ずしも要求するわけではない。たとえば、いくつかのディスプレイは、立体ビューを体験するのに、閲覧者が特殊眼鏡を装着することを要求しない。本開示の技法は、そのようなディスプレイに拡張することができる。
【００３３】
ＧＰＵ２０は、閲覧者が左目画像と右目画像の両方を同時に見るとき、２つの画像を表示しているディスプレイからポップアウトし、またはディスプレイにプッシュインする（たとえば、ディスプレイの前または後ろにあるように見える）画像を、閲覧者の脳が閲覧者に知覚させるように左目画像および右目画像についてのグラフィックスデータを生成することができる。このポップアウトまたはプッシュインは、実質的に同様の内容をもつ立体ビューの２つの画像における水平相違を解消する閲覧者の脳に起因する。
【００３４】
一例として、アプリケーションプロセッサ１２は、システムメモリ２６に記憶された、アプリケーション３２など、１つまたは複数のアプリケーションを実行することができる。アプリケーション３２の例には、ウェブブラウザ、ユーザインターフェース、ｅメールアプリケーション、表計算アプリケーション、文書処理アプリケーション、グラフィックスオーサリングアプリケーション、ビデオゲーム、または可視オブジェクトを表示用に生成する他のアプリケーションがあるが、それに限定されない。たとえば、アプリケーション３２は、実行されると、ディスプレイ上に表示されるグラフィカルコンテンツを出力するビデオゲームであってよい。
【００３５】
アプリケーション３２は、開発者によってモノビュー用に設計することができる。たとえば、アプリケーション３２は、実行されると、３Ｄグラフィックスコンテンツを生成することができ、３Ｄグラフィックスコンテンツは、ディスプレイの２Ｄエリアに制限される。アプリケーション３２は、アプリケーションプロセッサ１２上で実行されると、生成された３Ｄグラフィックスコンテンツを、三角形、矩形、または他のタイプのポリゴンなどのプリミティブに分割することができる。これらのプリミティブの各々は、ディスプレイ上に表示されるべきピクセルを含み得る。アプリケーション３２は、アプリケーションプロセッサ１２上で実行されると、プリミティブの頂点の各々にピクセル値を割り当てることもできる。たとえば、ピクセル値は、頂点の３Ｄ座標と、頂点の色値と、頂点の透明度値とを含み得る。ピクセル値は、本開示のすべての態様において、上記の例示的成分のすべてを含む必要はない。
【００３６】
アプリケーションプロセッサ１２は次いで、頂点についてのピクセル値を、さらなる処理のためにＧＰＵ２０に転送すればよい。たとえば、アプリケーションプロセッサ１２は、アプリケーションプロセッサ１２上で実行するソフトウェアであり得るグラフィックスドライバ１４を含み得る。グラフィックスドライバ１４は、ＧＰＵ２０にコマンドを送信するように設計することができ、それに応答して、ＧＰＵ２０は、受信コマンドに従って機能を実施することができる。たとえば、グラフィックスドライバ１４は、ＧＰＵ２０とアプリケーションプロセッサ１２との間のインターフェースとして機能する。アプリケーションプロセッサ１２がＧＰＵ２０にコマンドを発行したとき、ＧＰＵ２０がコマンドを受信するのは、グラフィックスドライバ１４を通してである。たとえば、アプリケーションプロセッサ１２上で実行するアプリケーション３２は、ＧＰＵ２０に、特定のタスクを実施するよう命令することができる。この場合、グラフィックスドライバ１４は、特定のタスクについての命令をアプリケーション３２から受信することができ、ＧＰＵ２０に命令を与えればよい。応答として、ＧＰＵ２０はタスクを実施すればよい。
【００３７】
いくつかの例では、グラフィックスドライバ１４は、特定のアプリケーションプログラミングインターフェース（ＡＰＩ）に従って設計され得る。たとえば、グラフィックスドライバ１４は、ＯｐｅｎＧＬまたはＯｐｅｎＧＬ  ＥＳ（組込みシステム）ＡＰＩに従って設計することができ、これらはクロノスグループのＡＰＩであり、その仕様は公表されている。ただし、本開示の技法は、ＤｉｒｅｃｔＸ９、１０、もしくは１１などのマイクロソフトＤｉｒｅｃｔＸシステム、または他のどのシェーダベースのグラフィックスシステムおよびＡＰＩにも拡張可能であり得る。説明のために、本開示の技法は、ＡＰＩがＯｐｅｎＧＬ  ＥＳ２．０ＡＰＩであるコンテキストにおいて説明される。ただし、本開示の態様は、そのように限定されるわけではなく、他のＡＰＩまたはシェーダベースのグラフィックスシステムにも拡張され得る。
【００３８】
アプリケーションプロセッサ１２から受信されたプリミティブをレンダリングするために、ＧＰＵ２０のシェーダプロセッサ２２は、頂点シェーダおよびフラグメントシェーダなど、１つまたは複数のシェーダプログラムを実行して、ディスプレイのピクセルについてのピクセル値を生成することができる。開発者は、これらの頂点シェーダおよびフラグメントシェーダを、本開示において説明目的で使われる、ＯｐｅｎＧＬ  ＥＳ２．０ＡＰＩなどのＡＰＩに従って開発することができる。これらの頂点およびフラグメントシェーダ用のソースコードは、システムメモリ２６に記憶することができる。
【００３９】
たとえば、アプリケーション３２は、モノビューを生成するように設計され得る頂点シェーダ２８を使用することができる。たとえば、アプリケーション３２によって生成されたピクセル値は、頂点シェーダ２８を使って、シェーダプロセッサ２２によって処理される必要があり得る。一例として、頂点シェーダ２８は、アプリケーションプロセッサ１２上でのアプリケーション３２の実行中にアプリケーション３２によって特に呼び出される頂点シェーダであり得る。頂点シェーダ２８は、ＧＰＵ２０のシェーダプロセッサ２２上で実行することができ、アプリケーション３２は、アプリケーションプロセッサ１２上で実行することができるが、頂点シェーダ２８およびアプリケーション３２は、アプリケーション３２によって生成された画像を表示する目的のために、相互に関係し得る。
【００４０】
頂点シェーダ２８のソースコードは、システムメモリ２６に記憶することができる。グラフィックスドライバ１４は、頂点シェーダ２８のソースコードを取り出し、頂点シェーダ２８用のソースコードをコンパイラ１８に与えることができる。コンパイラ１８は、頂点シェーダ２８のソースコードをコンパイルして、頂点シェーダ２８のオブジェクトコードを生成し、オブジェクトコードをシステムメモリ２８に記憶することができる。グラフィックスドライバ１４は次いで、ＧＰＵ２０に、頂点シェーダ２８のオブジェクトコードをシステムメモリ２６から取り出すよう命令し、ＧＰＵ２０に、頂点シェーダ２８のオブジェクトコードをシェーダプロセッサ２２上で実行するよう命令することができる。シェーダプロセッサ２２は次いで、頂点シェーダ２８のオブジェクトコードを実行して、アプリケーション３２の実行によって生成された、頂点についてのピクセル値を処理することができる。ＧＰＵ２０は、固定機能パイプライン２４およびシェーダプロセッサ２２とともに、アプリケーション３２向けのグラフィックスコンテンツを表示用に生成することができる。
【００４１】
システムメモリ２６は、ただ１つの頂点シェーダ２８用のソースコードを記憶するように示されているが、本開示の態様は、そのように限定されるわけではない。たとえば、アプリケーション３２は、可能性としては、複数の異なる頂点シェーダを使用することができ、これらの頂点シェーダの各々のためのソースコードは、システムメモリ２６に記憶することができる。また、アプリケーション３２は、頂点シェーダ２８の複数のインスタンス化の実行を要求し得る。たとえば、シェーダプロセッサ２２は、頂点シェーダ２８の複数のインスタンス化を同時に（たとえば、並行して）実行することができ、この場合、頂点シェーダ２８の各インスタンス化は、実質的に同様の機能を実施するのだが、異なるピクセル値に対して実施する。システムメモリ２６は同様に、フラグメントシェーダ用のソースコードを記憶することができる。グラフィックスドライバ１４は、フラグメントシェーダ用のソースコードを取り出すことができ、コンパイラ１８は、ソースコードをコンパイルして、フラグメントシェーダ用のオブジェクトコードを、頂点シェーダ２８について上述したのと同様にして生成することができる。
【００４２】
さらに詳しく説明するように、本開示の１つまたは複数の例示的技法は、コンパイルに先立って、頂点シェーダ２８のソースコードを修正することができる。コンパイラ１８は、修正されたソースコードをコンパイルして、修正された頂点シェーダ３０のオブジェクトコードを生成することができる。シェーダプロセッサ２２は、修正された頂点シェーダ３０のオブジェクトコードを実行することができ、そうすることによって、ＧＰＵ２０に、立体３Ｄグラフィックスコンテンツ（たとえば、Ｓ３Ｄの左目画像および右目画像用のグラフィックスコンテンツ）を生成させることができる。ただし、頂点シェーダ２８のソースコードに対する修正について説明するのに先立って、以下では、頂点シェーダ２８の例示的機能性について説明するが、この説明は、頂点シェーダ２８のソースコードに適用される修正の理解を助けるであろう。
【００４３】
上述したように、アプリケーション３２は、プリミティブの頂点についての座標を生成することができる。これらの座標は、世界座標と呼ばれる場合もあり、アプリケーション３２に固有であり得る。言い換えれば、アプリケーション３２によって定義される頂点の座標は、必ずしも、プリミティブが表示されるディスプレイの座標でなくてよく、可能性としては、可視エリアの外にある頂点についての座標であってもよい。頂点シェーダ２８は、３Ｄであり得る世界座標を、ディスプレイの２Ｄ座標（たとえば、ディスプレイ座標）にコンバートするように設計され得る。この機能を実施するために、頂点シェーダ２８は、世界座標を目座標に、次いで、クリッピング座標に変換することができる。たとえば、頂点シェーダ２８の出力は、実行されるとき、頂点のクリッピング座標であり得る。最終的なディスプレイ座標、たとえば、ディスプレイの座標は、その後、固定機能パイプライン２４の一部として決定され得る。
【００４４】
クリッピング座標は、視錐台を定義し得る。視錐台は、３Ｄグラフィックスコンテンツの可視エリアを定義し得る。ＧＰＵ２０は、視錐台を、視錐台の外にあるピクセルを選別するのに使用することができる。たとえば、固定機能パイプライン２４の固定機能ユニット（たとえば、固定機能パイプライン２４の錐台ユニット）は、頂点シェーダ２８によって生成されたクリッピング座標によって定義される、視錐台の外にあるピクセルを選別することができる。
【００４５】
世界座標からクリッピング座標を算出するための式は、次のようになり得る。
【数１】
0005694577.tif 000002
【００４６】
上式で、Ｖｃｌｉｐは頂点クリップ座標であり、Ｖｅｙｅは頂点視点座標であり、Ｖｗｏｒｌｄは、アプリケーション３２によって与えられる頂点世界座標であり、ＰＲＪは投射行列であり、ＭＶＴはモデルビュー変換行列（または世界ビュー変換行列）である。いくつかの例では、ＰＲＪおよびＭＶＴ行列は、組み合わせて単一行列にすることができる。ただし、理解しやすくするために、これらの行列は別々に記述する。
【００４７】
投射行列（ＰＲＪ）およびモデルビュー、または世界ビュー、変換行列（ＭＶＴ）は、ＡＰＩによって定義することができる。モデルビューおよび世界ビューという用語は、互換的に使うことができる。Ｖｃｌｉｐ、Ｖｅｙｅ、およびＶｗｏｒｌｄは、４つの成分（たとえば、ｘ、ｙ、ｚ、およびｗ座標）を含み得る。たとえば、Ｖｃｌｉｐ、Ｖｅｙｅ、およびＶｗｏｒｌｄは、次のように表すことができる。
【数２】
0005694577.tif 000003
【００４８】
プログラマブルシェーダを有するＯｐｅｎＧＬ、ＯｐｅｎＧＬ  ＥＳ、およびＯｐｅｎＧＬ  ＥＳ２．０ＡＰＩは、ＰＲＪ行列を次のように定義する。
【数３】
0005694577.tif 000004
【００４９】
上式で、ＬおよびＲは、それぞれ、左および右の垂直クリップ面についての座標を指定し、ＢおよびＴは、それぞれ、下および上の水平クリップ面についての座標を指定し、ｚnearおよびｚfarは、それぞれ、近および遠深度クリップ面までの距離を指定する。
【００５０】
いくつかの例では、クリップ面は対称的であってよい。たとえば、−ＬはＲに等しくてよく、−ＢはＴに等しくてよい。これらの事例において、ＰＲＪ行列は、以下に単純化し得る。
【数４】
0005694577.tif 000005
【００５１】
プログラマブルシェーダを有するＯｐｅｎＧＬ、ＯｐｅｎＧＬ  ＥＳ、およびＯｐｅｎＧＬ  ＥＳ２．０ＡＰＩは、ＭＶＴ行列を次のように定義する。
【数５】
0005694577.tif 000006
【００５２】
ＰＲＪおよびＭＶＴ行列の変数はすべて、アプリケーションプロセッサ１２上で実行するアプリケーション３２によって定義することができ、グラフィックスドライバ１４は、これらの変数を、頂点シェーダ２８のオブジェクトコードを実行中のシェーダプロセッサ２２に与えればよい。これらの変数を有する式１、４、および５からわかるように、頂点シェーダ２８は、頂点の各々についてのＶｃｌｉｐ座標を判断することができる。ＧＰＵ２０は、頂点についてのクリップ座標を使用し、固定機能パイプライン２６およびフラグメントシェーダの機能性とともに、さらなる機能性を実施して、画像を表示用にレンダリングすることができる。このように、ＧＰＵ２０は、アプリケーション３２によって生成されたグラフィックスコンテンツ用のモノビューを生成することができる。
【００５３】
本開示の技法によると、頂点シェーダ２８は、ＭＶＴおよびＰＲＪ行列用の変数を使用して、Ｖｃｌｉｐ座標を決定することができるが、ＭＶＴおよびＰＲＪ行列は、立体ビューを生成するように頂点シェーダ２８のソースコードを修正するのに必要とされなくてもよい。そうではなく、本開示の技法は、立体ビュー（たとえば、左目画像および右目画像）用のクリッピング座標を生成するように、モノビュー用に生成されるクリッピング座標（Ｖｃｌｉｐ）を修正する、頂点シェーダ２８中の命令を含み得る。
【００５４】
上の例では、モノビュー用のＶｃｌｉｐ座標を決定するための一方法を説明している。クリッピング座標を算出するための多くの異なる技法があってよく、概して、クリッピング座標を算出するのに使用される特定の技法は重要でなくてよい。ただし、いずれにしても、３Ｄグラフィックスコンテンツの場合、クリッピング座標（Ｖｃｌｉｐ）は、クリッピング座標を算出するのに使われる技法にかかわらず、算出される必要があり得る。たとえば、アプリケーションプロセッサ１２がクリッピング座標を決定することさえも可能であってよく、グラフィックスドライバ１４は、頂点シェーダ２８のオブジェクトコードを実行中であるシェーダプロセッサ２２にクリッピング座標を与えればよい。この例では、ＰＲＪおよびＭＶＴ行列は、ユニティ行列であり得る。たとえば、アプリケーションプロセッサ１２は、式１の行列乗算を実施し、結果をシェーダプロセッサ２２に与えればよい。この例では、シェーダプロセッサ２２は、受信した値をユニティ行列で乗算して、アプリケーション３２によって生成された頂点の各々についてのＶｃｌｉｐ座標を生成することができる。
【００５５】
ただし、いずれの場合にも（たとえば、頂点シェーダ２８がクリッピング座標を決定する場合、または頂点シェーダ２８がクリッピング座標を受信する場合）、頂点シェーダ２８は、クリッピング座標を記憶するのに固有変数を使用することができる。固有変数は、頂点シェーダ２８がそのために設計されるＡＰＩに固有であり得る。たとえば、頂点シェーダ２８が、プログラマブルシェーダとともにＯｐｅｎＧＬ、ＯｐｅｎＧＬ  ＥＳ、またはＯｐｅｎＧＬ  ＥＳ２．０ＡＰＩに従って設計される場合、頂点シェーダ２８は、クリッピング座標をｇｌ＿Ｐｏｓｉｔｉｏｎ変数に記憶することができる。他のグラフィックスＡＰＩにも、同様の変数があり得る。たとえば、頂点シェーダ２８が、プログラマブルシェーダとともに、ＯｐｅｎＧＬ、ＯｐｅｎＧＬ  ＥＳ、またはＯｐｅｎＧＬ  ＥＳ２．０ＡＰＩに従って設計される場合、頂点シェーダ２８は、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＝ｘclip、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｙ＝ｙclip、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｚ＝ｚclip、およびｇｌ＿Ｐｏｓｉｔｉｏｎ．ｗ＝ｗclipなどの命令を含んでよく、ここで、式２において上で示したとおり、次のようになる。
【数６】
0005694577.tif 000007
【００５６】
本開示に記載する１つまたは複数の例示的技法において、グラフィックスドライバラッパー１６は、アプリケーションプロセッサ１２上で実行するソフトウェアであってよく、モノビューについてのクリッピング座標を定義する、頂点シェーダ２８の命令を、立体ビュー用のクリッピング座標（たとえば、左目画像用のクリッピング座標および右目画像用のクリッピング座標）を定義するように修正することができる。また、グラフィックスドライバラッパー１６は、クリッピング座標を定義する、頂点シェーダ２８の命令の修正に加え、モノビュー用のビューポートを定義する命令を、立体ビュー用のビューポートを定義するように修正することができる。
【００５７】
「ビューポート」という用語は、画像がディスプレイ上で取り囲むエリアを指す。たとえば、アプリケーション３２は、画像を表示するディスプレイ上での単一画像（たとえば、モノビュー）のサイズと場所とを定義することができる。単一画像のサイズおよび場所のこの定義は、単一画像用のビューポートと見なされ得る。ビューポートを定義するために、アプリケーション３２は、ディスプレイ上でのモノビュー画像のサイズと場所とをその変数が定義するｇｌＶｉｅｗｐｏｒｔコマンドを発行することができる。グラフィックスドライバラッパー１６は、単一画像のサイズと場所とを定義するコマンド、たとえば、アプリケーション３２によって発行されたｇｌＶｉｅｗｐｏｒｔコマンドを、左目画像および右目画像のサイズと場所とを定義するコマンド（たとえば、左目画像用のビューポートと、右目画像用のビューポートとを定義するｇｌＶｉｅｗｐｏｒｔコマンド）に修正することができる。左目画像用のｇｌＶｉｅｗｐｏｒｔコマンドは、左目画像をディスプレイの一部分に制限することができ、右目画像用のｇｌＶｉｅｗｐｏｒｔコマンドは、右目画像をディスプレイの別の部分に制限することができる。
【００５８】
本開示の例において、グラフィックスドライバラッパー１６は、外部のビューポートを定義する命令を、頂点シェーダ２８の命令を修正する命令に修正することができる。言い換えれば、グラフィックスドライバラッパー１６は、頂点シェーダ２８の命令を、立体ビューの左目画像および右目画像用のビューポートを修正するように修正する必要がなくてよい。そうではなく、グラフィックスドライバラッパー１６は、ビューポートを定義する命令を、左目画像および右目画像が表示されると、固定機能パイプライン２４の固定機能ユニット（たとえば、ビューポート変換ユニット）が、左目画像を制限する、左目画像用のビューポートをディスプレイの一部分に適用し、右目画像を制限する、右目画像用のビューポートをディスプレイの別の部分に適用するように修正すればよい。
【００５９】
いくつかの例では、固定機能パイプライン２４のビューポート変換ユニットは、左目画像をディスプレイの左半分に、右目画像をディスプレイの右半分に制限することができるが、本開示の態様は、そのように限定されるわけではない。ビューポート変換ユニットは、左目画像および右目画像を、ディスプレイの左半分および右半分以外の部分に制限することができる。概して、ビューポート変換ユニットは、より詳細に説明したように、左目画像および右目画像を、ビューポート変換ユニットが受信する変更されたビューポート命令に基づく、ディスプレイの部分に制限することができる。
【００６０】
一例として、ＧＰＵ２０に画像をレンダリングさせるために、アプリケーション３２は、ｇｌＳｈａｄｅｒＳｏｕｒｃｅコマンドを実行すればよい。ｇｌＳｈａｄｅｒＳｏｕｒｃｅコマンドは、グラフィックスドライバ１４に、システムメモリ２６から頂点シェーダ２８のソースコードを取り出すよう命令する。本開示の例では、アプリケーション３２によって発行されたｇｌＳｈａｄｅｒＳｏｕｒｃｅコマンドに応答して、グラフィックスドライバラッパー１６は、頂点シェーダ２８のソースコードを、グラフィックスドライバ１４に届く前にインターセプトすることができる。グラフィックスドライバラッパー１６は、頂点シェーダ２８のソースコードを、修正された頂点シェーダ２８が実行されると、シェーダ２８に、立体ビュー用のグラフィックスコンテンツを生成させる命令を含むように修正すればよい。たとえば、グラフィックスドライバラッパー１６は、修正された頂点シェーダ２８を２回実行させることができる。第１の実行において、修正された頂点シェーダ２８は、左目画像用のグラフィックスコンテンツを生成することができ、第２の実行において、修正されたシェーダ２８は、右目画像用のグラフィックスコンテンツを生成することができ、または逆も同様である。
【００６１】
グラフィックスドライバラッパー１６は、アプリケーションプロセッサ１２によって実行されると、ソースコードエディタとして機能し得る。一例として、グラフィックスドライバラッパー１６は、アプリケーション３２によって発行された命令を監視することができる。アプリケーション３２がｇｌＳｈａｄｅｒＳｏｕｒｃｅコマンドを発行したことをグラフィックスドライバラッパー１６が認識すると、グラフィックスドライバラッパー１６は、頂点シェーダ２８の命令（たとえば、頂点シェーダ２８のソースコード）を捕捉し修正することができる。たとえば、グラフィックスドライバラッパー１６は、単一画像（たとえば、モノビュー）用に生成されたクリッピング座標の値を、左目画像および右目画像（たとえば、立体ビュー）用のクリッピング座標を生成するように修正する命令を、頂点シェーダ２８の命令に含めることができる。
【００６２】
たとえば、上述したように、頂点シェーダ２８は、ｘclip座標についての値を記憶するｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘコマンドを含み得る。後でより詳細に論じるように、グラフィックスドライバラッパー１６は、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘの値（たとえば、ｘclip座標）を更新する命令を、頂点シェーダ２８に含めることができる。左目画像を生成するために、グラフィックスドライバラッパー１６によって頂点シェーダ２８に追加された命令は、頂点シェーダ２８に、ｘclip値に定数を加算させる。右目画像を生成するために、グラフィックスドライバラッパー１６によって頂点シェーダ２８に追加された命令は、頂点シェーダ２８に、ｘclip値から定数を減算させる。
【００６３】
たとえば、グラフィックスドライバラッパー１６は、頂点シェーダ２８のソースコードを、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ変数に記憶された値（たとえば、ｘclip座標）を、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ変数に（ｚnear＊ｗworld／（Ｒ−Ｌ）／２）＊Ｘをプラスした現在の値に変更する命令を追加するように修正すればよく、ここでｚnear、Ｒ、およびＬはすべて、ＰＲＪ行列（式４）にある変数であり、ｗworldは、Ｖworld行列（式２）にある変数（たとえば、アプリケーション３２によって定義される頂点座標）である。Ｘの値は＋Ｄまたは−Ｄであってよく、Ｄは、閲覧者の右目と左目との間の距離の半分の近似であり、ユーザ定義可能であっても、あらかじめプログラムされた値であってもよい。
【００６４】
一例として、グラフィックスドライバラッパー１６は、頂点シェーダ２８の命令のセットに、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝（ｚnear＊ｗworld／（Ｒ−Ｌ）／２）＊Ｘという命令を追加することができる。この命令は、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＝ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋（ｚnear＊ｗworld／（Ｒ−Ｌ）／２）＊Ｘと等価であり得る。たとえば、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝コマンドは、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝命令によって定義される値を、ｇｌ＿Ｐｏｓｉｔｉｏｎコマンドによって記憶された値に加算する（たとえば、ｘclipに値を加算する）。いくつかの状況では、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝命令は、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝Ｘに単純化し得る。ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋変数が（ｚnear＊ｗworld／（Ｒ−Ｌ）／２）＊Ｘまたは単なるＸと等しくなり得る理由については、後でさらに詳しく説明する。
【００６５】
本開示の技法によると、左目画像を生成するために、グラフィックスドライバラッパー１６は、変数Ｘの値を、＋Ｄになるように定義すればよい。Ｘが＋Ｄと等しいとき、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝コマンドは、アプリケーション３２によって生成された頂点の各々のｘclip座標に、定数（たとえば（ｚnear＊ｗworld／（Ｒ−Ｌ）／２）＊Ｄまたは単にＤ）を加算させ、それにより、頂点は、Ｄの値だけ左に移動する。右目画像を生成するために、グラフィックスドライバラッパー１６は、変数Ｘの値を、−Ｄになるように定義すればよい。Ｘが−Ｄと等しいとき、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝コマンドは、アプリケーション３２によって生成された頂点の各々のｘclip座標から、定数（たとえば（ｚnear＊ｗworld／（Ｒ−Ｌ）／２）＊−Ｄまたは単に−Ｄ）を減算させ、それにより、頂点は、−Ｄの値だけ右に移動する。
【００６６】
頂点シェーダ２８のソースコードを修正した後、グラフィックスドライバラッパー１６は、頂点シェーダ２８の修正されたソースコードをシステムメモリに記憶してよい。いくつかの例では、グラフィックスドライバラッパー１６は、頂点シェーダ２８の修正されたソースを、頂点シェーダ２８の変更されていないソースコードがシステムメモリ２６内で記憶される同じ場所に記憶してよい。代替例では、グラフィックスドライバラッパー１６は、頂点シェーダ２８の修正されたソースを、頂点シェーダ２８の変更されていないソースコードが記憶される場所とは異なる、システムメモリ２６内の場所に記憶してよい。
【００６７】
ｇｌＳｈａｄｅｒＳｏｕｒｃｅコマンドの発行に続いて、アプリケーション３２は、ｇｌＣｏｍｐｉｌｅＳｈａｄｅｒコマンドを発行する。ｇｌＣｏｍｐｉｌｅＳｈａｄｅｒコマンドは、アプリケーションプロセッサ１２上で実行するコンパイラ１８に、頂点シェーダ２８の修正ソースコードをコンパイルさせる。たとえば、ｇｌＣｏｍｐｉｌｅＳｈａｄｅｒコマンドは、コンパイラ１８に、修正された頂点シェーダ２８用のソースコードをシステムメモリ２６から取り出させ、修正された頂点シェーダ２８をコンパイルさせることができる。コンパイルの後、コンパイラ１８は、得られたオブジェクトコードをシステムメモリ２６に記憶する。たとえば、図に示すように、システムメモリ２６は修正された頂点シェーダ３０を含む。修正された頂点シェーダ３０は、頂点シェーダ２８の修正ソースコードをコンパイラ１８がコンパイルした結果として得られるオブジェクトコードである。
【００６８】
さらに、上述したように、グラフィックスドライバラッパー１６は、頂点シェーダ２８に、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ変数に定数を加算させて左目画像を生成し、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ変数から定数を減算させて右目画像を生成する、頂点シェーダ２８のソースコード中の命令を含み得る。修正された頂点シェーダ３０のオブジェクトコードは、修正された頂点シェーダ３０に、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ変数に定数を加算させて左目画像を生成し、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ変数から定数を減算させて右目画像を生成する命令を含む。より詳細に説明したように、修正された頂点シェーダ３０は、描画コマンドに応答して、グラフィックスドライバラッパー１６から定数の値を受信する。
【００６９】
アプリケーション３２は、プロセッサ１２によって実行されると、単一画像のビューポートを定義するコマンド（たとえば、ディスプレイ上での単一画像のサイズと場所とを定義するコマンド）を発行することもできる。このコマンドは、ｇｌＶｉｅｗｐｏｒｔコマンドであり得る。ｇｌＶｉｅｗｐｏｒｔコマンドは、画像についての開始座標（たとえば、ｘおよびｙ座標）と、画像の幅および長さとを定義する。ｇｌＶｉｅｗｐｏｒｔコマンドの開始座標ならびに幅および長さ値は、画像のサイズと場所とを定義する。
【００７０】
本開示の例において、グラフィックスドライバラッパー１６は、アプリケーション３２によって発行されたｇｌＶｉｅｗｐｏｒｔコマンドを捕捉することができる。いくつかの例では、グラフィックスドライバラッパー１６は、アプリケーション３２によってＧＰＵ２０へ発行されたｇｌＶｉｅｗｐｏｒｔコマンドを、グラフィックスドライバ１４が送信するのを阻止することができる。そうではなく、グラフィックスドライバラッパー１６は、アプリケーション３２によって発行されたｇｌＶｉｅｗｐｏｒｔコマンドの開始座標と幅および長さ値とを、システムメモリ２６に記憶することができる。
【００７１】
代替例では、グラフィックスドライバラッパー１６は、アプリケーション３２によってＧＰＵ２０へ発行されたｇｌＶｉｅｗｐｏｒｔコマンドを、グラフィックスドライバ１４が送信するのを許可することができる。この例では、上記と同様に、グラフィックスドライバラッパー１６は、アプリケーション３２によって発行されたｇｌＶｉｅｗｐｏｒｔコマンドの開始座標と幅および長さ値とを記憶することができる。この代替例では、アプリケーション３２によって発行されたｇｌＶｉｅｗｐｏｒｔコマンドをＧＰＵ２０が適用するのに先立って、グラフィックスドライバラッパー１６は、アプリケーション３２によって発行されたｇｌＶｉｅｗｐｏｒｔコマンドを修正し、修正されたｇｌＶｉｅｗｐｏｒｔコマンドをＧＰＵ２０へ送信することができる。このようにして、ＧＰＵ２０は、アプリケーション３２によって発行されたｇｌＶｉｅｗｐｏｒｔコマンドを受信したが、ＧＰＵ２０は、グラフィックスドライバラッパー１６によって修正された、修正されたｇｌＶｉｅｗｐｏｒｔコマンドを実行することができる。
【００７２】
いずれの例においても、グラフィックスドライバラッパー１６は次いで、１つまたは複数のプリミティブを描画するようＧＰＵ２０に命令するコマンドを、アプリケーション３２がＧＰＵ２０に発行するまで待てばよい。この描画コマンドは、ｇｌＤｒａｗコマンドであり得る。ｇｌＤｒａｗＡｒｒａｙｓおよびｇｌＤｒａｗＥｌｅｍｅｎｔｓなど、ｇｌＤｒａｗコマンドの様々な例がある。描画コマンドのこれらの様々な例の各々は一般に、ｇｌＤｒａｗコマンドと呼ばれる。
【００７３】
アプリケーション３２がｇｌＤｒａｗコマンドを発行すると、グラフィックスドライバラッパー１６は、ｇｌＤｒａｗコマンドを捕捉し、グラフィックスドライバ１４がｇｌＤｒａｗコマンドをＧＰＵ２０へ送信するのを阻止する。グラフィックスドライバラッパー１６は次いで、左目画像および右目画像用のグラフィックスコンテンツをＧＰＵ２０に生成させる命令を生成する。一例として、グラフィックドライバラッパー１６は、修正された頂点シェーダ３０のオブジェクトコードをＧＰＵ２０に２回実行させる命令を生成し、左目画像および右目画像用のビューポートを定義するための、２つのｇｌＶｉｅｗｐｏｒｔコマンドを発行し、２つのｇｌＤｒａｗコマンドを発行する。
【００７４】
本技法の概要として、アプリケーション３２によって発行されたｇｌＤｒａｗコマンドをグラフィックスドライバ１４が送信するのを、グラフィックスドライバラッパー１６が阻止した後、グラフィックスドライバラッパー１６は、シェーダプロセッサ２２を使って、修正された頂点シェーダ２０に立体ビューの第１の画像（たとえば、左目画像）用のクリッピング座標を生成する準備をさせるコマンドをＧＰＵ２０に発行する。次いで、グラフィックスドライバラッパー１６は、ディスプレイ上での第１の画像のサイズと場所とを定義する第１のｇｌＶｉｅｗｐｏｒｔコマンドを、固定機能パイプライン２４のビューポート変換ユニットに発行すればよい。グラフィックスドライバラッパー１６は次いで、第１のｇｌＶｉｅｗｐｏｒｔコマンドによって定義されるように、ディスプレイの第１の部分に制限された第１の画像をＧＰＵ２０にレンダリングさせる第１のｇｌＤｒａｗコマンドを、ＧＰＵ２０に発行すればよい。
【００７５】
グラフィックスドライバラッパー１６は次いで、シェーダプロセッサ２２に、立体ビューの第２の画像（たとえば、右目画像）用のクリッピング座標を生成するように修正された頂点シェーダ３０を準備させるコマンドをＧＰＵ２０に発行する。次いで、グラフィックスドライバラッパー１６は、ディスプレイ上での第２の画像のサイズと場所とを定義するビューポートに対する第２のｇｌＶｉｅｗｐｏｒｔコマンドを、固定機能パイプライン２４のビューポート変換ユニットに発行すればよい。グラフィックスドライバラッパー１６は次いで、第２のｇｌＶｉｅｗｐｏｒｔコマンドによって定義されるように、ディスプレイの第２の部分に制限された第２の画像をＧＰＵ２０にレンダリングさせる第２のｇｌＤｒａｗコマンドを、ＧＰＵ２０に発行すればよい。
【００７６】
本開示の技法については、上では概要として説明したが、以下の例において、より詳しく説明する。理解しやすくするためにのみ、以下の例では、本技法は、左目画像用のグラフィックスコンテンツを最初に、続いて右目画像用のグラフィックスコンテンツを生成するＧＰＵ２０を用いて説明されるが、その反対も可能である。また、理解しやすくするためにのみ、左目画像用のビューポートがディスプレイの左半分に制限され、右目画像用のビューポートがディスプレイの右半分に制限される技法について説明されるが、これが限定的と見なされるべきではない。
【００７７】
たとえば、グラフィックスドライバラッパー１６がｇｌＶｉｅｗｐｏｒｔコマンドをインターセプトし、次いで、アプリケーション３２によって発行されたｇｌＤｒａｗコマンドを阻止した後、グラフィックスドライバラッパー１６は、左目画像用のクリッピング座標を生成するようＧＰＵ２０に命令する命令を生成する。やはり、いくつかの例では、グラフィックスドライバラッパー１６は、アプリケーション３２によって発行されたｇｌＶｉｅｗｐｏｒｔコマンドの、ＧＰＵ２０への送信を阻止し得ることに留意されたい。他の例では、グラフィックスドライバラッパー１６は、アプリケーション３２によって発行されたｇｌＶｉｅｗｐｏｒｔコマンドが、ＧＰＵ２０に送信されることを許可し得る。ただし、これら例のいずれにおいても、グラフィックスドライバラッパー１６は、修正されたｇｌＶｉｅｗｐｏｒｔコマンドをＧＰＵ２０に送信することができる。このようにして、ＧＰＵ２０が、アプリケーション３２によって発行されたｇｌＶｉｅｗｐｏｒｔコマンドを受信した場合であっても、ＧＰＵ２０は、アプリケーション３２によって発行されたｇｌＶｉｅｗｐｏｒｔコマンドを実行することができず、代わりに、グラフィックスドライバラッパー１６によって発行された修正されたｇｌＶｉｅｗｐｏｒｔコマンドを実行すればよい。言い換えれば、グラフィックスドライバラッパー１６によって修正された、修正されたｇｌＶｉｅｗｐｏｒｔコマンドは、アプリケーション３２によって発行されたｇｌＶｉｅｗｐｏｒｔコマンドをリセットする。
【００７８】
一例として、グラフィックスドライバラッパー１６は、ＧＰＵ２０に、修正された頂点シェーダ３０のオブジェクトコードを実行させる命令を生成する。応答として、ＧＰＵ２０のシェーダプロセッサ２２は、修正された頂点シェーダ３０のオブジェクトコードを実行する。さらに、グラフィックスドライバラッパー１６は、左目画像用のクリッピング座標を生成するために、修正された頂点シェーダ３０がｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ変数に加算するべき定数値を送信する。修正された頂点シェーダ３０のオブジェクトコードを実行したことによる、シェーダプロセッサ２２の出力は、左目画像の頂点についてのクリッピング座標である。
【００７９】
たとえば、上述したように、グラフィックスドライバラッパー１６は、頂点シェーダ２８のソースコードに、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝（ｚnear*ｗworld／（Ｒ−Ｌ）／２）*Ｘ、または単にｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝Ｘという命令を含めることができ、その理由について説明する。ｚnear、ｗworld、Ｒ、およびＬという変数は、式（２）および（４）を参照して上述したように、シェーダプロセッサ２２に知られている可能性があり得る。ただし、本開示の態様は、ｚnear、ｗworld、Ｒ、およびＬ変数の値をシェーダプロセッサ２２が知っていることを要求するわけではない。たとえば、ｚnear、ｗworld、Ｒ、およびＬ変数は、各々が定数であってよく、それゆえ、（ｚnear＊ｗworld／（Ｒ−Ｌ）／２）の結果は定数値になるはずである。この場合、（ｚnear＊ｗworld／（Ｒ−Ｌ）／２）の値は、推定され、またはユーザによって提供され、Ｘの値に乗算され得る。より詳細に説明するように、いくつかの例では、（ｚnear＊ｗworld／（Ｒ−Ｌ）／２）は１に単純化し得る。
【００８０】
いくつかの例では、シェーダプロセッサ２２は、Ｘの値を知らなくてよい。左目画像に対して、グラフィックスドライバラッパー１６は、修正された頂点シェーダ３０のオブジェクトコードを実行するようシェーダプロセッサ２２に命令する命令に加え、Ｘの値をシェーダプロセッサ２２に送信すればよい。いくつかの例では、Ｘの値は、左目画像の場合、＋Ｄであってよく、Ｄは、閲覧者の目と目との間の距離のほぼ半分に等しく、ユーザ定義されても、あらかじめプログラムされてもよい。変数Ｘの値は＋Ｄであるので、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝コマンドは、シェーダプロセッサ２２に、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ変数に記憶された値にＤの値を加算させる（たとえば、ｘclipの値にＤを加算させる）。
【００８１】
グラフィックスドライバラッパー１６は、左目画像用のビューポートも定義する。たとえば、アプリケーション３２がｇｌＤｒａｗコマンドを発行したときに先立って、アプリケーション３２は、グラフィックスドライバラッパー１６がインターセプトしたｇｌＶｉｅｗｐｏｒｔコマンドを発行している。グラフィックスドライバラッパー１６はまた、開始座標と、幅および長さ値とを、システムメモリ３２に記憶している。左目画像用のビューポートを定義するために、グラフィックスドライバラッパー１６は、アプリケーション３２によって発行された、インターセプトされたｇｌＶｉｅｗｐｏｒｔコマンドを修正すればよい。
【００８２】
たとえば、ｇｌＶｉｅｗｐｏｒｔコマンドは、４つの変数を含み、最初の２つの変数は、ディスプレイ上の画像についての開始座標を定義し、最後の２つの変数は、画像の幅と長さとを定義する。幅および長さ変数は、必ずしも座標値ではない。そうではなく、幅および長さ変数は、画像が開始座標から伸長する量を定義する。たとえば、アプリケーション３２は、ｇｌＶｉｅｗｐｏｒｔ（０，０，ｗｉｄｔｈ，ｌｅｎｇｔｈ）と述べるｇｌＶｉｅｗｐｏｒｔコマンドを発行することができる。この例では、（０，０）は、ディスプレイの左下を指す。変数「ｗｉｄｔｈ」はディスプレイの幅を指し、変数「ｌｅｎｇｔｈ」はディスプレイの長さを指す。したがって、この例では、アプリケーション３２は、画像のビューポートを、ディスプレイの全体を取り囲むように定義するが、この定義は、モノビュー画像と矛盾しない。ただし、アプリケーション３２は、説明したもの以外の、異なる変数をｇｌＶｉｅｗｐｏｒｔコマンドに割り当ててもよい。
【００８３】
本開示によると、グラフィックスドライバラッパー１６は、ｇｌＶｉｅｗｐｏｒｔコマンド（たとえば、前述の例のｇｌＶｉｅｗｐｏｒｔ（０，０，ｗｉｄｔｈ，ｌｅｎｇｔｈ））をインターセプトし、このビューポートコマンド用の変数を修正することができる。たとえば、グラフィックスドライバラッパー１６は、ｇｌＶｉｅｗｐｏｒｔコマンドの変数を、左目画像をディスプレイの所望の部分に制限するように修正してよい。説明しやすくするために、本技法は、左目画像をディスプレイの左半分に、右目画像をディスプレイの右半分に制限することについて述べるが、態様はそのように限定されるわけではない。
【００８４】
左目画像に対して、グラフィックスドライバラッパー１６は、アプリケーション３２によって発行されたｇｌＶｉｅｗｐｏｒｔコマンドを、ｇｌＶｉｅｗｐｏｒｔ（０，０，ｗｉｄｔｈ／２，ｌｅｎｇｔｈ）に修正してよい。この例では、ｗｉｄｔｈ／２は、ディスプレイの幅の半分になる。たとえば、修正されたｇｌＶｉｅｗｐｏｒｔコマンドは、左目画像がディスプレイの左端から始まり（たとえば、ｘ軸上の０ポイントから始まり）、「ｗｉｄｔｈ／２」の距離だけ右に伸びることを示し、その結果、左目画像をディスプレイの左半分に制限することになる。また、修正されたｇｌＶｉｅｗｐｏｒｔコマンドは、左目画像が、ディスプレイの下から始まり（たとえば、ｙ軸上の０ポイントから始まり）、「ｌｅｎｇｔｈ」の距離だけ上に伸びることを示し、その結果、画像をディスプレイの上および下に制限することになる。
【００８５】
グラフィックスドライバラッパー１６は次いで、第１のｇｌＤｒａｗコマンドをＧＰＵ２０に発行すればよい。ｇｌＤｒａｗコマンドに応答して、ＧＰＵ２０は、固定機能パイプライン２４とフラグメントシェーダとを介した、修正された頂点シェーダ３０のオブジェクトコードの実行によって生成された左目画像についてのクリッピング座標を処理することができる。この例では、第１のｇｌＶｉｅｗｐｏｒｔコマンドは、左目画像をディスプレイの左半分に制限することができる。ｇｌＤｒａｗコマンドは次いで、ＧＰＵ２０に、左目画像を一時記憶のためにフレームバッファにレンダリングさせることができる。たとえば、フレームバッファは、右目画像が生成されるまで、左目画像を記憶することができる。次いで、ＧＰＵ２０は、フレームバッファの全体をディスプレイプロセッサ（図示せず）に出力することができる。ディスプレイプロセッサは、ディスプレイに、立体ビューを生成するために左目画像と右目画像とを表示させることができる。
【００８６】
グラフィックスドライバラッパー１６は、左目画像を生成するためではあっても、右目画像を生成するための同じステップを繰り返してよい。たとえば、グラフィックスドライバラッパー１６は、シェーダプロセッサ２２に、修正された頂点シェーダ３０のオブジェクトコードを実行させるための別の命令を発行する。さらに、グラフィックスドライバラッパー１６は、右目画像用のクリッピング座標を生成するために、修正された頂点シェーダ３０がｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ変数から減算するべき定数値を送信する。修正された頂点シェーダ３０のオブジェクトコードを実行したことによる、シェーダプロセッサ２２の出力は、右目画像の頂点についてのクリッピング座標である。
【００８７】
上述したように、グラフィックスドライバラッパー１６は、命令ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝（ｚnear＊ｗworld／（Ｒ−Ｌ）／２）＊Ｘ、または単にｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝Ｘを、頂点シェーダ２８のソースコードに追加すればよい。左目画像に対して、変数Ｘの値は、＋Ｄ（たとえば、閲覧者の目と目との間の距離の半分）であり得る。本開示の例では、右目画像に対して、変数Ｘの値は−Ｄであり得る。変数Ｘの値は−Ｄであるので、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝コマンドは、シェーダプロセッサ２２に、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ変数に記憶された値からＤの値を減算させる（たとえば、ｘclipの値からＤを減算させる）。
【００８８】
グラフィックスドライバラッパー１６は、右目画像用のビューポートも定義する。上述したように、左目画像に対して、グラフィックスドライバラッパー１６は、左目画像をディスプレイの左半分に制限するために、ビューポートを、ｇｌＶｉｅｗｐｏｒｔ（０，０，ｗｉｄｔｈ／２，ｌｅｎｇｔｈ）になるように定義する。右目画像に対して、グラフィックスドライバラッパー１６は、ビューポートを、ｇｌＶｉｅｗｐｏｒｔ（ｗｉｄｔｈ／２，０，ｗｉｄｔｈ／２，ｌｅｎｇｔｈ）になるように定義すればよい。この例では、（ｗｉｄｔｈ／２，０）座標は、右目画像がディスプレイの中央から始まり、右に伸びることを示す。また、ｇｌＶｉｅｗｐｏｒｔコマンド中の（ｗｉｄｔｈ／２，ｌｅｎｇｔｈ）変数は、右目画像がディスプレイの幅の半分およびディスプレイの全長だけ伸びることを示す。
【００８９】
それゆえ、この例では、修正されたｇｌＶｉｅｗｐｏｒｔコマンド（たとえば、ｇｌＶｉｅｗｐｏｒｔ（ｗｉｄｔｈ／２，０，ｗｉｄｔｈ／２，ｌｅｎｇｔｈ））は、右目画像をディスプレイの右半分に制限することになる。たとえば、修正されたｇｌＶｉｅｗｐｏｒｔコマンドは、右目画像がディスプレイの中央から始まり（たとえば、ｘ軸上のｗｉｄｔｈ／２ポイントから始まり）、「ｗｉｄｔｈ／２」の距離だけ右に伸びることを示し、その結果、右目画像をディスプレイの右半分に制限することになる。また、修正されたｇｌＶｉｅｗｐｏｒｔコマンドは、右目画像が、ディスプレイの下から始まり（たとえば、ｙ軸上の０ポイントから始まり）、「ｌｅｎｇｔｈ」の距離だけ上に伸びることを示し、その結果、画像をディスプレイの上および下に制限することになる。
【００９０】
グラフィックスドライバラッパー１６は次いで、第２のｇｌＤｒａｗコマンドをＧＰＵ２０に発行すればよい。ｇｌＤｒａｗコマンドに応答して、ＧＰＵ２０は、固定機能パイプライン２４とフラグメントシェーダとを介した、修正された頂点シェーダ３０のオブジェクトコードの実行によって生成された右目画像についてのクリッピング座標を処理することができる。この例では、第２のｇｌＶｉｅｗｐｏｒｔコマンドは、右目画像をディスプレイの右半分に制限することができる。ｇｌＤｒａｗコマンドは次いで、ＧＰＵ２０に、右目画像を一時記憶のためにフレームバッファにレンダリングさせることができる。この場合、ＧＰＵ２０は、左目画像をフレームバッファにすでに記憶していてよく、ＧＰＵ２０は、立体ビューを生成するために、ディスプレイプロセッサに、記憶された左目画像と右目画像とをフレームバッファから取り出し、表示するよう命令することができる。
【００９１】
上述したように、グラフィックスドライバラッパー１６は、命令ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝Ｘコマンドを、頂点シェーダ２８のソースコードに追加すればよい。左目画像と右目画像との間のわずかなずれを引き起こして、立体ビューのポップアウトまたはプッシュ効果を引き起こす、頂点シェーダ２８のソースコードに追加されるのは、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝コマンドである。左目画像および右目画像をディスプレイの適切な部分（たとえば、それぞれ、ディスプレイの左半分および右半分）に制限するのは、モノビュー用のビューポートを定義する命令（たとえば、ｇｌＶｉｅｗｐｏｒｔ）を、右目画像および左目画像用のビューポートを定義する命令に修正することである。
【００９２】
理解をさらに助けるために、グラフィックスドライバラッパー１６は、頂点シェーダ２８の命令を、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝コマンドを含むように修正していないが、グラフィックスドライバラッパー１６は、ｇｌＶｉｅｗｐｏｒｔコマンドを修正し、ＧＰＵ２０に、２つのｇｌＶｉｅｗｐｏｒｔコマンドと２つのｇｌＤｒａｗコマンドとを実行させたと仮定する。この場合、ＧＰＵ２０は、２つのｇｌＤｒａｗコマンドにより、２つの画像をレンダリングすることになる。ただし、この例では理解を助けるために、これらの２つの画像が互いの上に位置する場合、ずれはなく、２つの画像の内容は完全に整列することになる。２つの画像の内容にずれがないので、いかなる立体効果もなく、画像は、閲覧者には、ディスプレイの２Ｄエリアに制限された単一画像として見えることになる。ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝コマンドを含めると、２つの画像の内容にずれが引き起こされ得る。次いで、閲覧者が左目画像と右目画像とを同時に見ると、左目画像は右目から遮断され、右目画像は左目から遮断され、閲覧者の脳は、２つの画像の内容のずれを解消して、立体ビューのポップアウトまたはプッシュイン作用を生じさせる。
【００９３】
さらに、いくつかの例では、グラフィックスドライバラッパー１６は、上述した修正に加え、ビューポートをさらに修正することができる。たとえば、上述したように、グラフィックスドライバラッパー１６は、左目画像に対するｇｌＶｉｅｗｐｏｒｔ命令をｇｌＶｉｅｗｐｏｒｔ（０，０，ｗｉｄｔｈ／２，ｌｅｎｇｔｈ）に修正し、右目画像に対するｇｌＶｉｅｗｐｏｒｔ命令をｇｌＶｉｅｗｐｏｒｔ（ｗｉｄｔｈ／２，０，ｗｉｄｔｈ／２，ｌｅｎｇｔｈ）に修正することができる。閲覧者がこれらの２つの画像（たとえば、立体ビュー）を見ると、閲覧者は、ゼロ視差平面（ＺＤＰ）上の３Ｄボリュームを取り囲む立体画像を知覚することができる。
【００９４】
ＺＤＰは、ディスプレイからポップアウトされ、またはディスプレイにプッシュインされるように見え（たとえば、ディスプレイの前または後ろに見え）得る。ただし、ＺＤＰの場所は、必ずしも所望の場所にはなくてよい。たとえば、ＺＤＰがさらにポップアウトされ、それほどポップアウトされず、それほどプッシュインされず、またはさらにプッシュインされる場合、閲覧者は、豊かな、より現実的な視認体験を体験することができる。
【００９５】
ビューポートシフトまたはＺＤＰのシフトと呼ばれ得るＺＤＰを変更するために、グラフィックスドライバラッパー１６は、左目画像および右目画像に対する左境界をシフトしてよい。たとえば、立体ビューがディスプレイからポップアウトされる量を変更するために、左目画像に対して、グラフィックスドライバラッパー１６は、ｇｌＶｉｅｗｐｏｒｔコマンドを（０−Ｖｐｓ，０，ｗｉｄｔｈ／２，ｌｅｎｇｔｈ）に修正してよく、右目画像に対して、グラフィックスドライバラッパー１６は、ｇｌＶｉｅｗｐｏｒｔコマンドを（（ｗｉｄｔｈ／２＋Ｖｐｓ），０，ｗｉｄｔｈ／２，ｌｅｎｇｔｈ）に修正してよい。
【００９６】
これらの例では、Ｖｐｓ値は、ビューポートシフトを指し、左目画像のビューポートがシフトする量と、右目画像のビューポートがシフトする量とを示す。Ｖｐｓ値は、ユーザ選択可能であっても、あらかじめプログラムされてもよい。たとえば、閲覧者が、ＺＤＰを現在の場所から（たとえば、ビューポートシフトに先立って）シフトすることを望む場合、閲覧者は、ＺＤＰの所望の場所を実現するＶｐｓ値を選択すればよい。あるいは、Ｖｐｓ値は、ＺＤＰが最適に位置すると閲覧者が見なした場所の測定値を与えるテストに基づいて、あらかじめプログラムすることができる。たとえば、Ｖｐｓが正の値の場合、立体ビューがポップアウトされる量は減少し得る（たとえば、ＺＤＰ面は、ディスプレイに比較的近い）。Ｖｐｓが負の値の場合、立体ビューがポップアウトされる量は増大し得る（たとえば、ＺＤＰ面は、ディスプレイからさらに離れる）。
【００９７】
いくつかの例では、ビューポートシフトに加え、グラフィックスドライバラッパー１６は、ビューポートストレッチのために、左目画像および右目画像用のｇｌＶｉｅｗｐｏｒｔコマンドを修正することができる。ビューポートストレッチは、ビューポートのサイズをストレッチすることと見なしてよく、左目画像および右目画像のストレッチを生じ得る。いくつかの事例では、ビューポートシフトおよびビューポートストレッチの結果、より良好な立体ビューが生じ得る。ビューポートシフトおよびビューポートストレッチは一般に、ビューポートの修正と呼ぶことができる。言い換えれば、グラフィックスドライバラッパー１６は、アプリケーション３２によって発行されたｇｌＶｉｅｗｐｏｒｔコマンドを、それぞれ、左目画像および右目画像用のビューポートを定義する、左目画像および右目画像用のｇｌＶｉｅｗｐｏｒｔコマンドを生成するように修正することができる。この例では、グラフィックスドライバラッパー１６は、左目画像および右目画像のビューポートをさらに修正することができる（たとえば、ビューポートシフトまたはビューポートシフトおよびビューポートストレッチ）。
【００９８】
左目画像用のビューポートをストレッチするために、グラフィックスドライバラッパー１６は、左目画像用のｇｌＶｉｅｗｐｏｒｔコマンドを、ｇｌＶｉｅｗｐｏｒｔ（０−Ｖｐｓ，０，ｗｉｄｔｈ／２＋Ｖｐｓ，ｌｅｎｇｔｈ）となるように修正すればよい。右目画像用のビューポートをストレッチするために、グラフィックスドライバラッパー１６は、右目画像用のｇｌＶｉｅｗｐｏｒｔコマンドを、ｇｌＶｉｅｗｐｏｒｔ（ｗｉｄｔｈ／２，０，ｗｉｄｔｈ／２＋Ｖｐｓ，ｌｅｎｇｔｈ）となるように修正すればよい。例示的技法において、ビューポートシフトおよびビューポートストレッチは、すべての事例において必要でなくてもよい。たとえば、いくつかの例では、グラフィックスドライバラッパー１６は、アプリケーション３２によって発行されたｇｌＶｉｅｗｐｏｒｔコマンドを、左目画像および右目画像用のｇｌＶｉｅｗｐｏｒｔコマンドに修正することができ、いかなる追加ビューポートシフトまたはストレッチも実施しなくてよい。いくつかの代替例では、グラフィックスドライバラッパー１６は、アプリケーション３２によって発行されたｇｌＶｉｅｗｐｏｒｔコマンドを修正し、左目画像および右目画像のビューポートをさらに修正することができる（たとえば、ビューポートシフト、またはビューポートシフトおよびビューポートストレッチ）。
【００９９】
いくつかの例では、ビューポートシフトおよびビューポートストレッチは、ｇｌＶｉｅｗｐｏｒｔコマンドの修正と同時に実施することができる。たとえば、上述したように、グラフィックスドライバラッパー１６は、左目画像に対するｇｌＶｉｅｗｐｏｒｔコマンドをｇｌＶｉｅｗｐｏｒｔ（０，０，ｗｉｄｔｈ／２，ｌｅｎｇｔｈ）に修正し、右目画像用をｇｌＶｉｅｗｐｏｒｔ（ｗｉｄｔｈ／２，０，ｗｉｄｔｈ／２，ｌｅｎｇｔｈ）に修正することができる。いくつかの例では、ユーザがビューポートシフト値（たとえば、Ｖｐｓ）を入力することを望む場合、グラフィックスドライバラッパー１６は、上述したように、ビューポートをシフトし、またはシフトおよびストレッチすることができる。代替例では、グラフィックスドライバラッパー１６は、Ｖｐｓ値があらかじめプログラムされている例において、ｇｌＶｉｅｗｐｏｒｔコマンドを修正するとき、Ｖｐｓ値を事前に加算または減算することができる。
【０１００】
一例として、ディスプレイのサイズが１０ｘ１０ピクセルであり、Ｖｐｓ値は、立体ビューがポップアウトされる量を減らすために、２になるように選択され、またはあらかじめプログラムされると仮定する。この例では、ビューポートシフトに先立って、左目画像用のビューポートは（０，０，５，９）であってよく、右目画像用のビューポートは（５，０，５，９）であってよい。グラフィックスドライバラッパー１６は、ＺＤＰをシフトするために２（たとえば、Ｖｐｓの値）を減算することによって、左目画像用のビューポートをシフトすることができる。この例では、左目画像用のビューポートは（−２，０，５，９）になり得る。グラフィックスドライバラッパー１６は、ＺＤＰをシフトするために２（たとえば、Ｖｐｓの値）を加算することによって、右目画像用のビューポートをシフトすることができる。この例では、右目画像用のビューポートは（７，０，５，９）になり得る。同様の算出を実施して、ビューポートストレッチ後のビューポートを決定することができる。
【０１０１】
ビューポートシフトされた左目画像に対して、ＧＰＵ２０は、左目画像のピクセルのうち一部をクロップすることができる。たとえば、ディスプレイの座標は、この例では（０，０，９，９）であり得る。ただし、ビューポートシフトされた左目画像についての座標は（−２，０，５，９）であってよく、これは、ビューポートシフトされた左目画像がディスプレイの左エッジよりもさらに左で始まることを意味する。ＧＰＵ２０の固定機能パイプライン２４は、ディスプレイの左エッジよりも座標がさらに左であるピクセルをクロップすることができる。同様に、ビューポートシフトされた右目画像に対して、ＧＰＵ２０は、右目画像のピクセルのうち一部をクロップすることができる。たとえば、ビューポートシフトされた右目画像についての座標は（７，０，５，９）であってよく、これは、ビューポートシフトされた右目画像がディスプレイの右エッジよりもさらに右で終わることを意味する。ＧＰＵ２０の固定機能パイプライン２４は、ディスプレイの右エッジよりも座標がさらに右であるピクセルをクロップすることができる。やはり、同様の算出を、ビューポートストレッチ用に実施することができる。
【０１０２】
ビューポートシフトまたはシフトおよびストレッチされたＺＤＰ（たとえば、ビューポートシフトまたはシフトおよびストレッチされた左目画像および右目画像から得られたＺＤＰ）の場所は、以下の式によって決定することができる。
【数７】
0005694577.tif 000008
【０１０３】
上式で、ＺＤＰ’は、ビューポートシフトされたＺＤＰの場所に等しく、ｚnearは、ＰＲＪ行列（式４）中で定義され、Ｄは、閲覧者の左目と右目との間の半分の距離であり、ＺＤＰは、元の（たとえば、ビューポートシフトに先立つ）場所であり、Ｖｐｓは、左目画像および右目画像の左境界がシフトされる量である。
【０１０４】
いくつかの事例では、ｚnear、ＺＤＰ、Ｄ、またはＶｐｓの値は、閲覧者にとって利用可能でない場合がある。これらの事例において、閲覧者が望ましいビューポートシフトされたＺＤＰまたはシフトおよびストレッチされたＺＤＰを見つけるまで、閲覧者は、依然としてＶｐｓ値を修正する（たとえば、値を増分し、または値を減分する）ことができる。Ｖｐｓ値の修正は、すべての例において必要なわけではなく、あらかじめプログラムされたＶｐｓ値により、適度に豊かであり現実的な視認体験がほとんどの閲覧者に提供される場合もある。
【０１０５】
いくつかの例では、本開示に記載する技法は、モノビュー用の画像を生成するための命令を、実行またはランタイム中に、立体ビュー用の画像を生成するように修正してよい。たとえば、閲覧者は、アプリケーション３２を実行用に選択することができ、アプリケーション３２は、アプリケーション３２の実行によって生成されたグラフィックスを処理するための頂点シェーダ２８の実行を要求し得る。アプリケーション３２がデバイス１０上で実行または稼動している間、グラフィックスドライバ１４、グラフィックスドライバラッパー１６、およびコンパイラ１８は、それぞれの機能を実施して、頂点シェーダ２８のソースコードを修正し、修正された頂点シェーダ３０用のオブジェクトコードを生成することができる。たとえば、グラフィックスドライバラッパー１６は、ランタイム中に、アプリケーション３２によって発行されたｇｌＶｉｅｗｐｏｒｔコマンドをインターセプトし、いくつかの例では、ランタイム中に、アプリケーション３２によって発行されたｇｌＶｉｅｗｐｏｒｔコマンドの、ＧＰＵ２０への送信を阻止し、または他の例では、アプリケーション３２によって発行されたｇｌＶｉｅｗｐｏｒｔコマンドの、ＧＰＵ２０への送信を許可することができる。いずれの例においても、グラフィックスドライバラッパー１６は、アプリケーション３２によって発行されたｇｌＶｉｅｗｐｏｒｔコマンドを修正することができ、そうすることによって、ＧＰＵ２０によって実行されるｇｌＶｉｅｗｐｏｒｔコマンドは、グラフィックスドライバラッパー１６によって修正された、修正されたｇｌＶｉｅｗｐｏｒｔコマンドである。
【０１０６】
さらに、アプリケーション３２が描画コマンド（たとえば、ｇｌＤｒａｗ）を発行すると、グラフィックスドライバラッパー１６は、このｇｌＤｒａｗを捕捉し、ＧＰＵ２０への送信を阻止すればよい。このｇｌＤｒａｗコマンドは、アプリケーション３２がランタイム中に発行したものであり、グラフィックスドライバラッパー１６に、上述したように、左目画像および右目画像用のビューポートを定義する命令を含めさせ、ＧＰＵ２０に左目画像および右目画像用のグラフィックスコンテンツを生成させるための２つのｇｌＤｒａｗコマンドを含めさせるトリガとして機能し得る。
【０１０７】
また、上記の例は、グラフィックスドライバラッパー１６が頂点シェーダ２８に命令を追加し、頂点シェーダ２８の命令を修正し、ビューポートを定義する命令を修正するコンテキストにおいて説明してあるが、本開示の態様は、そのように限定されるわけではない。代替例では、グラフィックスドライバラッパー１６よりもむしろ、グラフィックスドライバ１４またはコンパイラ１８が、頂点シェーダ２８の命令と、ビューポートを定義する命令とを修正することが可能な場合がある。ただし、これらの例は、グラフィックスドライバ１４またはコンパイラ１８に対する修正を要求するわけではない。
【０１０８】
グラフィックスドライバ１４またはコンパイラ１８に対する修正は、ＧＰＵ２０が立体ビュー用の左目画像と右目画像とを生成するように、グラフィックスドライバラッパー１６を開発し、グラフィックスドライバラッパー１６に、本開示に記載する機能を実施させるよりも困難な場合がある。たとえば、デバイス１０は、以前から存在するグラフィックスドライバ１４およびコンパイラ１８をロード済みである場合があり、グラフィックスドライバ１４とコンパイラ１８とを変更することは困難な場合がある。頂点シェーダ２８に対する修正を実施するグラフィックスドライバラッパー１６を追加することによって、例示的技法は、以前から存在するグラフィックスドライバ１４およびコンパイラ１８に対する修正を要求するわけではない。
【０１０９】
さらに、上述した技法により、ＧＰＵ２０は、アプリケーション３２に対する修正なしで、立体ビュー用の画像を生成することが可能になり得る。たとえば、立体ビューを生成するためのいくつかの他の技法は、アプリケーション３２の開発者が、アプリケーション３２のソースコードを、左目画像および右目画像用のピクセル値を生成するように修正することを要求する場合がある。これらの技法は、アプリケーション３２の開発者に対して、立体ビュー用の開発者のアプリケーションを修正するための支援を要求しており、これは、アプリケーション３２の開発者にとって面倒な作業になり得る。上述した例示的技法は、アプリケーション３２の開発者からのいかなる支援もなしで、モノビュー用に開発されたアプリケーション３２用の立体ビューを提供することができる。
【０１１０】
また、上述した技法は、立体ビュー用の左目画像および右目画像を生成するための、システムメモリ２６に対する複数の呼出しを要求するわけではない。たとえば、立体ビューを生成するためのいくつかの他の技法では、ＧＰＵは、左目画像を生成することになる。左目画像の生成が完了すると、ＧＰＵは、右目画像を生成するために、左目画像を生成する間、システムメモリ２６に記憶された深度情報を使用することになる。ただし、深度情報を取り出すための、システムメモリ２６に対する反復呼出しは、計算コストが高い場合があり、過度の電力消費を要求する場合がある。
【０１１１】
上述した例示的技法は、右目画像を生成するために、左目画像についての深度情報を求める、システムメモリ２６に対する、そのような複数の呼出しを要求するわけではない。たとえば、グラフィックスドライバラッパー１６は、頂点シェーダ２８のソースコードと、ビューポートを定義する命令とを修正して、左目画像および右目画像を互いから独立して生成することができ、一方の画像の深度情報を、他方の画像を生成するのには必ずしも必要としない。たとえば、上述した、頂点シェーダ２８中に追加される命令およびｇｌＶｉｅｗｐｏｒｔコマンドの修正ならびに２つのｇｌＤｒａｗコマンドの発行は、どの深度情報も要求するわけではなく、いくつかの例では、右目画像についての情報を要求することなく、左目画像を生成することができ、その逆も同様である。このように、本開示に記載する技法は、他の技法と比較して、立体ビューを生成するための、システムメモリ２６へのアクセスの回数を減らすことができる。
【０１１２】
さらに、上述したように、ｇｌＶｉｅｗｐｏｒｔコマンドは、固定機能パイプライン２４の固定機能ユニット（たとえば、固定機能パイプライン２４のビューポート変換ユニット）によって使用されるのであって、シェーダプロセッサ２２によって使用されるのではない。このように、頂点シェーダ２８用のソースコードは、ディスプレイの第１の部分（たとえば、ディスプレイの左半分）への左目画像のレンダリングを強制し、ディスプレイの他の部分（たとえば、ディスプレイの右半分）への右目画像のレンダリングを強制するように修正される必要はなくてよい。そうではなく、固定機能パイプライン２４の固定機能ユニットは、修正されたｇｌＶｉｅｗｐｏｒｔコマンドを適用して、左目画像をディスプレイの左目画像部分に、右目画像をディスプレイの右目画像部分に制限すればよい。こうすることにより、頂点シェーダ２８に対する修正を削減および単純化することができ、シェーダプロセッサ２２の計算効率を上げることができる。
【０１１３】
たとえば、本開示の技法によると、グラフィックスドライバラッパー１６は、頂点シェーダ２８のソースコードを、左目画像と右目画像との間にずれを与えるように修正することができる。たとえば、左目画像および右目画像用のクリッピング頂点座標を生成するとき、修正された頂点シェーダ３０のオブジェクトコードを実行中のシェーダプロセッサ２２は、生成されたグラフィックスデータがどこに表示されるか気づかない場合がある。言い換えれば、シェーダプロセッサ２２には、左目画像および右目画像についてのグラフィックスデータがどこに提示されるべきかを定義するタスクを課さなくてよい。シェーダプロセッサ２２の外部のユニットである固定機能パイプライン２４のビューポート変換ユニットに、左目画像および右目画像をディスプレイのそれぞれの部分に制限するタスクを課せばよい。このように、シェーダプロセッサ２２は、左目画像および右目画像がどこに表示されるべきか判断する際、計算周期を浪費する必要がなくてよい。固定機能パイプライン２４のビューポート変換ユニットのハードワイヤード機能性は、シェーダプロセッサ２２と比較して、左目画像、右目画像をディスプレイ上のそれぞれの部分に制限するのにより適している可能性がある。
【０１１４】
たとえば、頂点シェーダ２８用のソースコードが、ゼロ視差平面（ＺＤＰ）を制御するように、左目画像および右目画像がどこに表示されるか判断するように修正されている場合、ソースコードは、シェーダプロセッサ２２に、左目画像および右目画像中のプリミティブの各々の各頂点についての座標を決定するよう要求する場合がある。これにより、シェーダプロセッサ２２は、複数の計算周期を実施することを要求される場合があり、その結果、シェーダプロセッサ２２の効率が低下する可能性がある。固定機能パイプライン２４のビューポート変換ユニットにおいて、ビューポート変換と、ビューポートシフトまたはシフトおよびストレッチとを実施する（たとえば、ＺＤＰを調整するためにＶｐｓ値に基づいてビューポートをさらに修正する）ことによって、本開示の態様は、シェーダプロセッサ２２において計算周期を浪費させることなく、豊かな立体ビューを提供することができる。
【０１１５】
上述したように、グラフィックスドライバラッパー１６は、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ変数の値を修正するｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝（ｚnear＊ｗworld／（Ｒ−Ｌ）／２）＊Ｘまたは単にｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝Ｘコマンドを、頂点シェーダ２８のソースコード中に含めればよい。以下に、このように頂点シェーダ２８のソースコード中に命令を含める理由を挙げる。
【０１１６】
式（１）において上で示したように、Ｖｃｌｉｐ＝ＰＲＪ＊Ｖｅｙｅ＝ＰＲＪ＊ＭＶＴ＊Ｖｗｏｒｌｄである。Ｖｃｌｉｐについての式は、左目および右目についてのクリッピング座標を生成するように修正することができる。たとえば、左目および右目についてのクリッピング座標は、以下のようになり得る。
【数８】
0005694577.tif 000009
【数９】
0005694577.tif 000010
【０１１７】
ＶＴｌｅｆｔ−ｅｙｅおよびＶＴｒｉｇｈｔ−ｅｙｅは、モノビューから離れている左目と右目の、仮定された距離に基づく４ｘ４行列でよい。モノビューの座標は（０，０，０）であってよく、左目は、（−Ｄ，０，０）に位置するものと見なすことができ、右目は、（Ｄ，０，０）に位置するものと見なすことができる。言い換えると、（０，０，０）の場所は、閲覧者の右目と左目の中心にあるものとして見なすことができる。左目が、右目と左目の中心から−Ｄだけ離れて位置するように見なされ、右目が、右目と左目の中心から＋Ｄだけ離れて位置するように見なされる場合、Ｄは、閲覧者の右目と左目との間の距離の半分を示す。
【０１１８】
ＶＴｌｅｆｔ−ｅｙｅおよびＶＴｒｉｇｈｔ−ｅｙｅについての行列は、次のように定義することができる。
【数１０】
0005694577.tif 000011
【０１１９】
ＶＴｌｅｆｔ−ｅｙｅおよびＶＴｒｉｇｈｔ−ｅｙｅは、２つの行列の和として書き直すことができる。たとえば、ＶＴｌｅｆｔ−ｅｙｅは、次のように書き直すことができる。
【数１１】
0005694577.tif 000012
【０１２０】
ＶＴｒｉｇｈｔ−ｅｙｅは、次のように書き直すことができる。
【数１２】
0005694577.tif 000013
【０１２１】
Ｖｃｌｉｐ＿ｌｅｆｔ−ｅｙｅについての式（式７）にＶＴｌｅｆｔ−ｅｙｅ行列を代入することによって、Ｖｃｌｉｐ＿ｌｅｆｔ−ｅｙｅは、Ｖｃｌｉｐ＿ｌｅｆｔ−ｅｙｅ＝
【数１３】
0005694577.tif 000014
【０１２２】
と等しくなる。
【０１２３】
Ｖｃｌｉｐ＿ｒｉｇｈｔ−ｅｙｅについての式（式８）にＶＴｒｉｇｈｔ−ｅｙｅ行列を代入することによって、Ｖｃｌｉｐ＿ｒｉｇｈｔ−ｅｙｅは、ＶＴｃｌｉｐ＿ｒｉｇｈｔ−ｅｙｅ＝
【数１４】
0005694577.tif 000015
【０１２４】
と等しくなる。
【０１２５】
式９と１０の両方において、たとえば、Ｖｃｌｉｐ＿ｌｅｆｔ−ｅｙｅおよびＶｃｌｉｐ＿ｒｉｇｈｔ−ｅｙｅに対して、
【数１５】
0005694577.tif 000016
【０１２６】
は、ＰＲＪ＊ＭＶＴ＊Ｖｗｏｒｌｄに単純化することができ、それは、
【数１６】
0005694577.tif 000017
【０１２７】
が、ユニティ行列であり、１での乗算に等価であるからである。
【０１２８】
式１において上述したように、ＰＲＪ＊ＭＶＴ＊Ｖｗｏｒｌｄは、Ｖｃｌｉｐに等しい。それゆえ、Ｖｃｌｉｐ＿ｌｅｆｔ−ｅｙｅおよびＶｃｌｉｐ＿ｒｉｇｈｔ−ｅｙｅの式（たとえば、それぞれ、式９および１０）は、次のように書き直すことができる。
【数１７】
0005694577.tif 000018
【０１２９】
および
【数１８】
0005694577.tif 000019
【０１３０】
ＰＲＪおよびＭＶＴについての行列（それぞれ、式４および５）を代入し、式１１の行列乗算を実施することによって、Ｖｃｌｉｐ＿ｌｅｆｔ−ｅｙｅについての式は、
【数１９】
0005694577.tif 000020
【０１３１】
に、より具体的には
【数２０】
0005694577.tif 000021
【０１３２】
に単純化することができる。
【０１３３】
Ｖｃｌｉｐ＿ｌｅｆｔ−ｅｙｅについても同様の代入を行い、Ｖｃｌｉｐ＿ｒｉｇｈｔ−ｅｙｅの式は、
【数２１】
0005694577.tif 000022
【０１３４】
に、より具体的には
【数２２】
0005694577.tif 000023
【０１３５】
に単純化することができる。
【０１３６】
式１３および１４から、定数
【数２３】
0005694577.tif 000024
【０１３７】
を、算出されたｘclip座標に加算し、他のすべてのクリッピング座標を同じに保つことによって、頂点シェーダ２８は、左目画像についてのクリッピング座標を生成し得ることがわかる。同様に、定数
【数２４】
0005694577.tif 000025
【０１３８】
をｘclip座標から減算し、他のすべてのクリッピング座標を同じに保つことによって、頂点シェーダ２８は、右目画像用のクリッピング座標を生成することができる。少なくともこれらの理由により、グラフィックスドライバラッパー１６は、命令ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝ｚnear＊ｗworld／（（Ｒ−Ｌ）／２）＊Ｘを含むことができ、ここでＸは、左目画像を生成するためには＋Ｄに等しく、Ｘは、右目画像を生成するためには−Ｄに等しい。
【０１３９】
いくつかの例では、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝コマンドを、単なるｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝Ｘにさらに単純化することも可能な場合がある。たとえば、ｗworld変数が１にセットされることが一般的である。また、ＯｐｅｎＧＬ、ＯｐｅｎＧＬ  ＥＳ、およびＯｐｅｎＧＬ  ＥＳ２．０は、プログラマブルシェーダを用いて、錐台を、
【数２５】
0005694577.tif 000026
【０１４０】
となるように定義し、ここでｆｏｖxは、ＯｐｅｎＧＬ、ＯｐｅｎＧＬ  ＥＳ、およびＯｐｅｎＧＬ  ＥＳ２．０において定義される錐台である。視野角が４５度にセットされることも一般的であり、これは、ｃｏｔ（ｆｏｖx）が１に等しいことを意味する。これは、
【数２６】
0005694577.tif 000027
【０１４１】
が１に等しいことを意味する。それゆえ、これらの例では、
【数２７】
0005694577.tif 000028
【０１４２】
が単なるＸに単純化する（たとえば、
【数２８】
0005694577.tif 000029
【０１４３】
が１に等しく、ｗworldが１に等しい）。これらの例では、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝変数は、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝Ｘに単純化し得る。
【０１４４】
したがって、式７〜１４は、命令ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝（ｚnear＊ｗworld／（Ｒ−Ｌ）／２）＊Ｘ、またはｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝Ｘを頂点シェーダ２８に追加することが、２回実行されたとき、およびＸが、第１の実行では＋Ｄに、第２の実行では−Ｄに等しい場合、モノビュー画像をずらして立体ビューを生成するのになぜ十分であり得るかという理由を示す数学的基礎を提供する。このように、本開示の技法は、モノビュー用に設計される頂点シェーダ２８のソースコードに対するささいな修正を、修正されたソースコードがコンパイルされ実行される（たとえば、修正された頂点シェーダ３０のオブジェクトコードの実行）と、得られた画像が閲覧者に立体ビューを提供し得るように、可能にすることができる。立体ビューは、閲覧者に３Ｄ体験を提供することができ、これは、ディスプレイの２Ｄエリアによって限定された画像を見るのと比較して、より豊かでありより十分な体験であり得る。
【０１４５】
いくつかの例では、（ｚnear＊ｗworld／（Ｒ−Ｌ）／２）が１に単純化しない（たとえば、視野角が４５度ではないのでｃｏｔ（ｆｏｖx）が１に等しくない、および／またはｗworldが１に等しくない場合）ときであっても、グラフィックスドライバラッパー１６は、コマンドｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝Ｘを含み得る。たとえば、ｚnear、ｗworld、Ｒ、およびＬは各々が定数なので、（ｚnear＊ｗworld／（Ｒ−Ｌ）／２）は、定数であり得る。（ｚnear＊ｗworld／（Ｒ−Ｌ）／２）は定数なので、（ｚnear＊ｗworld／（Ｒ−Ｌ）／２）＊Ｘの値は、Ｘが定数なので定数である。この場合、（ｚnear＊ｗworld／（Ｒ−Ｌ）／２）＊Ｘは、単にＸであってよい、単一の定数を表すように縮小することができる。この場合、Ｘの値は、ユーザ指定されても、あらかじめプログラムされてもよい。たとえば、上記例において、Ｘは、左目画像に対しては＋Ｄに、右目画像に対しては−Ｄに等しかった。本例において、Ｘは、左目画像に対しては（ｚnear＊ｗworld／（Ｒ−Ｌ）／２）＊Ｄに、右目画像に対しては（ｚnear＊ｗworld／（Ｒ−Ｌ）／２）＊−Ｄに等しくてよく、ここで（ｚnear＊ｗworld／（Ｒ−Ｌ）／２）およびＤは、ｚnear、ｗworld、Ｒ、およびＬ値がシェーダプロセッサ２２にとって利用可能でない場合、あらかじめプログラムされた値に対して、ユーザ指定であってよい。
【０１４６】
ｚnear、ｗworld、Ｒ、およびＬ値がシェーダプロセッサ２２にとって利用可能な場合、シェーダプロセッサ２２は、（ｚnear＊ｗworld／（Ｒ−Ｌ）／２）の値を決定し、その値を、ＧＰＵ２０が左目画像それとも右目画像用のグラフィックスコンテンツを生成中であるかに基づいて、＋Ｄまたは−Ｄで乗算することができる。また、やはり、ｃｏｔ（ｆｏｖx）およびｗworldが両方とも１に等しい場合、（ｚnear＊ｗworld／（Ｒ−Ｌ）／２）は、１に単純化してよい。
【０１４７】
図２は、本開示に記載する１つまたは複数の例示的技法を実装し得るグラフィックス処理ユニット（ＧＰＵ）の例を示すブロック図である。たとえば、図２は、ＧＰＵ２０の構成要素をより詳細に示す。図２に示すように、ＧＰＵ２０は、コマンドプロセッサ５４と、シェーダプロセッサ２２と、固定機能パイプライン２４とを含む。コマンドプロセッサ５４は、ＧＰＵ２０とアプリケーションプロセッサ１２との間のインターフェースとして機能することができる。たとえば、コマンドプロセッサ５４は、アプリケーションプロセッサ１２からコマンドを受信することができ、コマンドがシェーダプロセッサ２２それとも固定機能パイプライン２４に転送されるべきか判断することができる。
【０１４８】
一例として、上述したように、アプリケーション３２を実行するアプリケーションプロセッサ１２は、ＧＰＵ２０に、修正された頂点シェーダ３０のオブジェクトコードを実行するよう命令することができる。この例では、コマンドプロセッサ５４は、アプリケーションプロセッサ１２からコマンドを受信することができ、シェーダプロセッサ２２に、修正された頂点シェーダ３０のオブジェクトコードを実行するよう命令することができる。別の例として、上述したように、グラフィックスドライバラッパー１６は、アプリケーション３２によって発行されたｇｌＶｉｅｗｐｏｒｔコマンドを修正し、修正されたｇｌＶｉｅｗｐｏｒｔコマンドをＧＰＵ２０に与えることができる。この例では、コマンドプロセッサ５４は、修正されたｇｌＶｉｅｗｐｏｒｔコマンドを受信し、このコマンドが、固定機能パイプライン２４のビューポート変換ユニット４２向けであると判断することができる。コマンドプロセッサ５４は、修正されたｇｌＶｉｅｗｐｏｒｔコマンドを、左目画像および右目画像用のビューポートを適用するためのビューポート変換ユニット４２に転送すればよい。
【０１４９】
たとえば、上述したように、アプリケーション３２は、ｇｌＤｒａｗコマンドを発行することができ、このコマンドの、ＧＰＵ２０への送信を、グラフィックスドライバラッパー１６が阻止する。ｇｌＤｒａｗコマンドは、修正された頂点シェーダ３０のオブジェクトコードを実行するための第１の命令をシェーダプロセッサ２２にグラフィックスドライバラッパー１６が発行するのをトリガすることができる。次に、シェーダプロセッサ２２は、修正された頂点シェーダ３０のオブジェクトコードを実行し、得られたクリッピング座標を、そのローカルメモリまたはシステムメモリ２６に記憶する。ｇｌＤｒａｗコマンドはまた、グラフィックスドライバラッパー１６に、第１の修正ｇｌＶｉｅｗｐｏｒｔ命令を発行させ、この命令はコマンドプロセッサ５４によって受信される。次いで、グラフィックスドライバラッパー１６は、第１のｇｌＤｒａｗコマンドを発行し、このコマンドはコマンドプロセッサ５４によって受信される。コマンドプロセッサ５４は、それに応答して、固定機能パイプライン２４およびシェーダプロセッサ２２の固定機能ユニットに、立体ビューの第１の画像（たとえば、左目画像）用のグラフィックスコンテンツを生成するための、それぞれの機能を実施させる。たとえば、より詳しく論じるように、第１のｇｌＤｒａｗコマンドに応答して、ビューポート変換ユニット４２は、第１の画像をディスプレイの第１の部分に制限し、フラグメント単位動作ユニット５０は、第１の画像のグラフィックスコンテンツをフレームバッファ５２に出力する。
【０１５０】
立体ビューの第１の画像がフレームバッファ５２に記憶された後、ＧＰＵ２０は、立体ビューの第２の画像用のグラフィックスコンテンツを生成するためのステップを繰り返す。たとえば、グラフィックスドライバラッパー１６は、修正された頂点シェーダ３０のオブジェクトコードを実行するための第２の命令をシェーダプロセッサ２２に発行する。次に、シェーダプロセッサ２２は、修正された頂点シェーダ３０のオブジェクトコードを実行し、得られたクリッピング座標を、そのローカルメモリまたはシステムメモリ２６に記憶する。グラフィックスドライバラッパー１６はまた、第２の修正されたｇｌＶｉｅｗｐｏｒｔ命令を発行し、この命令はコマンドプロセッサ５４によって受信される。次いで、グラフィックスドライバラッパー１６は、第２のｇｌＤｒａｗコマンドを発行し、このコマンドはコマンドプロセッサ５４によって受信される。コマンドプロセッサ５４は、それに応答して、固定機能パイプライン２４およびシェーダプロセッサ２２の固定機能ユニットに、立体ビューの第２の画像（たとえば、右目画像）用のグラフィックスコンテンツを生成するための、それぞれの機能を実施させる。たとえば、第２のｇｌＤｒａｗコマンドに応答して、ビューポート変換ユニット４２は、第２の画像をディスプレイの第２の部分に制限し、フラグメント単位動作ユニット５０は、第２の画像のグラフィックスコンテンツをフレームバッファ５２に出力する。ＧＰＵ２０のこの機能性については、以下の例においてより詳しく説明する。
【０１５１】
図２の破線ボックスに示すように、シェーダプロセッサ２２は、修正された頂点シェーダ３０とフラグメントシェーダ４６とを含む。破線ボックスは、シェーダプロセッサ２２が実際には修正された頂点シェーダ３０とフラグメントシェーダ４６とを含まなくてもよいことを示すためのものである。そうではなく、シェーダプロセッサ２２は、修正された頂点シェーダ３０およびフラグメントシェーダ４６のオブジェクトコードを実行することができる。修正された頂点シェーダ３０およびフラグメントシェーダ４６のオブジェクトコードは、システムメモリ２６に記憶することができる。
【０１５２】
固定機能パイプライン２４は、プリミティブアセンブリユニット３６、錐台ユニット３８、遠近除算ユニット４０、ビューポート変換ユニット４２、ラスター化ユニット４４、およびフラグメント単位動作ユニット５０など、１つまたは複数の固定機能ユニットを含み得る。固定機能パイプライン２４のこれらの固定機能ユニットの各々は、特定のグラフィックス関連機能を実施するように配線接続されたハードウェアユニットでよい。固定機能パイプライン２４のこれらの固定機能ユニットは、別個の構成要素として示してあるが、本開示の態様は、そのように限定されるわけではない。固定機能パイプライン２４の固定機能ユニットのうち１つまたは複数は、互いに組み合わせて共通固定機能ユニットにすることができる。また、図２に示すものよりも多くの、固定機能パイプライン２４の固定機能ユニットがあってもよい。固定機能パイプライン２４の１つまたは複数の固定機能ユニットは、理解しやすくするために、別々に示してある。
【０１５３】
さらに、固定機能パイプライン２４の固定機能ユニットの具体的な順序は、例示目的のために示されており、限定的と見なされるべきではない。たとえば、固定機能パイプライン２４の固定機能ユニットを並べ替えることが可能であり得る。一例として、フラグメント単位動作ユニット５０の機能のうち１つは、重複ピクセルによって塞がれるピクセルを選別するためのものであってよい。この機能が、固定機能パイプライン２４中でより早く実施されることが可能であってもよい。
【０１５４】
固定機能パイプライン２４のこれらの固定機能ユニットは、シェーダプロセッサ２２と比較して、非常に限定された機能的柔軟性を提供することができる。たとえば、シェーダプロセッサ２２は、修正された頂点シェーダ３０およびフラグメントシェーダ４６などのプログラマブルシェーダプログラムを実行するように特に設計され得る。これらのシェーダプログラムは、シェーダプロセッサ２２を、シェーダプログラムによって定義されたように機能させる。言い換えれば、シェーダプログラムは、シェーダプロセッサ２２の機能性を定義することができ、固定機能パイプライン２４の固定機能ユニットの機能性は設定される。
【０１５５】
上述したように、グラフィックスドライバラッパー１６は、ＧＰＵ２０に、修正された頂点シェーダ３０のオブジェクトコードを２回実行するよう命令することができ、ここで第１の実行は、立体ビューの画像のうち一方（たとえば、左目画像）の頂点についてのクリッピング座標の生成のためであり、第２の実行は、立体ビューの他方の画像（たとえば、右目画像）の頂点についてのクリッピング座標の生成のためである。修正された頂点シェーダ３０のオブジェクトコードを実行するための、これらの命令の各々に応答して、コマンドプロセッサ５４は、シェーダプロセッサ２２に、修正された頂点シェーダ３０のオブジェクトコードを取り出し、実行するよう命令することができる。上述したように、コンパイラ１８は、修正された頂点シェーダのソースコードをコンパイルし、得られたオブジェクトコードを、修正された頂点シェーダ３０のオブジェクトコードとして記憶することができる。図２に示すように、修正された頂点シェーダ３０は、頂点アレイ３４とテクスチャ４８とを入力として受信することができる。頂点アレイ３４は、上述したように、アプリケーション３２によって生成された頂点についてのピクセル値を生成するための情報（たとえば、頂点の座標、頂点の色値、および頂点の透明度値）を含み得る。たとえば、頂点アレイ３４の頂点の座標は、アプリケーション３２によって定義される世界座標であり得る。テクスチャ４８は、グラフィックスコンテンツのより現実的なビューを提供するように、生成されたグラフィックスに重なるテクスチャについてのピクセル値であり得る。
【０１５６】
シェーダプロセッサ２２上で実行する修正された頂点シェーダ３０は、頂点の各々についてのクリッピング座標を生成することができる。たとえば、修正された頂点シェーダ３０は、アプリケーション３２によって定義されるとともに頂点アレイ３４に記憶された頂点の世界座標を、図１を参照して上述した式１の行列乗算を実施することによって、頂点の各々についてのクリッピング座標にコンバートすることができる。さらに、シェーダプロセッサ２２上で実行する修正された頂点シェーダ３０は、頂点の各々のクリッピング座標用のｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ変数を更新して、修正された頂点シェーダ３０のオブジェクトコードの第１の実行において、左目画像に対するずれを提供し、修正された頂点シェーダ３０のオブジェクトコードの第２の実行において、右目画像に対するずれを提供することができる。また、修正された頂点シェーダ３０は、追加的な従来の頂点シェーダタスクを実施することができる。たとえば、修正された頂点シェーダ３０は、頂点に対して照明機能を実施することができる。
【０１５７】
修正された頂点シェーダ３０がモデルビュー変換（たとえば、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝コマンドを用いた変位を含む、世界ビュー座標からクリッピング座標へのコンバージョン）を実施した後、修正された頂点シェーダ３０は、頂点についてのクリッピング座標を、固定機能パイプライン２４のプリミティブアセンブリユニット３６に与える。プリミティブアセンブリユニット３６は、頂点をプリミティブにアセンブルするのに、頂点についてのクリッピング座標を使用することができる。たとえば、プリミティブアセンブリユニット３６は、頂点についてのクリッピング座標に基づいて複数の三角形をアセンブルすることができ、ここで三角形の各々の頂点は、修正された頂点シェーダ３０から受信された頂点に対応する。複数の三角形は、プリミティブの一例である。概して、プリミティブアセンブリユニット３６は、受信した頂点についてのクリッピング座標に基づいて、受信した頂点を、任意のポリゴンにアセンブルすることができる。
【０１５８】
プリミティブアセンブリユニット３６は、アセンブルされたプリミティブを錐台ユニット３８に送信すればよい。錐台ユニット３８は、アセンブルされたプリミティブがビューボリューム内にあるかどうか判断することができる。たとえば、上述したように、ＯｐｅｎＧＬ、ＯｐｅｎＧＬ  ＥＳ、およびＯｐｅｎＧＬ  ＥＳ２．０が、特定のビューボリュームを（ｆｏｖx）として定義することができる。ただし、錐台は、たとえば、ｇｌＦｒｕｓｔｒｕｍ関数を使って、ユーザ定義可能であり得る。錐台ユニット３８は、プリミティブ全体がビューボリューム内にあるか、全体がビューボリュームの外部にあるか、それとも部分的にビューボリューム内にあり、部分的にビューボリュームの外部にあるか判断することができる。錐台ユニット３８は、さらなる処理から、全体がビューボリュームの外部にあるプリミティブと、ビューボリュームの外部にあるプリミティブの部分とを選別することができる。錐台ユニット３８は、さらなる処理のために、全体がビューボリューム内にあるプリミティブと、ビューボリューム内にあるプリミティブの部分とを保つことができる。
【０１５９】
錐台ユニット３８は、残りのプリミティブと、プリミティブの部分とを、遠近除算ユニット４０に送信すればよい。遠近除算ユニット４０は、プリミティブの深度に基づいて、プリミティブを拡大または縮小してよい。たとえば、プリミティブの各々は、ｘ、ｙ、およびｚ座標によって定義され得る。ｚ座標は、プリミティブがどれだけ近いか、または離れているかを示し得る。この段階で、ＧＰＵ２０は、立体ビュー用の画像のうち１つのためのグラフィックスコンテンツを生成中であることに留意されたい。それゆえ、プリミティブの近接の概念は、立体ビューではなくモノビューのコンテキストにおけるものである。
【０１６０】
たとえば、遠近除算ユニット４０は、一部のプリミティブを縮小し、他のプリミティブを拡大することができる。こうすることにより、モノビューにおける拡大プリミティブと比較して、縮小プリミティブがさらに離れているという知覚が生じられ得る。上述したように、閲覧者が立体ビューを知覚するのは、これらのモノビュー画像が表示されるときである。言い換えれば、遠近除算ユニット４０は、左目画像と右目画像とを、ディスプレイの２Ｄエリアに表示される３Ｄ画像にさせることができる。閲覧者がこれらの３Ｄ画像を見ると、左目画像および右目画像における、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝コマンドの追加によって引き起こされるずれにより、閲覧者は、３Ｄボリュームを取り囲む立体３Ｄ（Ｓ３Ｄ）画像を知覚する。
【０１６１】
遠近除算ユニット４０は、プリミティブをビューポート変換ユニット４２に送信すればよい。ビューポート変換ユニット４２は、画像のサイズと場所とを、定義されたビューポートに合うように修正する。たとえば、ビューポート変換ユニット４２に先立って、修正された頂点シェーダ３０および固定機能パイプライン２４の固定機能ユニットが、画像がディスプレイ全体に表示されるべきであるかのように、グラフィックスデータを処理する。ビューポート変換ユニット４２の機能は、定義されたビューポートに画像が制限されるように、画像のサイズと場所とを修正することであり得る。
【０１６２】
たとえば、上述したように、左目画像用のグラフィックスコンテンツ（たとえば、頂点についてのクリッピング座標）を生成し得る、頂点シェーダ３０のオブジェクトコードの第１の実行の後、グラフィックスドライバラッパー１６は、左目画像のビューポートを、左目画像をディスプレイの左半分に制限するように修正すればよい。たとえば、頂点シェーダ３０のオブジェクトコードの第１の実行の後、グラフィックスドライバラッパー１６は、アプリケーション３２によってあらかじめ発行され、ＧＰＵ２０から阻止されたｇｌＶｉｅｗｐｏｒｔ（０，０，ｗｉｄｔｈ，ｌｅｎｇｔｈ）コマンドを、ｇｌＶｉｅｗｐｏｒｔ（０，０，ｗｉｄｔｈ／２，ｌｅｎｇｔｈ）に修正し、この第１の修正されたｇｌＶｉｅｗｐｏｒｔコマンドをＧＰＵ２０に与えればよい。コマンドプロセッサ５４は、第１の修正されたｇｌＶｉｅｗｐｏｒｔコマンドをビューポート変換ユニット４２に与えればよい。ビューポート変換ユニット４２は次いで、遠近除算ユニット４０から受信したプリミティブのサイズを、この例では、これらのプリミティブがディスプレイの左半分に制限されるように修正すればよい。たとえば、遠近除算ユニット４０は、一部のプリミティブが他のプリミティブよりも近くに見えるように、プリミティブのサイズを互いに相対して修正してよい。ビューポート変換ユニット４２は、プリミティブがディスプレイの左半分に制限されるように、プリミティブのサイズと場所とを均等に修正することができる。
【０１６３】
頂点シェーダ３０のオブジェクトコードの第２の実行の後、ビューポート変換ユニット４２は、同様の機能を、右目画像に対してではあるが実施することができる。たとえば、頂点シェーダ３０のオブジェクトコードの第２の実行は、右目画像のグラフィックスコンテンツ（たとえば、頂点についてのクリッピング座標）を生成するためであってよい。頂点シェーダ３０のオブジェクトコードのこの第２の実行の後、グラフィックスドライバラッパー１６は、アプリケーション３２によってあらかじめ発行され、ＧＰＵ２０から阻止されたｇｌＶｉｅｗｐｏｒｔ（０，０，ｗｉｄｔｈ，ｌｅｎｇｔｈ）コマンドを、ｇｌＶｉｅｗｐｏｒｔ（ｗｉｄｔｈ／２，０，ｗｉｄｔｈ／２，ｌｅｎｇｔｈ）に修正し、この第２の修正されたｇｌＶｉｅｗｐｏｒｔコマンドをＧＰＵ２０に与えればよい。コマンドプロセッサ５４は、第２の修正されたｇｌＶｉｅｗｐｏｒｔコマンドをビューポート変換ユニット４２に転送すればよい。ビューポート変換ユニット４２は、プリミティブがディスプレイの右半分に制限されるように、プリミティブのサイズと場所とを均等に修正することができる。このように、ＧＰＵ２０は、アプリケーション３２のランタイム中にアプリケーション３２によって生成されたモノビュー画像から、および左目画像から右目画像を生成するための深度情報に依拠することなく、立体ビュー用の左目画像および右目画像を生成するように動作可能であってよく、逆もまた同様である。
【０１６４】
さらに、ビューポート変換ユニット４２は、上述したように、ビューポートシフトまたはビューポートシフトおよびストレッチを実施することができる。たとえば、上述したように、閲覧者がＶｐｓ値を与えることができ、またはＶｐｓ値はあらかじめプログラムされてもよく、ここでＶｐｓ値は、左目画像および右目画像用のビューポートがシフトされ、またはシフトおよびストレッチされるべき量を示す。この例では、ビューポート変換ユニット４２は、ビューポートシフトおよびストレッチも実施するように動作可能であり得る。ビューポートシフト、またはシフトおよびストレッチにより、知覚される立体ビューは、ディスプレイからさらに離れてポップアウトさせ、あまりディスプレイからポップアウトさせず、ディスプレイにプッシュインさせず、またはディスプレイにさらにプッシュインさせることができる。
【０１６５】
ビューポートシフト、またはシフトおよびストレッチのために、コマンドプロセッサ５４は、ユーザ提供による、またはあらかじめプログラムされたＶｐｓ値を取り出し、Ｖｐｓ値をビューポート変換ユニット４２に与えればよい。この例では、ビューポート変換ユニット４２は、修正されたｇｌＶｉｅｗｐｏｒｔコマンドを、左目画像用にはｇｌＶｉｅｗｐｏｒｔ（０−Ｖｐｓ，０，ｗｉｄｔｈ／２，ｌｅｎｇｔｈ）またはｇｌＶｉｅｗｐｏｒｔ（０−Ｖｐｓ，０，ｗｉｄｔｈ／２＋Ｖｐｓ，ｌｅｎｇｔｈ）として、および右目画像用にはｇｌＶｉｅｗｐｏｒｔ（ｗｉｄｔｈ／２＋Ｖｐｓ，０，ｗｉｄｔｈ／２，ｌｅｎｇｔｈ）またはｇｌＶｉｅｗｐｏｒｔ（ｗｉｄｔｈ／２，０，ｗｉｄｔｈ／２＋Ｖｐｓ，ｌｅｎｇｔｈ）として受信することができる。ビューポート変換ユニット４２は、左目画像および右目画像向けのビューポートシフト、またはシフトおよびストレッチを実施し、ビューポートがディスプレイの表示エリアの外側に拡張する場合はいかなる選別も実施することができる。上述したように、ビューポートシフト、またはシフトおよびストレッチは、閲覧者に豊かな立体ビューを提供することができる。
【０１６６】
ビューポート変換ユニット４２は、第１の修正されたｇｌＶｉｅｗｐｏｒｔコマンドおよび第２の修正されたｇｌＶｉｅｗｐｏｒｔコマンドの各々の後にビューポートを修正した後、プリミティブをラスター化ユニット４４に転送してよい。ラスター化ユニット４４は、プリミティブを、ディスプレイのピクセルにコンバートすればよい。たとえば、ラスター化ユニット４４は、ディスプレイのどのピクセルがプリミティブの各々によって取り囲まれるか判断することができる。ラスター化ユニット４４は、これらのピクセルの各々の、ディスプレイ上での場所を判断することもできる。
【０１６７】
ラスター化ユニット４４は、そのグラフィックスデータをフラグメントシェーダ４６に出力することができる。フラグメントシェーダ４６は、ピクセルシェーダと呼ばれることもあり、シェーダプロセッサ２２上で実行するシェーダプログラムであってよい。たとえば、フラグメントシェーダ４６用のソースコードはシステムメモリ２６に記憶することができ、コンパイラ１８は、フラグメントシェーダ４６のソースコードをコンパイルして、フラグメントシェーダ４６のオブジェクトコードを生成することができる。あるいは、システムメモリ２６は、フラグメントシェーダ４６用のオブジェクトコードを、必ずしもコンパイラ１８によって生成させずに記憶することができる。
【０１６８】
フラグメントシェーダ４６は、ディスプレイ上のピクセルの各々についての色値を出力することができる。たとえば、フラグメントシェーダ４６は、赤緑青（ＲＧＢ）成分に基づいて、各ピクセルの色を定義することができる。フラグメントシェーダ４６は、１つの説明のための例として、赤成分を定義するのに８ビット、緑成分を定義するのに８ビット、および青成分を定義するのに８ビットを使用することができる。フラグメントシェーダ４６は、色値をフラグメント単位動作ユニット５０に出力することができる。
【０１６９】
フラグメント単位動作ユニット５０は、可視でないピクセルを選別することができる。たとえば、さらに離れたオブジェクトのピクセルには、フラグメント単位動作ユニット５０がｚバッファから判断することができる、より近いオブジェクトのピクセルを重ねることができる。重複により、さらに離れたオブジェクトのピクセルは、全体が塞がれることになり得る。この場合、フラグメント単位動作ユニット５０は、被重複ピクセルを選別することができる。フラグメント単位動作ユニット５０は、ピクセルをブレンドすることもできる。たとえば、重複ピクセルは、被重複ピクセルを全体的には塞がないように、半透明でよい。この場合、フラグメント単位動作ユニット５０は、これらのピクセルの色をブレンドすることができる。
【０１７０】
フラグメント単位動作ユニット５０の出力は、ディスプレイ上のピクセルについてのピクセル値（たとえば、色）であり得る。フラグメント単位動作ユニット５０は、ピクセル値を、一時記憶のために、システムメモリ２６のフレームバッファ５２に出力すればよい。フレームバッファ５２が一杯になると、フレームバッファ５２は、ディスプレイ上のピクセルの各々についてのピクセル値を記憶すればよい。
【０１７１】
フレームバッファ５２は、記憶ロケーションの２Ｄアレイと見なすことができる。フレームバッファ５２を有する記憶ロケーションの数は、少なくとも、ディスプレイのピクセルの数に等しくてよい。また、フレームバッファ５２内の記憶ロケーションは、ディスプレイ上のロケーションに対応し得る。たとえば、フレームバッファ５２内の左上記憶ロケーションは、ディスプレイの左上ピクセルに対応してよく、フレームバッファ５２内の左上記憶ロケーションの右にある記憶ロケーションは、ディスプレイの左上ピクセルの右にあるピクセルに対応してよく、以下同様である。
【０１７２】
第１のｇｌＤｒａｗコマンドが完了した後、フレームバッファ５２の左半分に位置する記憶ロケーションは、フレームバッファ５２の左半分がディスプレイの左半分に対応し得るので、左目画像についてのピクセル値を記憶すればよい。同様に、第２のｇｌＤｒａｗコマンドが完了した後、フレームバッファ５２の右半分に位置する記憶ロケーションは、フレームバッファ５２の右半分がディスプレイの右半分に対応し得るので、右目画像についてのピクセル値を記憶すればよい。それゆえ、第１および第２のｇｌＤｒａｗコマンドが完了した後、フレームバッファ５２は、左目画像についてのピクセル値と、右目画像についてのピクセル値とを記憶すればよい。
【０１７３】
図３は、図１の例示的デバイスをさらに詳しく示すブロック図である。たとえば、図３は、図１のデバイス１０をさらに詳しく示す。たとえば、上記のように、デバイス１０の例には、限定はしないが、モバイルワイヤレス電話、ＰＤＡ、ビデオディスプレイを含むビデオゲーミングコンソール、モバイルビデオ会議ユニット、ラップトップコンピュータ、デスクトップコンピュータ、テレビジョンセットトップボックス、などがある。
【０１７４】
図３に示すように、デバイス１０は、アプリケーションプロセッサ１２と、ＧＰＵ２０と、フレームバッファ５２を含むシステムメモリ２６と、トランシーバモジュール５６と、ユーザインターフェース５８と、ディスプレイ６０と、ディスプレイプロセッサ６２とを含み得る。アプリケーションプロセッサ１２、ＧＰＵ、およびシステムメモリ２６は、図１および図２のアプリケーションプロセッサ１２、ＧＰＵ２０、およびシステムメモリ２６と実質的に同様または同一でよい。簡潔のために、図３には示すが、図１および図２には示していない構成要素についてのみ、詳細に説明する。
【０１７５】
デバイス１０は、図３に示すように、明快のために図３に示されていない追加のモジュールまたはユニットを含み得る。たとえば、デバイス１０は、デバイス１０がモバイルワイヤレス電話である例において電話通信を実現するために、そのいずれも図３に示されていないスピーカおよびマイクロフォン、またはデバイス１０がメディアプレーヤであるスピーカを含み得る。さらに、デバイス１０に示す様々なモジュールおよびユニットは、デバイス１０のすべての例において必要であるとは限らない。たとえば、ユーザインターフェース５８およびディスプレイ６０は、デバイス１０がデスクトップコンピュータまたは外部のユーザインターフェースもしくはディスプレイとインターフェースするように備えられた他のデバイスである例において、デバイス１０の外部にあってよい。
【０１７６】
ユーザインターフェース５８の例には、限定はしないが、トラックボール、マウス、キーボード、および他のタイプの入力デバイスがある。ユーザインターフェース５８はまた、タッチスクリーンであり得、ディスプレイ６０の一部として組み込まれ得る。トランシーバモジュール５６は、デバイス１０と別のデバイスまたはネットワークとの間のワイヤレスまたはワイヤード通信を可能にするための回路を含み得る。トランシーバモジュール５６は、ワイヤードまたはワイヤレス通信のための１つまたは複数の変調器と、復調器と、増幅器と、アンテナと、他のそのような回路を含み得る。ディスプレイ６０は、液晶ディスプレイ（ＬＣＤ）、有機発光ダイオードディスプレイ（ＯＬＥＤ）、陰極線管（ＣＲＴ）ディスプレイ、プラズマディスプレイ、偏光ディスプレイ、または別のタイプのディスプレイデバイスを備え得る。
【０１７７】
ディスプレイプロセッサ６２は、ディスプレイ６０に、立体ビューを表示させるように構成され得る。ディスプレイ６０に、立体ビューを表示させるのにディスプレイプロセッサ６２が使用することができる様々な技法があってよく、本開示の態様は、これらの技法のうちどれを使用してもよい。たとえば、ディスプレイプロセッサ６２は、フレームバッファ５２の左半分から左目画像を取り出し、フレームバッファ５２の右半分から右目画像を取り出し、２つの画像をインターリーブして、立体ビューを提供することができる。
【０１７８】
別の例として、ディスプレイプロセッサ６２は、ディスプレイ６０のリフレッシュレートを制御することができる。この例では、各リフレッシュ周期中に、ディスプレイプロセッサ６２は、左目画像と右目画像との間を循環することができる。たとえば、ディスプレイプロセッサ６２は、あるリフレッシュ周期の間、フレームバッファ５２の左半分から左目画像を取り出し、左目画像をディスプレイ６０全体に拡大し、左目画像をディスプレイ６０上に表示することができる。次いで、次のリフレッシュ周期の間、ディスプレイプロセッサ６２は、実質的に同様の機能を、今度はフレームバッファ５２の右半分に記憶された右目画像に対して実施することができる。言い換えれば、ディスプレイ６０は、左目画像、次いで右目画像、次いで左目画像、および以下同様に表示すればよい。
【０１７９】
閲覧者は、ディスプレイプロセッサ６２のリフレッシュレートと同期される特殊眼鏡を装着している場合がある。たとえば、ディスプレイ６０が左目画像を表示している間、特殊眼鏡は、閲覧者の左目のみが左目画像をキャプチャするように、右レンズのシャッターを閉じればよい。次いで、ディスプレイ６０が右目画像を表示している間、特殊眼鏡は、閲覧者の右目のみが右目画像をキャプチャするように、左レンズのシャッターを閉じればよく、以下同様である。リフレッシュレートが十分に高速である場合、閲覧者は、画像がディスプレイ６０からポップアウトし、またはディスプレイにプッシュインし、３Ｄボリュームを取り囲む立体ビューを知覚する。
【０１８０】
いくつかの例では、いくつかの従来のディスプレイプロセッサは、ディスプレイ６０に立体ビューを表示させるように構成しなくてもよい。これらの例では、閲覧者は、ディスプレイに立体ビューを提示させるように構成された、ディスプレイプロセッサ６２などのディスプレイプロセッサを含むディスプレイに、デバイス１０を結合すればよい。たとえば、閲覧者は、トランシーバモジュール５６を介して、デバイス１０を立体ビュー対応テレビに結合すればよい。たとえば、閲覧者は、高精細マルチメディアインターフェース（ＨＤＭＩ（登録商標））ワイヤを介して、トランシーバモジュール５６をテレビに結合してよい。この例では、アプリケーションプロセッサ１２またはＧＰＵ２０は、トランシーバモジュール５６に、フレームバッファ５２に記憶されたピクセル値をテレビのディスプレイプロセッサへ送信するよう命令することができる。このテレビのディスプレイプロセッサは次いで、テレビに、立体ビューを形成するために左目画像および右目画像を表示させればよい。
【０１８１】
これらの例では、デバイス１０のディスプレイが、左目画像および右目画像を表示することが依然として可能であり得る。ただし、デバイス１０のディスプレイプロセッサ６２は、デバイス１０のディスプレイ６０に立体ビューを提示させることができない場合があるので、この例では、ディスプレイ６０は、左目画像と右目画像とを並べて表示してよい。たとえば、ディスプレイ６０の左半分は左目画像を表示すればよく、ディスプレイ６０の右半分は右目画像を表示すればよい。これは、上述したビューポート変換によるものであり得る。この場合、特殊眼鏡を用いても、閲覧者は、ディスプレイ６０を見るだけでは、立体ビューを体験することはできないが、立体ビュー対応テレビを見ることによって立体ビューを体験することになる。
【０１８２】
図４は、本開示に記載する１つまたは複数の例示的技法による例示的動作を示すフローチャートである。説明のために、図１および図２への参照を行う。
【０１８３】
プロセッサが、モノビューの画像を生成するように設計されておりグラフィックス処理ユニット（ＧＰＵ）のシェーダプロセッサ上で実行されるべき頂点シェーダ向けの命令を受信し得る（６４）。たとえば、アプリケーションプロセッサ１２は、グラフィックスドライバラッパー１６の実行により、頂点シェーダ２８向けの命令を受信することができる。上述したように、頂点シェーダ２８は、モノビュー用のグラフィックスコンテンツを生成するように設計してよく、ＧＰＵ２０のシェーダプロセッサ２２上で実行されるように設計してよい。
【０１８４】
プロセッサは、頂点シェーダの命令を、頂点シェーダがＧＰＵのシェーダプロセッサ上で実行されると頂点シェーダに、立体ビューの頂点シェーダの第１の実行の後に立体ビューの第１の画像用のグラフィックスコンテンツを、また頂点シェーダの第２の実行の後に立体ビューの第２の画像用のグラフィックスコンテンツを生成させる１つまたは複数の命令を含むように修正することができる（６６）。第１の画像は左目画像でよく、第２の画像は右目画像でよい。
【０１８５】
たとえば、グラフィックスドライバラッパー１６は頂点シェーダ２８のソースコードを受信することができ、ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝Ｘコマンドを頂点シェーダ２８のソースコードに含めることができる。コンパイラ１８は、頂点シェーダ２８の修正されたソースコードをコンパイルして、修正された頂点シェーダ３０のオブジェクトコードを生成することができる。グラフィックスドライバラッパー１６は、シェーダプロセッサ２２に修正された頂点シェーダ３０のオブジェクトコードを実行させることができ、シェーダプロセッサ２２にＸについての＋Ｄという値を与えることができる。グラフィックスドライバラッパー１６が第１のｇｌＤｒａｗコマンドを発行した後、グラフィックスドライバラッパー１６は、シェーダプロセッサ２２に修正された頂点シェーダ３０のオブジェクトコードを再度実行させることができ、シェーダプロセッサ２２にＸについての−Ｄという値を与えることができる。
【０１８６】
プロセッサは、モノビューの画像用のビューポートを定義するコマンドを、第１の画像用のビューポートを定義する、シェーダプロセッサとは異なるＧＰＵの固定機能ユニット向けの第１のコマンドと、第２の画像用のビューポートを定義する、ＧＰＵの固定機能ユニット向けの第２のコマンドとに修正することができる（６８）。この例では、固定機能ユニットは、図２のビューポート変換ユニット４２であり得る。図に示し、上述したように、ビューポート変換ユニット４２は、シェーダプロセッサ２２とは異なる。
【０１８７】
一例として、グラフィックスドライバラッパー１６は、アプリケーション３２によってあらかじめ発行されたｇｌＶｉｅｗｐｏｒｔ（０，０，ｗｉｄｔｈ，ｌｅｎｇｔｈ）コマンドを、左目画像をレンダリングするためのｇｌＶｉｅｗｐｏｒｔ（０，０，ｗｉｄｔｈ／２，ｌｅｎｇｔｈ）コマンドに修正することができ、右目画像をレンダリングするために、グラフィックスドライバラッパー１６は、ｇｌＶｉｅｗｐｏｒｔ（０，０，ｗｉｄｔｈ，ｌｅｎｇｔｈ）コマンドをｇｌＶｉｅｗｐｏｒｔ（ｗｉｄｔｈ／２，０，ｗｉｄｔｈ／２，ｌｅｎｇｔｈ）コマンドに修正することができる。いくつかの例では、グラフィックスドライバラッパー１６は、上述したように、第１および第２の画像用のビューポートをシフトし、またはシフトおよびストレッチすることができる。いくつかの例では、グラフィックスドライバラッパー１６は、第１および第２の画像用のビューポートをシフトし、またはシフトおよびストレッチすることができるとともに、モノビュー用のビューポートを定義する命令を、第１および第２の画像用のビューポートを定義するように修正する。
【０１８８】
以下の擬似コードは、グラフィックスドライバラッパー１６およびアプリケーション３２の機能性の例を挙げる。この擬似コードは、理解を助けることを意図しており、限定的と見なされるべきではない。
【０１８９】
１．  グラフィックドライバラッパー１６が、アプリケーション３２によって発行されたｇｌＳｈａｄｅｒＳｏｕｒｃｅコマンドをインターセプトして、頂点シェーダ２８のソースコードをインターセプトする。
【０１９０】
２．  グラフィックスドライバラッパー１６が、「ｕｎｉｆｏｒｍ  ｆｌｏａｔ  Ｘ」を頂点シェーダ２８の命令に挿入し、「ｕｎｉｆｏｒｍ」とは、プログラマブルシェーダを有するＯｐｅｎＧＬおよびＯｐｅｎＧＬ  ＥＳにおけるユーザ定義の標準属性変数である。
【０１９１】
３．  グラフィックスドライバラッパー１６が、「ｇｌ＿Ｐｏｓｉｔｉｏｎ．ｘ＋＝Ｘ」コマンドを頂点シェーダ２８のソースコードに挿入する。
【０１９２】
４．  アプリケーション３２が、コンパイラ１８に、頂点シェーダ２８の修正されたソースコード命令をコンパイルさせて修正された頂点シェーダ３０のオブジェクトコードを生成するｇｌＣｏｍｐｉｌｅＳｈａｄｅｒコマンドを実行する。
【０１９３】
５．  アプリケーション３２が、以下のコマンドを実行して、修正された頂点シェーダ３０のオブジェクトコードにリンクする。
【０１９４】
ｐｒｏｇｒａｍＯｂｊｅｃｔ＝ｇｌＣｒｅａｔｅＰｒｏｇｒａｍ（）；
ｇｌＡｔｔａｃｈＳｈａｄｅｒ（ｐｒｏｇｒａｍＯｂｊｅｃｔ，ｖｅｒｔｅｘＳｈａｄｅｒ）；
ｇｌＡｔｔａｃｈＳｈａｄｅｒ（ｐｒｏｇｒａｍＯｂｊｅｃｔ，ｆｒａｇｍｅｎｔＳｈａｄｅｒ）；
ｇｌＬｉｎｋＰｒｏｇｒａｍ（ｐｒｏｇｒａｍＯｂｊｅｃｔ）
６．  グラフィックスドライバラッパー１６が、アプリケーション３２によって呼び出されると、ｇｌＤｒａｗコマンド（たとえば、ｇｌＤｒａｗＡｒｒａｙｓおよびｇｌＤｒａｗＥｌｅｍｅｎｔｓ）をインターセプトし、コマンドがＧＰＵ２０に送信されるのを阻止する。
【０１９５】
７．  グラフィックスドライバラッパー１６が、以下のコマンドを発行する。
【０１９６】
ｇｌＧｅｔＩｎｔｅｇｅｒ（ＧＬ＿ＣＵＲＲＥＮＴ＿ＰＲＯＧＲＡＭ，＆ｐｒｏｇｒａｍ）；／／現在の頂点シェーダに対するポインタを得るため
ｇｌＶｉｅｗｐｏｒｔコマンドを、上述したように、左目画像用のビューポートを生成するように修正する。
【０１９７】
ｐ＝ｇｌＧｅｔＵｎｉｆｏｒｍＬｏｃａｔｉｏｎ（ｐｒｏｇｒａｍ，Ｘ）；ｕｎｉｆｏｒｍ  Ｘに対するポインタを得るため
ｇｌＵｎｉｆｏｒｍ１ｆ（ｐ，Ｄ）；／／Ｄに等しいＸの値をセットするため。
【０１９８】
ｇｌＤｒａｗコマンド／／ＧＰＵ２０に、左目画像用のグラフィックスコンテンツを生成させるため
８．  ７から続くステップを、右目画像用のグラフィックスコンテンツを生成するための以下の修正を施して繰り返す。
【０１９９】
ｇｌＶｉｅｗｐｏｒｔコマンドを、上述したように、右目画像用のビューポートを生成するように修正する。
【０２００】
ｇｌＵｎｉｆｏｒｍ１ｆ（ｐ，−Ｄ）；／／−Ｄに等しいＸの値をセットするため。
【０２０１】
ｇｌＤｒａｗコマンド／／ＧＰＵ２０に、右目画像用のグラフィックスコンテンツを生成させるため。
【０２０２】
１つまたは複数の例では、説明した機能は、ハードウェア、ソフトウェア、ファームウェア、またはそれらの任意の組合せで実装され得る。ソフトウェアで実装する場合、機能は、１つまたは複数の命令またはコードとしてコンピュータ可読媒体上に記憶することができる。コンピュータ可読媒体はコンピュータデータ記憶媒体を含み得る。データ記憶媒体は、本開示で説明した技法の実装のための命令、コードおよび／またはデータ構造を取り出すために１つまたは複数のコンピュータあるいは１つまたは複数のプロセッサによってアクセスされ得る任意の利用可能な媒体であり得る。限定ではなく、例として、そのようなコンピュータ可読媒体は、ランダムアクセスメモリ（ＲＡＭ）、読取り専用メモリ（ＲＯＭ）、ＥＥＰＲＯＭ、ＣＤ−ＲＯＭまたは他の光ディスクストレージ、磁気ディスクストレージまたは他の磁気ストレージデバイス、あるいは命令またはデータ構造の形態の所望のプログラムコードを記憶するために使用され得、コンピュータによってアクセスされ得る、任意の他の媒体を備えることができる。本明細書で使用するディスク（disk）およびディスク（disc）は、コンパクトディスク（disc）（ＣＤ）、レーザディスク（disc）、光ディスク（disc）、デジタル多用途ディスク（disc）（ＤＶＤ）、フロッピー（登録商標）ディスク（disk）およびブルーレイ（登録商標）ディスク（disc）を含み、ディスク（disk）は、通常、データを磁気的に再生し、ディスク（disc）は、データをレーザで光学的に再生する。上記の組合せもコンピュータ可読媒体の範囲内に含めるべきである。
【０２０３】
コードは、１つまたは複数のデジタル信号プロセッサ（ＤＳＰ）などの１つまたは複数のプロセッサ、汎用マイクロプロセッサ、特定用途向け集積回路（ＡＳＩＣ）、フィールドプログラマブル論理アレイ（ＦＰＧＡ）、あるいは他の等価な集積回路またはディスクリート論理回路によって実行され得る。したがって、本明細書で使用する「プロセッサ」という用語は、前述の構造、または本明細書で説明する技法の実施に好適な任意の他の構造のいずれかを指す。また、本技法は、１つまたは複数の回路または論理要素中に十分に実装され得る。
【０２０４】
本開示の技法は、ワイヤレスハンドセット、集積回路（ＩＣ）、またはＩＣのセット（すなわち、チップセット）を含む、多種多様なデバイスまたは装置において実装され得る。本開示では、開示する技法を実行するように構成されたデバイスの機能的態様を強調するために様々な構成要素、モジュール、またはユニットについて説明したが、それらの構成要素、モジュール、またはユニットを、必ずしも異なるハードウェアユニットによって実現する必要はない。むしろ、上記で説明したように、様々なユニットが、好適なソフトウェアおよび／またはファームウェアとともに、上記で説明した１つまたは複数のプロセッサを含めて、ハードウェアユニットにおいて組み合わせられるか、または相互動作ハードウェアユニットの集合によって与えられ得る。
【０２０５】
様々な例について説明した。これらおよび他の例は以下の特許請求の範囲内に入る。
なお、以下に、出願当初の特許請求の範囲に記載された発明を付記する。
［Ｃ１］プロセッサを用いて、モノビューの画像を生成するように構成されておりグラフィックス処理ユニット（ＧＰＵ）のシェーダプロセッサ上で実行されるべき頂点シェーダに対する命令を受信することと、
前記プロセッサを用いて、前記頂点シェーダの前記命令を、前記頂点シェーダが前記ＧＰＵの前記シェーダプロセッサ上で実行されると前記頂点シェーダに、前記頂点シェーダの第１の実行の後に立体ビューの第１の画像用のグラフィックスコンテンツを、また前記頂点シェーダの第２の実行の後に前記立体ビューの第２の画像用のグラフィックスコンテンツを生成させる１つまたは複数の命令を含むように修正することと、
前記プロセッサを用いて、前記モノビューの前記画像用のビューポートを定義するコマンドを、前記第１の画像用のビューポートを定義する、前記シェーダプロセッサとは異なる前記ＧＰＵの固定機能ユニット向けの第１のコマンド、および前記第２の画像用のビューポートを定義する、前記ＧＰＵの前記固定機能ユニット向けの第２のコマンドに修正することとを備える方法。
［Ｃ２］前記ＧＰＵの前記シェーダプロセッサを用いて、前記頂点シェーダの前記修正された命令のオブジェクトコードを実行することと、
前記ＧＰＵの前記固定機能ユニットを用いて、前記第１の画像用の前記ビューポートを定義する前記第１のコマンド、および前記第２の画像用の前記ビューポートを定義する前記第２のコマンドを実行することとをさらに備える、Ｃ１に記載の方法。
［Ｃ３］前記画像用の前記ビューポートを定義する前記コマンドを、前記第１のコマンドが前記第１の画像をディスプレイの第１の部分に制限するように構成され、前記第２のコマンドが前記第２の画像を前記ディスプレイの第２の部分に制限するように構成されるように修正する、Ｃ１に記載の方法。
［Ｃ４］前記画像用の前記ビューポートを定義する前記コマンドを修正することが、前記第１の画像用の前記ビューポートをシフトし、またはシフトおよびストレッチすることと、前記第２の画像用の前記ビューポートをシフトし、またはシフトおよびストレッチすることとをさらに備える、Ｃ１に記載の方法。
［Ｃ５］前記画像用の前記ビューポートを定義する前記コマンドを修正することが、ｇｌＶｉｅｗｐｏｒｔ（０，０，ｗｉｄｔｈ，ｌｅｎｇｔｈ）コマンドを、ｇｌＶｉｅｗｐｏｒｔ（０，０，ｗｉｄｔｈ／２，ｌｅｎｇｔｈ）コマンドを備える前記第１のコマンド、およびｇｌＶｉｅｗｐｏｒｔ（ｗｉｄｔｈ／２，０，ｗｉｄｔｈ／２，ｌｅｎｇｔｈ）コマンドを備える前記第２のコマンドに修正することを備え、ｗｉｄｔｈがディスプレイの幅に等しく、ｌｅｎｇｔｈが前記ディスプレイの長さに等しい、Ｃ１に記載の方法。
［Ｃ６］前記画像用の前記ビューポートを定義する前記コマンドを修正することが、ｇｌＶｉｅｗｐｏｒｔ（０，０，ｗｉｄｔｈ，ｌｅｎｇｔｈ）コマンドを、ｇｌＶｉｅｗｐｏｒｔ（０−Ｖｐｓ，０，ｗｉｄｔｈ／２，ｌｅｎｇｔｈ）コマンドまたはｇｌＶｉｅｗｐｏｒｔ（０−Ｖｐｓ，０，ｗｉｄｔｈ／２＋Ｖｐｓ，ｌｅｎｇｔｈ）コマンドを備える前記第１のコマンド、およびｇｌＶｉｅｗｐｏｒｔ（ｗｉｄｔｈ／２＋Ｖｐｓ，０，ｗｉｄｔｈ／２，ｌｅｎｇｔｈ）コマンドまたはｇｌＶｉｅｗｐｏｒｔ（ｗｉｄｔｈ／２，０，ｗｉｄｔｈ／２＋Ｖｐｓ，ｌｅｎｇｔｈ）コマンドを備える前記第２のコマンドに修正することを備え、ｗｉｄｔｈがディスプレイの幅に等しく、ｌｅｎｇｔｈが前記ディスプレイの長さに等しく、Ｖｐｓが、前記立体ビューが前記ディスプレイからポップアウトまたは前記ディスプレイにプッシュインする量を定義する、Ｃ１に記載の方法。
［Ｃ７］前記固定機能ユニットが、前記ＧＰＵの固定機能パイプラインのビューポート変換ユニットを備える、Ｃ１に記載の方法。
［Ｃ８］前記頂点シェーダの命令を受信することが、前記プロセッサ上で実行するグラフィックスドライバラッパーを用いて前記頂点シェーダの前記命令を受信することを備え、前記頂点シェーダの前記命令を修正することが、前記プロセッサ上で実行する前記グラフィックスドライバラッパーを用いて前記頂点シェーダの前記命令を修正することを備え、前記ビューポートを定義する前記コマンドを修正することが、前記プロセッサ上で実行する前記グラフィックスドライバラッパーを用いて、前記ビューポートを定義する前記コマンドを修正することを備える、Ｃ１に記載の方法。
［Ｃ９］前記頂点シェーダの前記命令を修正することが、前記モノビューの前記画像についての少なくとも１つのクリッピング座標を修正する命令を前記頂点シェーダに追加することを備える、Ｃ１に記載の方法。
［Ｃ１０］少なくとも１つのクリッピング座標を修正する前記命令を前記頂点シェーダに追加することが、前記少なくとも１つのクリッピング座標を記憶する変数を更新する命令を前記頂点シェーダに追加することを備える、Ｃ９に記載の方法。
［Ｃ１１］前記少なくとも１つのクリッピング座標を記憶する前記変数を更新する前記命令を前記頂点シェーダに追加することが、前記第１の実行において前記少なくとも１つのクリッピング座標に定数値を加算するための命令を追加することと、前記第２の実行において前記少なくとも１つのクリッピング座標から前記定数値を減算するための命令を追加することとを備える、Ｃ１０に記載の方法。
［Ｃ１２］前記モノビューの前記画像についての前記少なくとも１つのクリッピング座標を修正する前記命令を前記頂点シェーダに追加することが、ｇｌ．Ｐｏｓｉｔｉｏｎ．ｘ＋＝Ｘコマンドを追加することを備え、Ｘが、前記第１の実行では＋Ｄに、および前記第２の実行では−Ｄに等しく、Ｄが、閲覧者の左目と右目との間の距離の半分の推定値に等しい、Ｃ１０に記載の方法。
［Ｃ１３］前記頂点シェーダの前記命令を１つまたは複数の命令を含むように修正することが、前記モノビューの前記画像についての１つのクリッピング座標を修正する命令を前記頂点シェーダに追加することのみを備える、Ｃ１に記載の方法。
［Ｃ１４］シェーダプロセッサ、および固定機能パイプラインの、前記シェーダプロセッサとは異なる固定機能ユニットを含むグラフィックス処理ユニット（ＧＰＵ）と、
プロセッサとを備え、前記プロセッサが、
モノビューの画像を生成するように構成されており前記ＧＰＵの前記シェーダプロセッサ上で実行されるべき頂点シェーダについての命令を受信し、
前記頂点シェーダの前記命令を、前記頂点シェーダが前記ＧＰＵの前記シェーダプロセッサ上で実行されると前記頂点シェーダに、前記頂点シェーダの第１の実行の後に立体ビューの第１の画像用のグラフィックスコンテンツと、前記頂点シェーダの第２の実行の後に前記立体ビューの第２の画像用のグラフィックスコンテンツとを生成させる１つまたは複数の命令を含むように修正し、
前記モノビューの前記画像用のビューポートを定義するコマンドを、前記第１の画像用のビューポートを定義する、前記シェーダプロセッサとは異なる前記ＧＰＵの前記固定機能ユニット向けの第１のコマンドと、前記第２の画像用のビューポートを定義する、前記ＧＰＵの前記固定機能ユニット向けの第２のコマンドとに修正するように動作可能である、装置。
［Ｃ１５］前記ＧＰＵの前記シェーダプロセッサが、前記頂点シェーダの前記修正された命令のオブジェクトコードを実行するように構成され、前記ＧＰＵの前記固定機能ユニットが、前記第１の画像用の前記ビューポートを定義する前記第１のコマンドと、前記第２の画像用の前記ビューポートを定義する前記第２のコマンドとを実行するように構成される、Ｃ１４に記載の装置。
［Ｃ１６］前記プロセッサが、前記画像用の前記ビューポートを定義する前記コマンドを、前記第１のコマンドが前記第１の画像をディスプレイの第１の部分に制限するように構成され、前記第２のコマンドが前記第２の画像を前記ディスプレイの第２の部分に制限するように構成されるように修正するように動作可能である、Ｃ１４に記載の装置。
［Ｃ１７］前記プロセッサが、前記画像用の前記ビューポートを定義する前記コマンドを、前記第１の画像用の前記ビューポートをシフトし、またはシフトおよびストレッチし、前記第２の画像用の前記ビューポートをシフトし、またはシフトおよびストレッチするように修正するようにさらに動作可能である、Ｃ１４に記載の装置。
［Ｃ１８］前記画像用の前記ビューポートを定義する前記コマンドを修正するために、前記プロセッサが、ｇｌＶｉｅｗｐｏｒｔ（０，０，ｗｉｄｔｈ，ｌｅｎｇｔｈ）コマンドを、ｇｌＶｉｅｗｐｏｒｔ（０，０，ｗｉｄｔｈ／２，ｌｅｎｇｔｈ）コマンドを備える前記第１のコマンド、およびｇｌＶｉｅｗｐｏｒｔ（ｗｉｄｔｈ／２，０，ｗｉｄｔｈ／２，ｌｅｎｇｔｈ）コマンドを備える前記第２のコマンドに修正するように動作可能であり、ｗｉｄｔｈがディスプレイの幅に等しく、ｌｅｎｇｔｈが前記ディスプレイの長さに等しい、Ｃ１４に記載の装置。
［Ｃ１９］前記画像用の前記ビューポートを定義する前記コマンドを修正するために、前記プロセッサが、ｇｌＶｉｅｗｐｏｒｔ（０，０，ｗｉｄｔｈ，ｌｅｎｇｔｈ）コマンドを、ｇｌＶｉｅｗｐｏｒｔ（０−Ｖｐｓ，０，ｗｉｄｔｈ／２，ｌｅｎｇｔｈ）コマンドまたはｇｌＶｉｅｗｐｏｒｔ（０−Ｖｐｓ，０，ｗｉｄｔｈ／２＋Ｖｐｓ，ｌｅｎｇｔｈ）コマンドを備える前記第１のコマンド、およびｇｌＶｉｅｗｐｏｒｔ（ｗｉｄｔｈ／２＋Ｖｐｓ，０，ｗｉｄｔｈ／２，ｌｅｎｇｔｈ）コマンドまたはｇｌＶｉｅｗｐｏｒｔ（ｗｉｄｔｈ／２，０，ｗｉｄｔｈ／２＋Ｖｐｓ，ｌｅｎｇｔｈ）コマンドを備える前記第２のコマンドに修正するように動作可能であり、ｗｉｄｔｈがディスプレイの幅に等しく、ｌｅｎｇｔｈが前記ディスプレイの長さに等しく、Ｖｐｓが、前記立体ビューが前記ディスプレイからポップアウトする量を定義する、Ｃ１４に記載の装置。
［Ｃ２０］前記固定機能ユニットがビューポート変換ユニットを備える、Ｃ１４に記載の装置。
［Ｃ２１］前記プロセッサが、グラフィックスドライバラッパーを実行して、頂点シェーダに対する命令を受信し、前記頂点シェーダの前記命令を修正し、前記画像用のビューポートを定義する前記コマンドを修正するように動作可能である、Ｃ１４に記載の装置。
［Ｃ２２］前記頂点シェーダの前記命令を修正するために、前記プロセッサが、前記モノビューの前記画像についての少なくとも１つのクリッピング座標を修正する命令を前記頂点シェーダに追加するように動作可能である、Ｃ１４に記載の装置。
［Ｃ２３］少なくとも１つのクリッピング座標を修正する前記命令を前記頂点シェーダに追加するために、前記プロセッサが、前記少なくとも１つのクリッピング座標を記憶する変数を更新する命令を前記頂点シェーダに追加するように動作可能である、Ｃ２２に記載の装置。
［Ｃ２４］前記少なくとも１つのクリッピング座標を記憶する前記変数を更新する前記命令を前記頂点シェーダに追加するために、前記プロセッサが、前記第１の実行において前記少なくとも１つのクリッピング座標に定数値を加算するための命令を追加し、前記第２の実行において前記少なくとも１つのクリッピング座標から前記定数値を減算するための命令を追加するように動作可能である、Ｃ２３に記載の装置。
［Ｃ２５］前記モノビューの前記画像についての前記少なくとも１つのクリッピング座標を修正する前記命令を前記頂点シェーダに追加するために、前記プロセッサが、ｇｌ．Ｐｏｓｉｔｉｏｎ．ｘ＋＝Ｘコマンドを追加するように動作可能であり、Ｘが、前記第１の実行では＋Ｄに、および前記第２の実行では−Ｄに等しく、Ｄが、閲覧者の左目と右目との間の距離の半分の推定値に等しい、Ｃ２３に記載の装置。
［Ｃ２６］前記頂点シェーダの前記命令を、１つまたは複数の命令を含むように修正するために、前記プロセッサが、前記モノビューの前記画像についての１つのクリッピング座標を修正する命令を前記頂点シェーダに追加するように動作可能である、Ｃ１４に記載の装置。
［Ｃ２７］シェーダプロセッサ、および固定機能パイプラインの、前記シェーダプロセッサとは異なる固定機能ユニットを含むグラフィックス処理ユニット（ＧＰＵ）と、
プロセッサとを備え、前記プロセッサが、
モノビューの画像を生成するように構成されており前記ＧＰＵの前記シェーダプロセッサ上で実行されるべき頂点シェーダについての命令を受信するための手段と、
前記頂点シェーダの前記命令を、前記頂点シェーダが前記ＧＰＵの前記シェーダプロセッサ上で実行されると前記頂点シェーダに、前記頂点シェーダの第１の実行の後に立体ビューの第１の画像用のグラフィックスコンテンツを、また前記頂点シェーダの第２の実行の後に前記立体ビューの第２の画像用のグラフィックスコンテンツを生成させる１つまたは複数の命令を含むように修正するための手段と、
前記モノビューの前記画像用のビューポートを定義するコマンドを、前記第１の画像用のビューポートを定義する、前記シェーダプロセッサとは異なる前記ＧＰＵの固定機能ユニット向けの第１のコマンド、および前記第２の画像用のビューポートを定義する、前記ＧＰＵの前記固定機能ユニット向けの第２のコマンドに修正するための手段とを含む、装置。
［Ｃ２８］前記ＧＰＵの前記シェーダプロセッサが、前記頂点シェーダの前記修正された命令のオブジェクトコードを実行するように構成され、前記ＧＰＵの前記固定機能ユニットが、前記第１の画像用の前記ビューポートを定義する前記第１のコマンドと、前記第２の画像用の前記ビューポートを定義する前記第２のコマンドとを実行するように構成される、Ｃ２７に記載の装置。
［Ｃ２９］前記画像用の前記ビューポートを定義する前記コマンドを、前記第１のコマンドが前記第１の画像をディスプレイの第１の部分に制限するように構成され、前記第２のコマンドが前記第２の画像を前記ディスプレイの第２の部分に制限するように構成されるように修正するための前記手段、Ｃ２７に記載の装置。
［Ｃ３０］前記画像用の前記ビューポートを定義する前記コマンドを修正するための手段が、前記第１の画像用の前記ビューポートをシフトし、またはシフトおよびストレッチするための手段と、前記第２の画像用の前記ビューポートをシフトし、またはシフトおよびストレッチするための手段とをさらに備える、Ｃ２７に記載の装置。
［Ｃ３１］前記頂点シェーダの前記命令を修正するための手段が、前記モノビューの前記画像についての少なくとも１つのクリッピング座標を修正する命令を前記頂点シェーダに追加するための手段を備える、Ｃ２７に記載の装置。
［Ｃ３２］前記頂点シェーダの前記命令を１つまたは複数の命令を含むように修正するための手段が、前記モノビューの前記画像についての１つのクリッピング座標を修正する命令を前記頂点シェーダに追加するためだけの手段を備える、Ｃ２７に記載の装置。
［Ｃ３３］命令を備える非一時的コンピュータ可読記憶媒体であって、前記命令が、実行されたとき、１つまたは複数のプロセッサに、
モノビューの画像を生成するように設計されておりグラフィックス処理ユニット（ＧＰＵ）のシェーダプロセッサ上で実行されるべき頂点シェーダについての命令を受信させ、
前記頂点シェーダの前記命令を、前記頂点シェーダが前記ＧＰＵの前記シェーダプロセッサ上で実行されると前記頂点シェーダに、前記頂点シェーダの第１の実行の後に立体ビューの第１の画像用のグラフィックスコンテンツと、前記頂点シェーダの第２の実行の後に前記立体ビューの第２の画像用のグラフィックスコンテンツとを生成させる１つまたは複数の命令を含むように修正させ、
前記モノビューの前記画像用のビューポートを定義するコマンドを、前記第１の画像用のビューポートを定義する、前記シェーダプロセッサとは異なる前記ＧＰＵの固定機能ユニット向けの第１のコマンドと、前記第２の画像用のビューポートを定義する、前記ＧＰＵの前記固定機能ユニット向けの第２のコマンドとに修正させる、非一時的コンピュータ可読記憶媒体。
［Ｃ３４］前記ＧＰＵの前記シェーダプロセッサを用いて、前記頂点シェーダの前記修正された命令のオブジェクトコードを実行させ、
前記ＧＰＵの前記固定機能ユニットを用いて、前記第１の画像用の前記ビューポートを定義する前記第１のコマンドと、前記第２の画像用の前記ビューポートを定義する前記第２のコマンドとを実行させるための命令をさらに備える、Ｃ３３に記載の非一時的コンピュータ可読記憶媒体。
［Ｃ３５］前記画像用の前記ビューポートを定義する前記コマンドを修正するための前記命令が、前記モノビューの前記画像用の前記ビューポートを定義する前記コマンドを、前記第１の画像をディスプレイの第１の部分に制限する前記第１のコマンドと、前記第２の画像を前記ディスプレイの第２の部分に制限する前記第２のコマンドとに修正するための命令を備える、Ｃ３３に記載の非一時的コンピュータ可読記憶媒体。
［Ｃ３６］前記画像用の前記ビューポートを定義する前記コマンドを修正するための前記命令が、前記第１の画像用の前記ビューポートをシフトし、またはシフトおよびストレッチし、前記第２の画像用の前記ビューポートをシフトし、またはシフトおよびストレッチするための命令をさらに備える、Ｃ３３に記載の非一時的コンピュータ可読記憶媒体。
［Ｃ３７］前記頂点シェーダの前記命令を修正するための前記命令が、前記モノビューの前記画像についての少なくとも１つのクリッピング座標を修正する命令を、前記頂点シェーダに追加するための命令を備える、Ｃ３３に記載の非一時的コンピュータ可読記憶媒体。
［Ｃ３８］前記頂点シェーダの前記命令を、１つまたは複数の命令を含むように修正するための前記命令が、前記モノビューの前記画像についての１つのクリッピング座標を修正する命令を前記頂点シェーダに追加するだけのための命令を備える、Ｃ３３に記載の非一時的コンピュータ可読記憶媒体。
【図１】
0005694577.tif 000030
【図２】
0005694577.tif 000031
【図３】
0005694577.tif 000032
【図４】
0005694577.tif 000033