Генерация нескольких точек с помощью 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()
предполагается связывать один раз для униформы после связывания шейдерной программы. Это может быть очень медленно или драйвер может их кэшировать, но это не помешает сделать это самостоятельно.