3

OpenGL ES 2 に関しては、マトリックス (マトリックス スタック) がなくなったことを理解しています。そのため、独自のマトリックスを作成する必要があります。

私がやりたいことは、いくつかの長方形のような単純な 2D グラフィックスを描くことです。

私が見つけたコードの多くは、まだマトリックス スタックがあった OpenGL ES 1 またはそれ以前の OpenGL を使用しているため、2.0 で直接使用することはできません。

このようなことをするコードが欲しいと思います

public void onSurfaceCreated(GL10 unused, EGLConfig eglConfig) {
    // Set the background frame color
    GLES20.glClearColor(0.1f, 0.3f, 0.5f, 1.0f);

    // Set 2D drawing mode
    GLES20.glViewport(0, 0, windowWidth, windowHeight);
    GLES20.glMatrixMode(GL_PROJECTION);
    GLES20.glLoadIdentity();
    GLES20.glOrtho(0, windowWidth, windowHeight, 0, -1, 1);
    GLES20.glDisable(GLES20.GL_DEPTH_TEST);
}

ただし、glMatrixMode、glLoadIdentity、glOrtho のメソッドはもうありません。

これを OpenGL ES 2 に変換して 2D 描画用に設定するにはどうすればよいですか? Androidが提供するMatrixクラスを使用できると思いますが、方法がわかりません。

4

1 に答える 1

3

基本的に、OpenGL ES 2.0 では行列を「設定」しません (ビューポートなどの他のものを設定したり、GL_DEPTH_TEST を無効にしたりするなど)。代わりに、マトリックスを自分で作成して管理し、各フレーム レンダリングでシェーダーに渡します。

正投影行列を作成し、それを均一としてシェーダーに渡すことができます (例: glUniformMatrix4fv)。

Android でそれを行う方法について正確にコメントすることはできませんが、Matrix クラスがある場合は、正投影行列を作成する関数が必要です。次に、glDrawArrays/glDrawElements/etc を呼び出す前に、データへのポインター (つまり、16 個の浮動小数点数 - 4x4 マトリックス) を glUniformMatrix4fv に渡すだけです。

したがって、上記のセットアップ関数ははるかに小さくなります..

public void onSurfaceCreated(GL10 unused, EGLConfig eglConfig) {
    // Set the background frame color
    GLES20.glClearColor(0.1f, 0.3f, 0.5f, 1.0f);

    // Set 2D drawing mode
    GLES20.glViewport(0, 0, windowWidth, windowHeight);
    GLES20.glDisable(GLES20.GL_DEPTH_TEST);
}

ただし、レンダリング関数は異なるように見えます (上記のオルソ投影マトリックスを作成することもできます...必要に応じて更新するだけです..つまり、画面のサイズ変更/移動/など)。

このページでは、Android についてかなり詳しく説明しています。

http://www.learnopengles.com/android-lesson-one-getting-started/

于 2013-05-19T06:48:28.797 に答える