Как я могу изменить размер точки в OpenGL glBegin (GL_POINTS)? - PullRequest
8 голосов
/ 04 января 2011

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

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

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

Ответы [ 5 ]

15 голосов
/ 04 января 2011

Вы можете использовать точечный спрайт: включите его, используя glEnable(GL_VERTEX_PROGRAM_POINT_SIZE);, а затем вы можете использовать атрибут gl_PointSize в вашей программе вершин.

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

void main() {
    gl_FrontColor=gl_Color;
    gl_PointSize = gl_Normal.x;
    gl_Position = ftransform();
} 
2 голосов
/ 13 ноября 2013

Это было то, что я когда-либо делал,

 //reset 
 glLoadIdentity();                                   

 //set size to 1 for a group of points
 glPointSize(1);                                     

 //group #1 starts here     
 glBegin(GL_POINTS);                                 

    //color of group #1 is white 
    glColor3f(1,1,1);                                

    for(int a=0; a<x; a++)
        for(int b=0; b<y; b++)
                    glVertex3f(a/953.,-b/413.,0.);   //location of points
 glEnd();


 //set size to 5 for another group of points
 glPointSize(5);  

 //group #2 starts here     
 glBegin(GL_POINTS);

    //color of group #2 is red 
    glColor3f(1,0,0);
    for(unsigned long int a=0; a<jd; a++)
    {
           glVertex3f(data[a].i,data[a].j,0);
    }
 glEnd();
0 голосов
/ 21 июля 2014

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

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

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

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

0 голосов
/ 04 января 2011

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

0 голосов
/ 04 января 2011

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

Источник:

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

...