Я пытаюсь изменить размер точки в вершинном шейдере в 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() используется, если он существует в коде.
попробуйте вызвать glGet (GL_POINT_SIZE_RANGE), чтобы узнать, какой самый большой поддерживаемый размер на вашем ПК. источник: http://www.opengl.org/sdk/docs/man/xhtml/glPointSize.xml –
glGetFloat (GL_POINT_SIZE_RANGE) возвращает 1.0, черт. Но в этом случае, не странно ли, что я могу изменить значение до 10.0 с помощью glPointSize (10.0f) из java? Точки слишком большие, поэтому они должны поддерживаться моим оборудованием, даже если вы еще не указали glGet ... Btw благодарит за быстрый ответ –