Когда вызывать glMatrixMode () - PullRequest
       3

Когда вызывать glMatrixMode ()

2 голосов
/ 16 ноября 2010

Большинство руководств по OpenGL ES для Android, которые я выполнил, имеют функцию onSurfaceChanged (), например:

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();
}

Однако, что здесь за группировка? Должен ли glMatrixMode () вызываться после glViewport? И должен ли glLoadIdentity () вызываться сразу после glMatrixMode ()?

Ранее я кодировал «полный» OpengGL, и в своих старых кодах я сначала вызывал glMatrixMode (), затем gluPerspective и last glLoadIdentity (). Как будто один из первых устанавливает, какую матрицу следует использовать для gluPerspective (), а последний устанавливает glIdentity (), чтобы завершить его.

Каков правильный порядок вызова glMatrixMode (), glIdentity () и gluPerspective () - и почему? Есть ли различия между OpenGL и OpenGL ES для настройки glMatrixMode ()?

Ответы [ 2 ]

9 голосов
/ 17 ноября 2010

glViewport () полностью независим от стеков матричного преобразования и может быть вызван в любое время.

glLoadIdentity () обычно вызывается сразу после смены режима матрицы, поэтому вы начинаете «заново», если хотите. Матричные преобразования, такие как gluPerspective (), glOrtho (), glFrustum (), glRotate (), glMultMatrix (), glTranslate (), являются кумулятивными операциями, поскольку они агрегируют, чтобы позволить вам описывать сложные преобразования трехмерного пространства мира или описывать просмотр OpenGL объем. Пример: если я хочу, чтобы куб переводился в направлении + X, а затем вращался вокруг оси Z, я запускаю glRotate (), за которым следует glTranslate ().

glLoadIdentity () стирает матрицу (текущего режима матрицы) с единичной матрицей, поэтому следование за gluPerspective () с помощью glLoadIdentity () эквивалентно единственному вызову glLoadIdentity (). Другими словами, эта последовательность бессмысленна.

В обратном порядке, потому что gluPerspective () умножит текущую матрицу на перспективное преобразование. Если текущая матрица является тождественной, то умножение просто приведет к матричному преобразованию gluPerspective (), которое вам нужно для режима матрицы проекции в 99% случаев при просмотре в перспективе.

Нет различий между OpenGL и OpenGL ES в отношении поведения glMatrixMode () или того, как эти функции матрицы изменяют состояние матрицы GL.

2 голосов
/ 16 ноября 2010

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

Код, который вы разместили, точно такой же, как и в обычном OpenGL.

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