Bogdan Daniel
Bogdan Daniel

Reputation: 2749

Generating multiple points with GL_POINTS

I'm trying to generate a random contour map using OpenGL ES in Android. I have created a Point class for drawing points on the screen, but I don't know what my approach should be about drawing the random points.

For example, for displaying 2 points, I'm creating 2 objects

mPoint = new Point();

mPoint2 = new Point();

inside my Renderer and drawing them in the onDrawFrame method

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

I'm now going to generate 500 points and it doesn't sound right to create 500 object that may overlap(same x,y,z coordinates). Is my approach of drawing points right so far? How should I continue in creating a view with a large amount of points in it?

My Point class

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

}

Edit: I'd like to be able to generate them every 10 seconds.

Upvotes: 2

Views: 722

Answers (1)

pleluron
pleluron

Reputation: 733

This is not a good approach. One draw call per point will create HUGE driver overhead and overall bad GPU performance. You should batch your positions and colors into a unique vertex buffer and draw only once.

Also GetUniformLocation() is meant to be called once per uniform after linking the shader program. It could be really slow or the driver could cache them, but it doesn't hurt to do it yourself.

Upvotes: 1

Related Questions