1

openGL 2.0アプリでglTranslate()、glRotate()、glScale()などの固定関数メソッドを使用したいと思います。私は行列クラスを実装する必要があることを知っています-そしてこれを実行しました。今の私の質問は効率についてです。次のようなものを使用できるようにするには:

glLoadIdentity();
glRotatef(2.0f, 0.0f, 0.0f, 1.0f);
glScalef(2.0f, 2.0f, 2.0f);

少なくとも3つの行列乗算を実行する必要があると思います(射影があり、モデルビューが行列化され、これがモデルビュー用であると仮定します)。最初は次のようになります:Identity-Matrix *Rotation-Matrix-2番目は次のようになります:ActualMatrix * ScaleMatrixそして最後は次のようになります:projectionMatrix * ActualMatrix(そしてこのImは均一な値としてシェーダーに渡されます)。

glUniformMatrix4fv(uniforms[UNIFORM_MODELVIEW_PROJECTION_MATRIX], 1, GL_FALSE, matrix->getProjectionModelviewMatrix());

したがって、私のVertexshaderは次のようになります。

attribute vec4 position;
attribute vec4 color;

varying vec4 colorVarying;

uniform mat4 modelViewProjectionMatrix;

void main()
{
    gl_Position = modelViewProjectionMatrix * position;
    colorVarying = color;
}

OpenGL ES 1.1でも同じように行われますか?glRotate、glScale、glTranslate...呼び出し-それは私にとって非常に思えます。それとももっと良い方法はありますか?(おそらく行列の乗算が少ないですか?)

このトピックに関するヘルプをいただければ幸いです。読んでくれてありがとう

4

2 に答える 2

4

項の多くは常に0.0または1.0であるため、ID、平行移動、回転、およびスケーリングの行列を適用するために完全な行列の乗算は必要ありません。他の行列にこれらの行列を乗算した要素ごとの結果を書き出すと、多くの要素には、最終的な値に寄与するいくつかの項しかないことがわかります。2つの簡単な例:

  • 単位行列Iと任意の行列Mが与えられると、I × M = M × I = Mとなります。
  • スケーリング行列Sのゼロ以外の要素は、対角線に沿った4つだけです。これを、 S 0S 1S 2、およびS3と呼びます。(S 3は、のようなものでは常に1.0ですglScalef。)S × Mは、 Mのn番目の行をSnでスケーリングしますM × Sは、代わりに列ごとに機能します。単位行列は、特に退屈なスケーリング行列と考えることもできます。

結果として得られる平行移動と回転の要素ごとの式は、これらの例よりも少し複雑ですが、完全な行列の乗算よりもはるかに単純です。(回転軸がX、Y、またはZ軸と正確に一致している場合、回転も非常に簡単になります。)変換、スケーリング、または回転を求められた場合は、マトリックスの変更を直接検討することをお勧めします。別の行列を作成して乗算します。

于 2011-02-03T07:53:50.543 に答える
0

これをチェックしてください:http://glm.g-truc.net/about.html

于 2011-02-02T15:50:58.933 に答える