#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 и 13. Хорошо, в конце, после того, как вы поместите все
vertexBuffer.put(...)
, вам нужно установить положение буфера в начало. Обновлен ответ