Генерация нескольких точек с помощью GL_POINTS

Я пытаюсь создать случайную контурную карту с помощью OpenGL ES в Android. Я создал класс Point для рисования точек на экране, но я не знаю, каким должен быть подход к рисованию случайных точек.

Например, для отображения 2 точек я создаю 2 объекта

mPoint = new Point();

mPoint2 = new Point();

внутри моего рендерера и рисования их в onDrawFrame метод

mPoint.draw(scratch,0.0f,0.0f,0.0f);
mPoint2.draw(scratch,0.0f,0.5f,0.0f);

Сейчас я собираюсь сгенерировать 500 точек, и неправильно создавать 500 объектов, которые могут перекрываться (те же координаты x,y,z). Мой подход рисования точек прямо сейчас? Как мне продолжить создание представления с большим количеством точек в нем?

Класс My Point

public class Point {
private  int mProgram, mPositionHandle, mColorHandle, mMVPMatrixHandle;


private final String vertexShaderCode =
        // This matrix member variable provides a hook to manipulate
        // the coordinates of the objects that use this vertex shader
        "uniform mat4 uMVPMatrix;" +
                "uniform vec4 vPosition;" +
        "void main() {" +
                "   gl_Position = uMVPMatrix * vPosition;" +
                "   gl_PointSize = 20.0;" +
                "}";

private final String fragmentShaderCode =
        "precision mediump float;" +
                "uniform vec4 vColor;" +
                "void main() {" +
                "   gl_FragColor = vColor;" +
                "}";


// Set color with red, green, blue and alpha (opacity) values
float color[] = { 0.63671875f, 0.76953125f, 0.22265625f, 1.0f };

public Point(){
    int vertexShader = MyGLRenderer.loadShader(GLES20.GL_VERTEX_SHADER,
            vertexShaderCode);
    int fragmentShader = MyGLRenderer.loadShader(GLES20.GL_FRAGMENT_SHADER,
            fragmentShaderCode);

    // create empty OpenGL ES Program
    mProgram = GLES20.glCreateProgram();

    // create empty OpenGL ES Program
    mProgram = GLES20.glCreateProgram();

    // add the vertex shader to program
    GLES20.glAttachShader(mProgram, vertexShader);

    // add the fragment shader to program
    GLES20.glAttachShader(mProgram, fragmentShader);

    // creates OpenGL ES program executables
    GLES20.glLinkProgram(mProgram);
}

public void draw(float[] mvpMatrix,float px,float py,float pz) {
    float positionCoords[] = {px,py,pz,1.0f};

    // Add program to OpenGL ES environment
    GLES20.glUseProgram(mProgram);

    // get handle to vertex shader's vPosition member
    mPositionHandle = GLES20.glGetUniformLocation(mProgram, "vPosition");

    mColorHandle = GLES20.glGetUniformLocation(mProgram,"vColor");

    // Set color for drawing the triangle
    GLES20.glUniform4fv(mColorHandle, 1, color, 0);

    GLES20.glUniform4fv(mPositionHandle, 1, positionCoords, 0);

    // get handle to shape's transformation matrix
    mMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix");

    //TRANSLATION
    float[] transMatrix = new float[16];

    Matrix.setIdentityM(transMatrix,0);
    Matrix.translateM(transMatrix,0,0.5f,0,0);
    Matrix.multiplyMM(transMatrix,0,mvpMatrix,0,transMatrix,0);


    // Apply the projection and view transformation
    GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, transMatrix, 0);

    GLES20.glDrawArrays(GLES20.GL_POINTS, 0, 1);
}

}

Изменить: я хотел бы иметь возможность генерировать их каждые 10 секунд.

1 ответ

Это не очень хороший подход. Один вызов отрисовки для каждой точки создаст ОГРОМНЫЕ издержки драйвера и общую плохую производительность графического процессора. Вы должны объединить свои позиции и цвета в уникальный буфер вершин и рисовать только один раз.

Также GetUniformLocation() предполагается связывать один раз для униформы после связывания шейдерной программы. Это может быть очень медленно или драйвер может их кэшировать, но это не помешает сделать это самостоятельно.

Другие вопросы по тегам