Точки в фоновом режиме не отображаются

#android #opengl-es

#Android #opengl-es

Вопрос:

Я создаю 2d-космический шутер для Android как способ изучения OpenGL и хочу, чтобы в игре был звездный фон. Моя идея состоит в том, чтобы просто испещрить фон белыми точками для начала, но точки не отображаются. Первый — это код средства визуализации:

 public void onSurfaceCreated(GL10 gl, EGLConfig config) {

}

public void onSurfaceChanged(GL10 gl, int w, int h) {
    gl.glViewport(0, 0, w, h);
    width = w;
    height = h;
    gl.glMatrixMode(GL10.GL_PROJECTION);
}

public void onDrawFrame(GL10 gl) {
    // black background
    gl.glClearColor(0f, 0f, 0f, 1.0f);
    // clear the color buffer to show the ClearColor we called above...
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
    gl.glLoadIdentity();

    stars.draw(gl);
}
  

Затем рисунок звезд:

 private final FloatBuffer vertexBuffer;
private int count;

public Stars() {
    Random r = new Random();
    count = (int) ((r.nextFloat() * 200.0f)   200.0f);
    count *= 3;

    ByteBuffer buffer = ByteBuffer.allocateDirect(count * Float.SIZE);
    buffer.order(ByteOrder.nativeOrder());

    // allocate _count number of floats
    vertexBuffer = buffer.asFloatBuffer();

    float rVtx = (r.nextFloat() * 2.0f) - 1.0f;
    for (int i = 0; i < count; i  = 3) {
        vertexBuffer.put(rVtx);
        rVtx = (r.nextFloat() * 2.0f) - 1.0f;

        vertexBuffer.put(rVtx);
        rVtx = (r.nextFloat() * 2.0f) - 1.0f;

        vertexBuffer.put(0.0f);
    }
}

public void draw(GL10 gl) {
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glPointSize(3);
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);

    gl.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
    gl.glDrawArrays(GL10.GL_POINTS, 0, count / 3);

    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
}
  

В чем, по-видимому, ошибка?

С уважением

Ответ №1:

Вам необходимо установить матрицу проекции по умолчанию в onSurfaceChanged. что-то вроде:

 gl.glMatrixMode( GL10.GL_PROJECTION );                
gl.glLoadIdentity();        
gl.glOrthof( -1, 1, -1, 1, -1, 1 );

gl.glMatrixMode( GL10.GL_MODELVIEW );                 
gl.glLoadIdentity();
  

И в конце звездочек () поместите это в последнюю строку:

 vertexBuffer.position(0);
  

Комментарии:

1. Добавление этого дает мне одну точку в середине экрана, так что некоторый успех, но не случайная звездная ночь. Также цвет точки черный, а не белый…

2. Тогда gl.glOrtho( -1, 1, -1, 1, -1, 1 ); ваши звезды находятся между -1 и 1

3. Хорошо, в конце, после того, как вы поместите все vertexBuffer.put(...) , вам нужно установить положение буфера в начало. Обновлен ответ