2011-07-24 22 views
1

多くの3Dグラフィックプログラムと同様に、私は独自のモデル座標(x、y、 z軸)を含む。次に、モデル座標からワールド座標まで(描画されるオブジェクトの位置、回転、スケールを使用して)、行列を取得します。最後に、これらのワールド座標をOopenGL ES 2.0が画面に描画するために使用する標準座標に変換するための2番目の行列を持っています。モデル空間から、OpenGL ES 2.0の標準座標空間への座標を取る最も速い方法

したがって、1つのオブジェクトには、ワールド空間と標準座標の両方に同じ変換を使用する多くの頂点を含めることができるため、これらの2つの行列の積を一度計算し、両方の行列に各頂点を配置するのではなく、

しかし、私が知る限り、OpenGL ES 2.0シェーダでは行列を一度計算する方法はないようで、2つの行列のうちの1つがglUniformMatrix4fv( )(または統一を設定する別の関数)が呼び出されます。だから、一度CPU上で行列を計算し、次にユニフォームを使ってGPUに結果を出すことだけが行列を計算する唯一の方法のように思えます。そうでない場合は、次のような場合:

gl_Position = uProjection * uMV * aPosition; 

これは何度も何度も計算しますが、時間がかかるようです。

だから、どちらの方法で通常標準と見なされますか?それとも、私が完全に行方不明になっているのと違う方法がありますか? OpenGL ES 2.0プログラミングガイドでOpenGL ES 1.1パイプラインを実装するために使用されたシェーダは、1つのマトリックスしか使用していなかったので、もっと使用しましたか?

答えて

5

まず、「正準座標」の正しいOpenGLの用語は、クリップ空間です。

第二に、それはこのようになります。

gl_Position = uProjection * (uMV * aPosition); 

行列/行列乗算行列/ベクトル乗算によってあなたが投稿何を追っありません。このバージョンでは、2つの行列/ベクトル乗算が行われます。それは大きな違いです。

シェーダーベースのハードウェアを使用しています。行列をどう扱うかはあなた次第です。 「標準とみなされる」ものは何もありません。あなたはあなたが最も必要とすることをします。

モデル空間で照明をしていない限り、モデル空間と4D同質のクリップ空間の間に何らかの仲介が必要なことがよくあります。これは、光の方向、ドット(N、L)などを計算するために、位置と法線を変換する空間です。

個人的に、私は理由のために世界の空間を提案しませんI explain thoroughly here.世界の空間であろうとカメラの空間であろうとなかろうと、あなたは一般に位置が必要な中間空間を持っています。上記のコードが必要になり、時間が無駄になりません。

関連する問題