Как я могу изменить размер точки в OpenGL glBegin (GL POINTS)?

есть ли способ изменить размер точки при рисовании большого количества точек? Я знаю, что есть glPointSize (float), но есть ли способ сделать это в "пакете" или массиве?

Я хотел бы, чтобы точки имели разные размеры на основе атрибута данных. Например, каждая точка имеет X, y, z и атрибут size. Я использую буферы кадров прямо сейчас в java.

могу ли я использовать шейдеры вершин для этого?

5 ответов


вы можете использовать point sprite: включите его с помощью glEnable(GL_VERTEX_PROGRAM_POINT_SIZE); и тогда вы можете использовать gl_PointSize атрибут в вашей программе vertex.

пример вершинного шейдера взят из обсуждение темы OpenGL:

void main() {
    gl_FrontColor=gl_Color;
    gl_PointSize = gl_Normal.x;
    gl_Position = ftransform();
} 

Я считаю, что это с glPointSize (размер GLfloat)

источник:

http://www.talisman.org/opengl-1.1/Reference/glPointSize.html


С GL_POINT_DISTANCE_ATTENUATION (GL14?) вы можете установить коэффициенты для функции (я думаю, что это квадратично) для вычисления размера точки с расстояния Z.


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

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

вы можете попытаться отсортировать данные точки по размеру и группировать точки одного размера в один массив и нарисовать каждый массив с другим размером точки.

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