Рисование линий Java OpenGL с буферами вершин

Я пытаюсь рисовать много линий на экране одновременно, используя полосы линий OpenGL, и производительность низкая, и мне было предложено использовать буфер вершин. Я новичок в буферах вершин - нужен ли мне новый буфер для каждой линии, которую я хочу нарисовать, или я использую один буфер для всех линий (они не обязательно связаны друг с другом)? На данный момент у меня есть список линий (где каждая строка представляет собой список вершин), но я не уверен, как их быстро отобразить. Любая помощь будет оценена по достоинству.

РЕДАКТИРОВАТЬ: Вот мой текущий код, который дает исключение: РЕДАКТИРОВАТЬ2: Перемотка буфера перед вызовом glVertexPointer зафиксировала исключение, поскольку пут продвигал буфер. Теперь это исправлено.

java.lang.IndexOutOfBoundsException: Required 1 remaining elements in buffer, only had0
at com.sun.gluegen.runtime.BufferFactory.rangeCheck(BufferFactory.java:247)
at com.sun.opengl.impl.GLImpl.glVertexPointer(GLImpl.java:27937)

    for (int i = 0; i < lines.size(); i++)
    {
        List<Vertex> v = lines.get(i);
        DoubleBuffer buf = BufferUtil.newDoubleBuffer(v.size() * 3);

        Iterator<Vertex> iter = v.iterator();
        while (iter.hasNext())
        {
            Vertex vt = iter.next();
            buf.put(new double[] { vt.x, vt.y, vt.z });
        }
        gl.glVertexPointer(3, GL.GL_DOUBLE, 0, buf);
        gl.glEnableClientState(GL.GL_VERTEX_ARRAY);
        gl.glDrawArrays(GL.GL_LINES, 0, v.size());
        gl.glDisableClientState(GL.GL_VERTEX_ARRAY);
    }

Надеюсь, это поможет лучше понять мою проблему (я знаю, что в этом коде есть проблемы, но пытаюсь изучить здесь).

Спасибо, Джефф


person Jeff Storey    schedule 27.01.2010    source источник


Ответы (2)


Я также новичок в opengl и не знаком с привязками java, но я постараюсь указать вам правильное направление, пока не появится лучший ответ.

Насколько я знаю, существует только один буфер вершин. Вы можете визуализировать непосредственно в буфер вершин с данными на стороне клиента. Если вы хотите это сделать, изучите такие вызовы, как glEnableClientState(GL_VERTEX_ARRAY), glBindBuffer, glVertexPointer, glDrawElements. Вам также нужно будет записать в индексный массив.

Согласно сайту opengl, эти вызовы теперь устарели в пользу Vertex Buffer Objects. Я мало что о них знаю, но, исходя из вашего вопроса, это то, что люди предлагали вам. Они довольно хорошо объяснены с примером кода здесь:

http://www.opengl.org/wiki/Vertex_Buffer_Objects

Что касается ваших проблем с производительностью, кажется странным, что у вас будут проблемы только из-за линейных полос. Я также хотел бы проверить, есть ли у вас правильные драйверы opengl для вашей видеокарты, или, может быть, попробовать родной язык, такой как c++, вместо java.

person Bill Prin    schedule 27.01.2010
comment
нет, буфер вершин не один. Вы можете иметь столько, сколько хотите. Вы не выполняете визуализацию в VBO, вы заполняете их с помощью glBufferData и/или glBufferSubData. вы обращаетесь к данным путем смещения в vbo с помощью glBindBuffer+glVertexPointer и фактически используете данные в последовательном Draw. VBO являются буферами вершин. - person Bahbar; 28.01.2010

буферы вершин - это просто память, выделенная и управляемая GL. Таким образом, они не имеют прямого отношения к Draw.

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

Однако ваш вопрос не очень количественный. Что именно вы имели в виду под «это медленно»? Сколько линий вы хотите нарисовать? сколько вызовов отрисовки вы выполняете в настоящее время? Какую производительность вы получаете? Какие линии вы рисуете?

Трудно быстро нарисовать множество полос линий, потому что для каждой из них требуется отдельный вызов отрисовки. Однако с помощью GL_LINES можно группировать несколько линий в одном и том же розыгрыше. И это должно работать значительно лучше.

Изменить, чтобы добавить:

Хорошо, я посмотрел ваш код... Я не очень знаком с GL в java, но этот код выглядит подозрительно, поскольку он не передает buf в VertexPointer. Он проходит v ? Также ваш put выглядит подозрительно. Разве вы не должны нажимать двойные числа, а не двойной массив?

person Bahbar    schedule 27.01.2010
comment
Извините за неточность. Я пытаюсь использовать GL_LINES, как показано в моем редактировании выше, но не могу заставить его работать. - person Jeff Storey; 28.01.2010
comment
Да вы правы. это был тип-о. Код работает сейчас. Я использую его с NASA WorldWind, но рендеринг все еще очень медленный. Я не уверен, связано ли это с WorldWind или OpenGL... - person Jeff Storey; 28.01.2010