Попытка использовать Орто для рисования 2D - PullRequest
1 голос
/ 16 ноября 2010

У меня проблемы с настройкой вида Ortho для рисования 2D поверх 3D-сцены.

Я настроил свой вид следующим образом:

public void onSurfaceChanged( GL10 gl, int width, int height ) {
    gl.glViewport( 0, 0, width, height );
    gl.glMatrixMode( GL10.GL_PROJECTION );
    gl.glLoadIdentity();
    GLU.gluPerspective( gl, 45.0f, ( ( float )width / ( float )height ), 0.1f, 100.0f );
    gl.glMatrixMode( GL10.GL_MODELVIEW );
    gl.glLoadIdentity();
}

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

public void onSurfaceOrtho( GL10 gl ) {
    gl.glOrthof( 0.0f, 100.0f, 100.0f, 0.0f, -0.1f, 0.1f );
    gl.glMatrixMode( GL10.GL_PROJECTION );
    gl.glLoadIdentity();
}

Затем я рисую свою рамку так:

public void onDrawFrame( GL10 gl ) {
    gl.glClear( GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT );
    gl.glLoadIdentity();
    scene.onDrawFrame( gl );
    gl.glPushMatrix();
    onSurfaceOrtho( gl );
    screen.onDrawFrame( gl );
    gl.glPopMatrix();
}

Объекты сцены и экрана являются объектами рисования для 3D и 2D.Объект на экране пока ничего не рисует, так как я только начинаю с двухмерных видов Ortho.Однако объекты сцены рисуют куб.Так что все работает нормально, пока я не добавлю новый код для 2D-рисования Орто - от glPushMatrix () до glPopMatrix ().Теперь я не вижу ничего, кроме моего ясного цвета.

Так что же делает код в функции onSurfaceOrtho (), который очищает мой экран?

Я ожидаю, что было нарисованопредставление перед вызовом, чтобы настроить представление Ortho, чтобы остаться в покое.Я не вызываю никаких явных битов, но все же кажется, что что-то очищает мой взгляд - и это код в функции onSurfaceOrtho ().

Как правильно настроить 2D-представление Ortho, чтобы яможно нарисовать 2D поверх моего 3D вида?

1 Ответ

1 голос
/ 16 ноября 2010

Итак, я понял, что делать с небольшой помощью Мартиньо Фернандеса.

Я настроил две функции:

public void onSurfaceOrtho( GL10 gl ) {
    gl.glMatrixMode( GL10.GL_PROJECTION );
    gl.glLoadIdentity();
    gl.glOrthof( 0.0f, 100.0f, 0.0f, 100.0f, -0.1f, 0.1f );
    gl.glMatrixMode( GL10.GL_MODELVIEW );
    gl.glLoadIdentity();
}

public void onSurfacePerspective( GL10 gl ) {
    gl.glMatrixMode( GL10.GL_PROJECTION );
    gl.glLoadIdentity();
    GLU.gluPerspective( gl, 45.0f, aspect, 0.1f, 100.0f );
    gl.glMatrixMode( GL10.GL_MODELVIEW );
    gl.glLoadIdentity();
}

Тогда, когда рамка нарисована:

public void onDrawFrame( GL10 gl ) {
    gl.glClear( GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT );
    gl.glLoadIdentity();
    onSurfacePerspective( gl );
    scene.onDrawFrame( gl );
    onSurfaceOrtho( gl );
    screen.onDrawFrame( gl );
}

Таким образом, для каждого кадра я должен вызывать свою функцию для установки перспективы перед рисованием 3D, а затем вызывать мою функцию для орто перед рисованием 2D.

Я не уверен, что у этого есть проблемы с производительностью, или я могу что-то с этим поделать. Я знаю, что у «полного» OpenGL есть списки, которые могут немного помочь здесь ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...