Использование OpenGL для замены Canvas – Android

Я пытаюсь заменить систему рендеринга, основанную на холсте, которая у меня уже есть с более быстрой поверхностью opengl-es, однако я не могу заставить рендеринг openGL соответствовать тому, что он действует как поле 2d, а не Вид в перспективе.

Мой текущий код для рендеринга выглядит следующим образом:

@Override public void onSurfaceChanged(GL10 gl, int width, int height) { gl.glViewport(0, 0, width, height); gl.glMatrixMode(GL10.GL_PROJECTION); gl.glLoadIdentity(); gl.glOrthof(0.0f, width, 0.0f, height, 0.0f, 1.0f); gl.glShadeModel(GL10.GL_FLAT); gl.glEnable(GL10.GL_BLEND); gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA); gl.glColor4x(0x10000, 0x10000, 0x10000, 0x10000); gl.glEnable(GL10.GL_TEXTURE_2D); } @Override public void onSurfaceCreated(GL10 gl, EGLConfig config) { gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST); gl.glClearColor(0.5f, 0.5f, 0.5f, 1); gl.glShadeModel(GL10.GL_FLAT); gl.glDisable(GL10.GL_DEPTH_TEST); gl.glEnable(GL10.GL_TEXTURE_2D); gl.glDisable(GL10.GL_DITHER); gl.glDisable(GL10.GL_LIGHTING); gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); } 

Как настроить рендер, чтобы преобразование перевода соответствовало пикселям на экране? (Поэтому перевод 5 вправо будет перемещать его 5 пикселей)

    Обратите внимание, что в openGL координата Y инвертирована. В противном случае все будет одинаково.
    Что касается правильных флагов, я рекомендую вам ознакомиться с сайтом реплики с открытым исходным кодом для Android: http://code.google.com/p/replicaisland/

    Вот что я использую в своем собственном коде:

     public void onSurfaceChanged(GL10 gl, int width, int height) { mViewWidth = width; mViewHeight = height; gl.glViewport(0, 0, mViewWidth, mViewHeight); gl.glLoadIdentity(); GLU.gluOrtho2D(gl, 0, mViewWidth, mViewHeight, 0); } public void onSurfaceCreated(GL10 gl, EGLConfig config) { gl.glClearColor(0.5f, 0.5f, 0.5f, 1); gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST); gl.glShadeModel(GL10.GL_FLAT); gl.glDisable(GL10.GL_DEPTH_TEST); gl.glEnable(GL10.GL_BLEND); gl.glBlendFunc(GL10.GL_ONE, GL10.GL_ONE_MINUS_SRC_ALPHA); gl.glViewport(0, 0, mViewWidth, mViewHeight); gl.glMatrixMode(GL10.GL_PROJECTION); gl.glLoadIdentity(); gl.glEnable(GL10.GL_BLEND); gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA); gl.glShadeModel(GL10.GL_FLAT); gl.glEnable(GL10.GL_TEXTURE_2D); GLU.gluOrtho2D(gl, 0, mViewWidth, mViewHeight, 0); } 

    Где mViewWidth & mViewHeight – размер дисплея.