LINUX.ORG.RU

быстро нарисовать много шариков - есть ли где нить такой базовый примитив?

 


1

3

Сабж. Много это 10^4÷10^6, шарики непрозрачные но могут быть двухцветные, с нетривиальным алгоритмом выбора цвета каждой точки.

У меня щас есть некий велосипед на основе самопального z-буфера, который крутиться на CPU. Хочется сделать это по человечески на каком нить openGL, но мне категорически не нравится то что там нет примитива сферы, а шарики приходится набирать из треугольничков. Что бы шарики были красивышные придется на каждый задавать много треугольников, и хотя это делается автоматом но вызывает у меня когнитивный диссонанс.

В принципе ведь рисование примитива сфера ничем особо от рисования треугольника не отличается - ну алгоритм чуть другой... Мб где нить таки есть сфера в виде базового, НЕ СОСТАВНОГО примитива?

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

★★★★★

Последнее исправление: AIv (всего исправлений: 1)

это базовый примитив GPU, там нету никаких сфер. можно перенести твой софтовый рендер на fragment shader.

waker ★★★★★
()

алгоритм чуть другой

Фигасе, другой: вместо одного треугольника нарисовать дохренища.

Сфера — это не примитив. Примитив — это точка, прямая и треугольник. Все остальные поверхности составляются из треугольников. И, кстати, не так уж и шустро это получается: я в вебгл делал наброски для визуализации термодатчиков, так уже порядка двух десятков шариков заметно притормаживали (если быстро туда-сюда дергать). А столько...

Eddy_Em ☆☆☆☆☆
()

Кстати, автоматом по z-буферу подбирай количество треугольников для триангуляции сферы, и будет тебе щассье.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

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

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

AIv ★★★★★
() автор топика
Ответ на: комментарий от AIv

Ты можешь запилить шейдер, рисующий сферу. Кстати, куда позволяет и считать на GPU, и сразу же это в VBO откидывать.

идеологически сфера от треугольника не сильно отличается

А ничего, что сфера круглая и объемная? Во-первых, поди-ка нарисуй края; во-вторых, поди-ка рассчитай отражения.

Кстати, в чертовом вебгле я через шейдеры и делал, потому как эта порнография нормальные gl... не умеет! А сегодня мне открыли тайну, что opengl вообще в задницу скатился: там теперь без шейдеров никуда, т.е. по сути, они откинули пользователей обратно в века ассемблера.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от waker

Вряд ли можно перенсти. У меня цикл по шарикам, потом каждый шарик проецируется на окно и уже по точкам работает z-буфер.

А тут как быть? Если крутится от точки окна (луча), то процесс поиска сближайшего шарика это аццки долго...

AIv ★★★★★
() автор топика
Ответ на: комментарий от Eddy_Em

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

AIv ★★★★★
() автор топика
Ответ на: t от fmdw

Спасибо, посмотрю.

AIv ★★★★★
() автор топика
Ответ на: комментарий от AIv

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

waker ★★★★★
()
Ответ на: комментарий от waker

Алгоритм я описал. Можно наверное, если рисовать кубик вокруг шарика (см топик).

AIv ★★★★★
() автор топика
Ответ на: комментарий от AIv

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

waker ★★★★★
()
Ответ на: комментарий от waker

Емнип шейдер вызывается для точки какого то примитива. Какой примитив Вы предлагаете юзать?

AIv ★★★★★
() автор топика
Ответ на: комментарий от AIv

Какой примитив Вы предлагаете юзать?

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

fmdw
()
Ответ на: комментарий от fmdw

Воот... и я том же. При такой трассировке поиск верхнего пересечения луча с шаром это процесс крайне медленный.

AIv ★★★★★
() автор топика
Ответ на: комментарий от AIv

вот такой: ◪

2 треугольника, в виде прямоугольника на весь экран. и на все это дело шойдер с твоим рендером. или каждую сферу рисуй таким ◪, и текстурь шойдером по отдельности.

waker ★★★★★
()
Ответ на: комментарий от waker

Я ваш дом труба шатал рейтрейсер на шейдере пилить! Помнится, убил неделю! А получилась какая-то дикая гадость, вообще с GLUT и рядом не стоящая!

Eddy_Em ☆☆☆☆☆
()

И вообще, вспоминается мне кудовская демка, где был огроменный бассейн с мегадохренища шариками, и ты как бы пальцем туда тыкал, а шарики туда-сюда мотылялись.

Если оно еще работает (т.к. опенгль-то сломали), то почему бы и нет?

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от waker

Вот только говорят, что замочили глут. И остались одни лишь шейдеры. Ужос-ужос.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от waker

Выч.сложность оцените.

У того что Вы предлагаете, если окно 1000х1000 и 10^6 сфер это будет условно 10^12 операций.

У того что у меня сейчас на ЦПУ (если идти от сфер) и площадь сферы 100 точек, это условно 10^8 операций. Видяхи щас конечно огого, но не на 4ре порядка быстрей проца:-)

По ссылке в гугле я вижу один шар. А у меня их 10^6.

AIv ★★★★★
() автор топика
Ответ на: комментарий от AIv

По ссылке в гугле я вижу один шар. А у меня их 10^6.

щито??? http://i.imgur.com/ecLt4iL.png

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

waker ★★★★★
()
Последнее исправление: waker (всего исправлений: 2)
Ответ на: комментарий от fmdw

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

AIv ★★★★★
() автор топика
Ответ на: комментарий от Eddy_Em

А как ты хотел? Летит луч, надо проверить попал-не попал...

AIv ★★★★★
() автор топика
Ответ на: комментарий от AIv

BVH не зависит от угла зрения. Вот если все шарики двигаются, его придётся перестраивать. Тут сложность алгоритмов уже будет на порядок выше.

Но если шарики находятся в узлах регулярной решётки, никаких деревьев не нужно, см. пример waker.

fmdw
()
Ответ на: комментарий от waker

Ну я оценку сделал. Без bvh сложность такого шейдера на 4ре порядка выше чем у алгоритма на цпу.

С bvh... я хз наск они хорошо ложаться на gpu. Можно наверное сделать... но проще плясать от кубиков:-)

С z-буфером алгоритмичская сложность всегда будет ниже если идти от примитивов.

AIv ★★★★★
() автор топика

а точно шарики нужны? может быть по границам каждого облака точек построить поверхность?

shty ★★★★★
()
Ответ на: комментарий от fmdw

Bvh то не зависит, но его реализация больно муторная. Если брать что то с простой реализацией, то оно уже будет зависеть.

AIv ★★★★★
() автор топика
Ответ на: комментарий от shty

Увы и ах... шарики:-(

Это вьювер для молдинамики и он же для магнитных моментов атомов в магнетике.

AIv ★★★★★
() автор топика
Ответ на: комментарий от fmdw

Тут сложность алгоритмов уже будет на порядок выше.

BTW, существует poor man's способ разбиения пространства под названием cell-lists. Он довольно неплохо ложится на GPU. Я, правда, не в курсе, применим ли он вообще к ray-marching. От него недалеко и до Hilbert R-trees.

fmdw
()
Ответ на: комментарий от AIv

Это вьювер для молдинамики

Я знал! См. мой первый комментарий в теме. На самом деле готовых сейчас уже больше, чем плееров на пайтоне.

fmdw
()
Ответ на: комментарий от AIv

а, понятно )

ну для работы с кучами точек (не шариками, правда) я знаю про:
1) pcl
2) cgal (смотреть вот)

все с открытым кодом, может чем полезно будет

shty ★★★★★
()
Последнее исправление: shty (всего исправлений: 1)
Ответ на: комментарий от fmdw

В МД по русски это называется слой Верле;-) Гильбертовая кривая уже так... тяжеловато ИМНО для этой задачи.

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

AIv ★★★★★
() автор топика
Ответ на: комментарий от fmdw

Гы... в первом комменте на вход данные в ХМЛ. Это ужоснах и закопать сразу.

КРоме того, у нас специфические требования - скажем станжартные вьюверы магнитный момент не рисуют. А у нас вот че например http://a-iv.ru/trash/spins.png

AIv ★★★★★
() автор топика
Ответ на: комментарий от AIv

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

billboard

fmdw
()
Ответ на: комментарий от shty

Забавно, српасибо. Не сюда вроде, но надо будету них че нить спереть;-)

AIv ★★★★★
() автор топика
Ответ на: комментарий от fmdw

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

Т.е. можно ограничится квадратиком для каждой сферы? Но это же перегружать данные придется для каждого нового угла зрения.

AIv ★★★★★
() автор топика
Ответ на: комментарий от AIv

И что можно понять из этого рисунка? Шарики, много шариков. Разноцветные. Может лучше пытаться выделить какую-то структуру более высокого порядка, например доменные стенки, и рисовать уже их?

Не вижу смысла рисовать атомы более чем для одной элементарной ячейки, если честно.

fmdw
()
Ответ на: комментарий от AIv

Но это же перегружать данные придется для каждого нового угла зрения.

Не придётся. Координаты бильборда считаются в вершинном шейдере.

fmdw
()
Ответ на: комментарий от fmdw

Ну это не самый удачный рисунок наверное. Есть и покрупнее

http://a-iv.ru/trash/CPP-free-layer.png

В принципе, как раз и хочется добавить во вьювер зум, плоскости отсечения и пр. свистелки.

Доменный границы ловить нетриваильно, особенно когда их нет, а есть аморфная каша с ближним порядком.

AIv ★★★★★
() автор топика
Ответ на: комментарий от fmdw

О! Спасибо, вот это мысль.

AIv ★★★★★
() автор топика
Ответ на: комментарий от AIv

Доменный границы ловить нетриваильно, особенно когда их нет, а есть аморфная каша с ближним порядком.

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

fmdw
()
Ответ на: комментарий от fmdw

Для ближнего порядка интереснее смотреть на двухчастичный коррелятор какой-нибудь.

Мы как раз работаем над этим;-)

Невооружённым взглядом там вряд ли что-то можно разглядеть, кроме каши.

Уже сам факт что там не полная каша интересен (и виден). Ну и потом там спиновые волны всякие, те же доменные границы (и их тип) и пр. - на такой диагностике хорошо видны. Я к сожалению лучше не знаю, всякие n/мюМАГовские вьюверы стрелочками ИМНО менее наглядны.

Были попытки показывать вектор цветом точки (как раз три компоненты RGB), но там без бутылки вообще не разберешься. Хотя переходы тоже видны.

AIv ★★★★★
() автор топика
Ответ на: комментарий от AIv

С bvh... я хз наск они хорошо ложаться на gpu.

При должном изгибе сознания ложатся :)

Вот статья про так их строить, там и бенчмарки есть. Ещё можно глянуть серию постов Thinking parallel, вот первая часть, вторая и третья. Она как раз про то, как надо изогнут сознание при программировании на GPU.

anonymous_coward
()

И ещё, при программировании на GPU не стоит оценивать сложность только в количестве операций. Тут закавыка в том, что вычисления на карте высокопараллельны (причём высоко может подразумевать не десяток одновременно выполняющихся потоков, а тысячи).

anonymous_coward
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.