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 (pointclouds.org)
2) cgal (смотреть вот (cgal.org))

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

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.

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

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

anonymous_coward
()

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

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