ПрограммированиеФорумГрафика

рисовать линии на GLSL

Страницы: 1 2 3 Следующая »
#0
16:03, 30 окт 2018

Привет
кто писал линии, раньше было через glBegin(GL_LINES), но теперь думаю как через шейдер это сделать с задаваемой толщиной
с шейдерами не знаком, перевожу старый gl код на шейдеры
кроме SDF какие есть ещё подходы?
получается под разные форматы вершин нужны разные буферы и шейдеры? или можно одним махом

например
https://www.shadertoy.com/view/XtlXz7
семь корней на каждый пиксель кажется жирновато чтобы рисовать линии

или как эффективнее всего рисовать линии имея массив вершин? желательно без геометрического шейдера
что быстрее генерить треугольникими ширину линии или SDF или ещё что?

#1
16:40, 30 окт 2018

Ivashka
glPolygonMode задаёт режим залит/не залит для полигонов, в тему не попал

#2
20:04, 30 окт 2018

slax
> glPolygonMode задаёт режим залит/не залит для полигонов, в тему не попал
Ну от чего же? Если надо вывести меш линиями, это вполне подходит. А рисовать просто линии можно как обычно.

#3
22:37, 30 окт 2018

вопрос про линии с толщиной на шейдере, а не про меш линиями

#4
23:15, 30 окт 2018

slax
> вопрос про линии с толщиной на шейдере, а не про меш линиями
как и раньше

qglHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
GL_Enable(GL_BLEND); 
GL_BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);  
GL_Enable(GL_LINE_SMOOTH);
qglLineWidth(3.0);
#5
0:54, 31 окт 2018

barnes
Человек спрашивает про эффективный способ, а ты ему самый неэффективный предлагаешь.

slax
Два треугольника пробовал?

#6
11:13, 31 окт 2018

2D или 3D (в 2D куча способов, выбирай - не хочу. все зависит от количества и качества линий)?

>семь корней на каждый пиксель кажется жирновато чтобы рисовать линии
нет, жирновато - это рисовать прямоугольник с экран для вывода каждой линии, которая займет 0.001% площади.

#7
16:47, 31 окт 2018

у меня такие вопросы т.к. не доконца разобрался как это будет, пытаюсь сформулировать
эта задача, пологаю, аналогична рисованию кучи частиц на GPU, они тоже нужны

нельзя же сделать шейдер который с одного буфера какогото формата рисует - точки, линии и трианглы; для каждого примитива нужен свой шейдер?

MrShoor
два треугольника это на один сегмент линии 4 вешрины, в теории SDF линии в 2 раза больше нарисует, т.к. слать можно только 2 вершины + толщина (запаковку позже проверить можно)
т.к. при большом количестве примитивов тормозит именно передача данных (все линии динамические обновляются каждый кадр)
ещё два треугольника для широких  линий на стыках дают вырез - думал вставлять туда круг

BingoBongo
макслимальное количество, качество...
только 2Д пока что
ссылка же, как пример, что в фрагментный шейдер запихать, обязательно ли для этого рисовать прямоугольник с экран - не знаю

#8
17:15, 31 окт 2018

slax
> макслимальное количество, качество...
Нельзя и то и то сделать максимальным

slax
> только 2Д пока что
в 3d будут проблемы, если нужна толщина

slax
> ссылка же, как пример, что в фрагментный шейдер запихать, обязательно ли для
> этого рисовать прямоугольник с экран - не знаю
Ясно, ты не понимаешь, что там происходит. Во фрагментном шейдере ты не можешь бездумно рисовать в произвольные места, и там не прокатит drawLine(start,end). Шейдер выполняется в каждом пикселе. Поэтому если ты решишь нарисовать 1000 линий, то на самом деле отрисуется 1000*1920*1080 линий для fullhd экрана.

#9
20:21, 31 окт 2018

slax
> в теории SDF линии в 2 раза больше нарисует,
SDF сдохнет на филлрейте

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

> ещё два треугольника для широких  линий на стыках дают вырез - думал вставлять
> туда круг
Круг можно прямо на полоске из двух треугольнико вырезать в пиксельном шейдере

#10
21:54, 31 окт 2018

MrShoor
>SDF сдохнет на филлрейте
если толщину большую делать то филрейт будет большой, толщиной в пиксель филрейт линии не велик, фрагментный шейдер же только по позициям примитивов, пиксили обрабатывает - или не так? Алгоритм Брезенхэма дешевле SDF линии в пиксель ?

>Если хочется быстро менять линии, то инстансинг
и хранить массив трансформаций инстансов в буфере большем чем для самих вершин линий?

BingoBongo
>Нельзя и то и то сделать максимальным
поэтому они перечислины последовательно

>Во фрагментном шейдере ты не можешь бездумно рисовать в произвольные места, и там не прокатит drawLine(start,end).
если все линии рисовать одним фрагментрым шейдером в фуллсклин это будет быстрее чем столько же рисовать линий через glDrawArrays GL_LINES ?

> Шейдер выполняется в каждом пикселе. Поэтому если ты решишь нарисовать 1000 линий, то на самом деле отрисуется 1000*1920*1080 линий для fullhd экрана.

#11
22:10, 31 окт 2018

slax
> дешевле SDF линии в пиксель
Как ты собираешься рисовать эту SDF линию?

> и хранить массив трансформаций инстансов в буфере большем чем для самих вершин линий?
Инстансинг - это не массив трансформаций. Можно хранить просто 2 точки и толщину.

#12
23:28, 31 окт 2018

MrShoor
>Как ты собираешься рисовать эту SDF линию?
ну обычную GL_LINE с glLineWidth(20) и в фрагментном шейдере считать затухания краев по расстоянию, но скругление на стыке двух линий будет не там

похожий пост https://gamedev.stackexchange.com/questions/47831/2d-line-drawing… pixel-shaders

>Инстансинг
gl_InstanceID доступна только с OpenGL 4.1
each separate uniform takes up 4 components, number of active uniforms 1024 in OpenGL 3.0+ - (https://www.khronos.org/opengl/wiki/Uniform_(GLSL)#Implementation_limits)

при нём нужно задаваться лимитами на количество или можно в рилтайм менять размер массива как и его содержание? в приделах лимита ?
что то там не чисто - "gl_InstanceID always falls on the half-open range [0, instancecount​). If you have GLSL 4.60, you may use gl_BaseInstance to compute the proper instance index" (https://www.khronos.org/opengl/wiki/Built-in_Variable_(GLSL))

...uniform vec4 myarray[986], or a uniform float myarray[986], they use up the same number of uniforms (986 * 4)

значит можно через "дублирующий буфер" задавать цвет каждые N вершин через glVertexAttribDivisor ? (https://triplepointfive.github.io/ogltutor/tutorials/tutorial33.html)

может ли быть шейдер что рисует вточ как GL_LINES ?

через инстансиг раза в 2 хуже чем через geometry shader (https://nbertoa.wordpress.com/2016/02/02/instancing-vs-geometry-s… ertex-shader/) 2 года назад

#13
1:00, 1 ноя 2018

slax
> ну обычную GL_LINE с glLineWidth(20) и в фрагментном шейдере считать затухания
> краев по расстоянию, но скругление на стыке двух линий будет не там
Deprecated функционал использовать? Ну такое... я бы не рисковал.

> gl_InstanceID доступна только с OpenGL 4.1
А glVertexAttribDivisor доступен с 3.3, а так же через расширения. И почти 100% что он будет доступен.
Оно даже на мобилках почти 100% покрывает: https://webglstats.com/webgl/extension/ANGLE_instanced_arrays

#14
13:39, 1 ноя 2018

как задавать разную толщину для каждой линии рисуя их всех одним вызовом glDrawArrays GL_LINES?

раз уж нельзя разные примитивы одним буфером с одним шейдером рисовать, то хотябы не делать разные буферы для линий разной толщины - бред же
GL_LINES и GL_LINE_STRIP тоже разные примитивы ?
нельзя рисовать линии и стрип линии из одного буфера/шейдера (

Страницы: 1 2 3 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.