All streams
Search
Write a publication
Pull to refresh
80
0
Alexandra @trisch

Software engineer

Send message
:))) ну ничего, зато хоть интересно
так у меня есть положение луча. у меня есть vec3 rayPosition, которое я и нахожу в цикле. у меня есть смещения (задаются извне), и я просто вызываю функцию, которая по заданным смещениям берет из текстуры соседние от rayPosition точки
объясню :)
изначально планировалась другая статья, и она висит пока в черновиках — а именно о улучшении качества рендеринга изоповерхности и одновременно улучшении производительности. Когда я начала ее писать — я столкнулась с тем моментом, что не знаю на каком уровне объяснять — то ли как совсем для новичка, то ли как для тех, кто знает что по чем, и просто стоит алгоритм рассказать… в результате решила разделить это на две статьи, первая вводная, а вторая уже об оптимизации. чтобы было понятно хотя бы более менее и тем, кто не в теме.
сам шейдер здесь особо и не нужен, я просто его упростила для текущей статьи

я в свое время, 2 года назад когда занималась именно конкретно этой темой, столкнулась с небольшими проблемами именно в рендеринге изоповерхностей. когда разобралась — все оказалось легким. но я тогда подумала — а может кто-то еще с этим столкнется. вот и решила написать. но руки только сейчас дошли :)
да, по соседним точкам строится градиент, считается наклон, нормализуется и рассчитывается освещение.
соседние точки находятся как текущее положение луча+-смещение, которое передается извне и равно соответственно (1/x,1/y,1/z). если интересует могу подробней описать ))
я и не сомневаюсь в вашем профессионализме :)
но как я уже написала — здесь не рассматривается шейдинг, который несомненно использовался для получения данных картинок, иначе это был бы просто контур, заполненный однородным цветом — как на картинке, что я вставила выше

#ifdef SHADER
// do shading < — вот сюда вставить функцию, которая будет реализовывать этот алгоритм
#endif

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

с прозрачностью может и понятней, учитывая вашу фразу о пороговом фильтре, но все же не совсем верно

наверно стоило начинать все же с подробной статьи именно о ray casting в визуализации медицинских изображений :)
это не относится к данной теме. для этого нужно просто раcсмотреть любой алгоритм Shading, я например знаю и здесь использовала Phong shading, который можно использовать для рендеринга любых поверхностей, не только изо.
Если народ интересуется — я могу написать попозже статью и об этом алгоритме
первые картинки и не будут соответствовать, потому что были сделаны с уже кучей всего добавленного, там и не написано про это — это был просто пример изоповерхностей. но например вторые картинки (на черном фоне) — это именно те, которые сделаны с применением данного алгоритма. и суть данной статьи была не в шейдинге, а именно в отрисовке изоповерхности. шейдинг сам по себе достаточно сложная тема, которую нужно освещать отдельно и подробно.

да, здесь алгоритм упрощен, так как например в реальном алгоритме куча директив, которые выбирают — какой режим рендеринга использовать, дополнительные параметры — preintegration, alpha correlation и т.д. но для данной темы все это было ни к чему
вас интересует наклон поверхности в плане шейдинга (shading)?
потому что если брать сам алгоритм отрисовки изоповерхности, который тут рассматривается — то здесь нам нужен вектор направления луча. у нас есть положение камеры — gl_ModelViewMatrixInverse и текущее положение луча, которое мы берем из пиксельного шейдера. на основании этого мы и вычисляем вектор направления, по которому движемся
вы могли бы заметить, что я его вообще никак не называю на русском :)
опять таки.
в коде шейдера есть директива SHADER. именно она дает там затемнения и вообще реалистичность отображения объекта. подробнее об этом можно почитать тут — Shading, хотя вы скорей всего знаете этот алгоритм.

так вот, данная тема не относится к самой сути рендеринга изоповерхностей. это так сказать, общий алгоритма для «отрисовки» теней. Поэтому если shading не использоваться — у нас да, получится равномерно закрашенный силуэт. Я завтра, когда буду на работе, могу вставить пример картинки, пока же например можно посмотреть на изображение с той же ссылки на википедию, получится что-то типа такого

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

в данном контексте говорилось только про один «тег» этого формата — непосредственно данные. ими мы и оперируем
назвать его в переводе можно как угодно. и палитрой в том числе.
на самом деле в этой области данный алгоритм, рейкастинг, является самым обычным и используемым.
плотность при этом не трактуется как прозрачность, есть просто определенное значение плотности, которое мы ищем для того чтобы построить изоповерхность.
на самом деле не важно, одно оно или на каждый слайс свой файл, или в файле по несколько слайсов. софту без разницы :) обработка от этого не зависит.
но суть медицинских изображений в этом, в том что есть некоторый набор двумерных слайсов. это идет от сути получения этих изображений. я ниже в комментарии чуть подробней описала
это массив точек. изображения в медицинской технике это по сути набор 2д слайсов X*Y, количеством Z. это обусловлено тем как именно получаются изображения, например ст-сканер делает двумерный снимок при определенных координатах (расположении в пространстве), после этого положение меняется и делается след снимок. а софт уже может этот набор снимков, который либо разделен по файлам (каждый слайс в отдельный файл), либо сразу объединённый в один файл, визуализирует его.
откуда такая информация?
уведомления не работают. а инвайты вроде должны работать )

Information

Rating
Does not participate
Location
Bayern, Германия
Date of birth
Registered
Activity