2014-11-09 6 views
0

Я разрабатываю приложение для Android-устройств с использованием OpenGL ES 2.0, и у меня возникают проблемы с пониманием того, как перемещать камеру - (в конечном счете, я пытаюсь создать эффект «потрясающего экрана» - поэтому мне нужно, чтобы все отображаемые в данный момент объекты перемещались в унисон).Изменение положения камеры в OpenGL ES 2.0

Итак, на данный момент у меня есть класс SpriteBatch, который я использую для загрузки нагрузки сущностей и рендеринга их всех в одном вызове OpenGL.

В этом классе, у меня Vertex и фрагмент шейдеры.

Итак, я просто создать экземпляр этого класса для моих объектов ..... что-то вроде:

SpriteBatch tileSet1 = new SpriteBatch(100); //100 tiles 

Я затем сделать это следующим образом:

tileSet1.render(); 

В моей GLSurfaceView класс (в onSurfaceChanged), я устанавливаю мой взгляд, как это:

//offsetX, offsetY, width and height are all valid and previously declared) 

GLES20.glViewport(offsetX, offsetY, width, height); 

Matrix.orthoM(mProjMatrix, 0, -ratio, ratio, -1, 1, 3, 7); 

Тогда ш ithin моего onDrawFrame() метода, я просто называю все мои логики и рендеринг, как это:

logic(); 
render(); 

(Очевидно, что моя игра петля была значительно упрощена для целей данного вопроса).

Я действительно не уверен, где я должен положить Matrix.setLookAtM.

Я попытался помещать его в класс «GLSufaceView» - снова, в onSurfaceChanged, но он, похоже, не имеет никакого эффекта. Как работает setLookAtM в отношении шейдеров? Я спрашиваю, потому что мои шейдеры находятся в моем классе «SpriteBatch» и относятся к экземплярам этого класса (я мог бы неправильно понять это полностью).

Если требуется еще какой-либо код, пожалуйста, спросите, и я отправлю сообщение.

Поблагодарите указатель в правильном направлении.

ответ

3

Звонки как Matrix.orthoM() и Matrix.setLookAtM() не изменяют ваше состояние OpenGL вообще. Это просто утилиты для вычисления матриц. Они устанавливают значения в матрице, переданной им в качестве первого аргумента, и ничего больше.

Применение этих матриц к рендерингу OpenGL - отдельная задача. Основные шаги, которые необходимы для этого в типичном случае использования являются:

  1. Объявить единую переменный типа mat4 в вашем вершинном шейдере.

    uniform mat4 ProjMat; 
    
  2. Используйте матрицу во время преобразования вершин в коде вершинных шейдеров:

    gl_Position = ProjMat * ...; 
    
  3. В коде Java, получить расположение единых переменного после компиляции и компоновки шейдера:

    int projMatLoc = GLES20.glGetUniformLocation(progId, "ProjMat"); 
    
  4. Рассчитайте нужную матрицу и используйте ее для установки значения равномерной переменной:

    Matrix.orthoM(projMat, ...); 
    ... 
    GLES20.glUseProgram(progId); 
    GLES20.glUniformMatrix4fv(projMatLoc, 1, false, projMat, 0); 
    

Следует отметить, что значения имеют единые рамки шейдер программы. Поэтому, если у вас есть несколько шейдерных программ, которые используют матрицу, и вы хотите изменить их для всех из них, вам нужно будет сделать вызов glUniformMatrix4fv() для каждого из них, сделав его активным с glUseProgram().

+0

Привет @RetroKoradi, спасибо вам. Я действительно делаю все, что вы сказали в моей рутине SpriteBatch. Таким образом, каждый экземпляр объекта (как мой пример tileSet1 выше) имеет весь код, который вы упомянули. Моя путаница в том, что это касается конкретных экземпляров этого класса (spriteBatch). Мне нужно знать, как мне перемещать камеру таким образом *** каждый *** объект (или игровой мир, если вы это сделаете), если у меня нет шейдеров вне класса SpriteBatch. – Zippy

+0

У вас есть шейдерная программа на каждом экземпляре 'SpriteBatch'? Действительно ли им нужны разные шейдеры? В противном случае это очень расточительно. –

+0

Да, как упоминалось в моем вопросе, у меня есть шейдерная пара в каждом экземпляре SpriteBatch. Различные партии могут потребовать различных преобразований, поэтому, подумав об этом, это был лучший способ - пока что это не вызвало никаких проблем (я не создаю тысячи экземпляров, самое большее, всего около 40) :-) Если они не были в моем классе SpriteBatch, где они были бы лучше всего расположены? Если я оставлю их там (как я хочу, по крайней мере, для этого проекта), как мне решить проблему, изложенную в этом вопросе? :-) Спасибо – Zippy