glColorPointer пытается улучшить fps - PullRequest
0 голосов
/ 27 мая 2011

В конце концов я дошел до того, что могу добавить цвет к своим вершинам. Но теперь я хочу улучшить свою скорость FPS. Вот текущая ситуация. У меня есть большое количество вершин (~ 200000), и каждая из них может быть в одном из ~ 150 классов. Каждый класс отличается по цвету. В настоящее время я рисую свои вершины как:

    glEnableClientState(GL_VERTEX_ARRAY)         
    glBindBufferARB(GL_ARRAY_BUFFER_ARB, self.bufferVertices)
    glVertexPointer(3, GL_FLOAT, 0, None)          
    glEnableClientState(GL_NORMAL_ARRAY);
    glBindBufferARB(GL_ARRAY_BUFFER_ARB, self.bufferNormals)
    glNormalPointer(GL_FLOAT, 0, None)     
    glEnableClientState(GL_COLOR_ARRAY)
    glBindBufferARB(GL_ARRAY_BUFFER_ARB, self.bufferColors)
    glColorPointer(3, GL_FLOAT, 0, None)
    glDrawArrays( GL_POINTS, 0, len(self.vertices) / 3 )

Все отлично работает и FPS ~ 60. Все мои буферы генерируются только во время инициализации. Но теперь цвета, которые представляют каждый класс, будут меняться быстро, примерно каждую миллисекунду. При этом цвета также будут меняться, поэтому мне придется заново создавать свой буфер цвета для каждого рисования, и для 200000 вершин у меня возникает ощущение, что FPS будет близок к 0. Исправление, которое я пытаюсь реализовать, состоит в том, чтобы сохранить фиксированный цвет буфер, но вместо реальных цветов они сохранят указатель на класс, которым он представлен. Таким образом, изменится только 200 цветов классов. Проблема в том, что я не знаю, как это можно реализовать в OpenGL. Это выполнимо? Есть какие-нибудь указатели, как это сделать?

Ответы [ 2 ]

2 голосов
/ 27 мая 2011

Вместо цветов классы должны установить 1D координату текстуры, тогда вместо того, чтобы изменять этот огромный набор данных, вы должны заменить только части текстуры. Чтобы избежать интерполяции сэмплирования текстур, установите текстуру в режим фильтрации GL_NEAREST и сэмплируйте текстуру в вершинном шейдере на каждую вершину (т. Е. Нет выборки текстуры на фрагмент, как вы обычно делаете).

0 голосов
/ 27 мая 2011

Я думаю, вы должны серьезно взглянуть на шейдеры.Вам не нужно каждый раз заново создавать буфер.http://en.wikipedia.org/wiki/GLSL. Шейдеры будут использовать ваш буфер для выполнения всех видов операций с цветом и геометрией.

...