Android OpenGLES 2.0 2D рендеринг - PullRequest
0 голосов
/ 21 декабря 2011

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

Я пытаюсь сделать игру на основе плитки в GLES2.0, но я не могу получить что-либо, чтобы показать, как я хочу.В основном у меня есть массив вершин, которые составляют пары треугольников, которые будут образовывать квадратную сетку.Я хочу использовать GLES20.glDrawArrays() для рисования подразделов этой сетки одновременно.

Я выяснил, как «смотреть» с другой точки зрения, используя комбинацию Matrix.orthoM() и Matrix.setLookAtM(), но дляЯ могу понять, как мои треугольники не заполняют весь экран.

Мне действительно нужны некоторые рекомендации по настройке проекции, чтобы, если треугольник определен как (0,0,0) (0,20,0) (20,0,0) он отображается на экране как 20 пикселей в ширину и 20 пикселей в высоту, переведенный моим текущим видом.

Вот то, что у меня есть в настоящее время, но это простозаполняет весь мой экран зеленым.Если бы кто-то мог показать мне правильный способ манипулирования сценой так, чтобы она заполняла камеру, или камера показывает только как 20 треугольников в ширину и 10 треугольников в высоту, что сделало бы мою неделю.

При изменении поверхности:

GLES20.glViewport(0, 0, ScreenX, ScreenY);
float ratio = ScreenX / ScreenY;
Matrix.orthoM(_ProjMatrix, 0, 
    -ratio, 
    ratio, 
    -1, 1, 
    3, 7);
Matrix.setLookAtM(_VMatrix, 0, 
    60, 60, 7, 
    60, 60, 0, 
    0, 1, 0);

Начало рисования:

GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);
Matrix.multiplyMM(_MVPMatrix, 0, _ProjMatrix, 0, _VMatrix, 0);
if (_activeMap != null)
  _activeMap.draw(0, 0, (int)ScreenX, (int)ScreenY, _MVPMatrix);

Функция рисования:

public void draw(int x, int y, int width, int height, float[] MVPMatrix)
{
    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
    GLES20.glUseProgram(_pHandle);
    GLES20.glUniformMatrix4fv(_uMVPMatrixHandle, 1, false, MVPMatrix, 0);

    int minRow, minCol, maxRow, maxCol;
    minRow = (int) (y / Engine.TileSize);
    minCol = (int) (x / Engine.TileSize);
    maxRow = (int) (minRow + (height / Engine.TileSize));
    maxCol = (int) (minCol + (width / Engine.TileSize));
    minRow = (minRow < 0) ? 0 : minRow;
    minCol = (minCol < 0) ? 0 : minCol;
    maxRow = (maxRow > _rows) ? (int)_rows : maxRow;
    maxCol = (maxCol > _cols) ? (int)_cols : maxCol;

    for (int r = minRow; r < maxRow - 1; r++)
      for (int d = 0; d < _vBuffers.length; d++)
      {
        _vBuffers[d].position(0);
        GLES20.glVertexAttribPointer(_vAttHandle, 3, GLES20.GL_FLOAT, 
            false, 
            0, _vBuffers[d]);               
        GLES20.glEnableVertexAttribArray(_vAttHandle);
        GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 
            (int) (r * 6 * _cols), 
            (maxCol - minCol) * 6);
      }
}

Сценарий шейдера:

private static final String _VERT_SHADER =
  "uniform mat4 uMVPMatrix;                  \n"
+ "attribute vec4 vPosition;                 \n"
+ "void main()                               \n"
+ "{                                         \n"
+ "   gl_Position = uMVPMatrix * vPosition;  \n"
+ "}                                         \n";

private static final String _FRAG_SHADER = 
  "precision mediump float;                            \n"
+ "void main()                                         \n"
+ "{                                                   \n"
+ "    gl_FragColor = vec4 (0.63671875, 0.76953125, 0.22265625, 1.0); \n"
+ "}                                                   \n";

Ответы [ 2 ]

1 голос
/ 21 декабря 2011

Для игры на основе плиток простой перевод был бы более подходящим, setLookAt - это просто перебор.

0 голосов
/ 21 декабря 2011

Я надеюсь, что это может помочь вам. Проверьте эту ссылку для программирования OpenGL.

Руководство по программированию OpenGL

Перейти к Глава 3. Просмотр здесь вы можете найти информацию о проекции.

...