2013-09-22 5 views
3

Я пытаюсь изменить размер точки в вершинном шейдере в LWJGL и не могу заставить его работать. Размер точки всегда равен 1px, если я попытаюсь изменить его из шейдера.LWJGL vertex shader gl_PointSize не работает

Vertex шейдеров:

void main(){ 
    gl_Position = gl_ModelViewProjectionMatrix*gl_Vertex; 
    gl_PointSize = 10.0; 
} 

Фрагмент шейдеры:

void main(){ 
    gl_FrontColor = gl_Color; 
} 

Розыгрыш код:

glClear(GL_COLOR_BUFFER_BIT); 
glBindBuffer(GL_ARRAY_BUFFER, p_vbo); 
glVertexPointer(3, GL_FLOAT, 0, 0); 
glBindBuffer(GL_ARRAY_BUFFER, c_vbo); 
glColorPointer(4, GL_FLOAT, 0, 0); 
glEnableClientState(GL_VERTEX_ARRAY); 
glEnableClientState(GL_COLOR_ARRAY); 
glDrawArrays(GL_POINTS, 0, particles_num); 
glDisableClientState(GL_COLOR_ARRAY); 
glDisableClientState(GL_VERTEX_ARRAY); 

Моя цель состоит в том, чтобы динамически изменять размер точки, но я не могу изменить размер точки из шейдера. Если я называю этот код:

glPointSize(10.0f); 

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

glEnable(GL_VERTEX_PROGRAM_POINT_SIZE); 

Просто уточнить: я могу вынести все свои очки и все работает замечательно, но размер точки всегда 1px. Я также не использую гладкие точки.

EDIT: glGetFloat (GL_POINT_SIZE_RANGE) возвращает 1.0, что должно указывать на то, что мое оборудование не поддерживает другие точки, чем 1,0. Но если я изменить мой раздаточный код из:

glDrawArrays(GL_POINTS, 0, particles_num); 

к:

for (int i = 0; i < particles_num; i++) { 
    glPointSize(massBuff.get(i)); 
    glDrawArrays(GL_POINTS, i, 1); 
} 

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

EDIT: Я также попытался:

glEnable(GL_PROGRAM_POINT_SIZE); 

Что не работает. Программа ведет себя так, как будто я никогда не включал GL_PROGRAM_POINT_SIZE, поскольку он использует glPointSize(), если он существует в java-коде. Насколько я понимаю, все вызовы glPointSize() будут игнорироваться, если включен GL_PROGRAM_POINT_SIZE, и программа ожидает, что шейдер установит значение, но при этом glPointSize() используется, если он существует в коде.

+0

попробуйте вызвать glGet (GL_POINT_SIZE_RANGE), чтобы узнать, какой самый большой поддерживаемый размер на вашем ПК. источник: http://www.opengl.org/sdk/docs/man/xhtml/glPointSize.xml –

+0

glGetFloat (GL_POINT_SIZE_RANGE) возвращает 1.0, черт. Но в этом случае, не странно ли, что я могу изменить значение до 10.0 с помощью glPointSize (10.0f) из java? Точки слишком большие, поэтому они должны поддерживаться моим оборудованием, даже если вы еще не указали glGet ... Btw благодарит за быстрый ответ –

ответ

0

Из того, что я могу сказать, состояние, которое вы должны использовать glEnable, называется GL_PROGRAM_POINT_SIZE, а не GL_VERTEX_PROGRAM_POINT_SIZE. Это имеет значение для вас?

+0

Это не повлияло. Все еще не в состоянии изменить размер шейдера. –

0

Я столкнулся с проблемой, используя OpenGL2ES2.

В вершинном шейдере установка значения gl_PointSize не имела никакого эффекта. Ширина линий, напротив, может быть указана, и она работает. Я не уверен в причине этого, но кажется, что точки не очень хорошо обработаны/не являются частью GL2ES2.

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

Идея состоит в том, чтобы использовать линии как точки ... Да. Например, чтобы иметь точку ширины 6 пикселей, в позиции (X, Y) вам просто нужно нарисовать линию шириной 6px (X-width/2, y) до (X + width/2, y). Конечно, вам придется адаптировать длину линии в зависимости от расстояния от камеры/зума.

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

+0

Я согласен, это своего рода хакерское решение. Я не вижу, как вы получаете гладкие точки с помощью glEnable (GL_POINT_SMOOTH) с вашим решением, но оно может работать для прямоугольных точек, но тогда я просто буду использовать квадратики ^^, хотя вначале вы использовали бы строку, чтобы указать первые данные ввода в качестве позиции и первый из двух других в качестве размера, а затем использовать это в геометрическом шейдере, чтобы создать точку или что-то еще ... ЭТО было бы взломано! –

+0

Aggree с вами, это очень громоздкое обходное решение. Мне нужна была точка для визуальной отладки, когда сглаживание точки не требуется. Это по-прежнему имеет преимущества использования (немного) меньше данных, чем квадрациклов, и может быть загружено с моими линиями отладки. –