OpenGL - 3D-текстурирование - концептуальные вопросы

У меня есть несколько концептуальных вопросов о 3D-текстурах и наложении текстур в OpenGL, которые я пытаюсь понять. Вопросы относятся к реализации кода, особенно для трехмерного текстурирования в этом руководстве: http://www.codeproject.com/Articles/352270/Getting-started-with-Volume-Rendering?fid=1807805&df=90&mpp=25&noise=3&prof=False&sort=Position&view=Normal&spc=Relaxed&select=4729498&fr=1#xx4738025xx

Размеры набора данных, используемого в руководстве, равны 256 x 256 x 109 (109 2D-срезов).

1.

Код предоставляет способ сопоставить 2D-изображения с 3D-текстурой, загружая все 2D-срезы в единый массив данных. Затем он переходит к отображению данных в 3D-текстуру, увеличивая fIndx от -1.0f до +1.0f с шагом 0.003f. Почему шаг приращения составляет 0.003f? Имеется ~ 666,667 приращений, что примерно в 6,11 раз превышает общее количество 2D-срезов (109 срезов).

for ( float fIndx = -1.0f; fIndx <= 1.0f; fIndx+=0.003f )
{
    glBegin(GL_QUADS);
        MAP_3DTEXT( fIndx );
    glEnd();
}

2.

Я пытаюсь понять, как перемещаться по визуализированному объему с помощью 3D-текстур. То, что я пытаюсь сделать, похоже на видео на этом веб-сайте: http://cvlab.epfl.ch/research/medical/em/synapses

Данные на этом веб-сайте обязательно должны быть 2D-изображениями, которые сопоставлены с 2D-текстурами. Итак, просто заставить каждый слой в объеме исчезнуть очевидно легко (но я не знаю, как это сделать!). Мои данные выглядят так: http://ctrlv.in/292069

ИЗМЕНИТЬ

В моем наборе данных 256 фрагментов, и я хочу просмотреть каждый фрагмент один за другим. Как я могу перемещаться по фрагментам один за другим, как на видео?


person Eagle    schedule 06.02.2014    source источник


Ответы (1)


1.

Действительно, почему ... логика цикла с плавающей запятой - зло. 0.003f не может быть представлен с плавающей запятой. Скажем, после 256 итераций счетчик цикла теперь равен ~ = -0,231997 вместо -0,232. Было бы лучше выполнить этот цикл, используя целочисленное управляющее выражение, а затем разделить конечный результат на 1000.0f внутри тела цикла. Я бы не доверил автору этого руководства написать какое-либо финансовое программное обеспечение. Они потеряют ваши деньги, делая такие вещи;)

0,003f на самом деле ~ 0,003000000026077032089233398438 ... (это повторяющееся число с плавающей запятой, потому что оно не может быть выражено как деление на степень двойки). После накопления достаточного количества ошибок округления разницы в значениях может быть достаточно, чтобы нарушить вашу логику подсчета циклов. Настолько, что даже если это число будет увеличиваться с шагом, достаточным для обработки только 190 фрагментов, цикл будет выполняться на 1 раз меньше, и вам будет не хватать фрагмента.

Если у вас было 256 фрагментов и увеличивалось 1 / 256 (что выражается с использованием знаменателя степени двойки) за итерацию, плавающее -точечное управление петлей будет работать. Увы, 3 / 1000 не имеет такого свойства. Это неподходящее значение с плавающей запятой для использования в цикле. Поскольку выяснение того, можно ли точно представить серию чисел с помощью чисел с плавающей запятой, вызывает затруднения, обычно лучше вообще избегать циклов с плавающей запятой.

2.

Если вам нужно 256 уникальных значений в диапазоне [-1,0, 1,0] (пространство координат NDC), вы должны начать с -1,0 и увеличивать ровно на 1 / 128 (0,0078125) на каждой итерации.

person Andon M. Coleman    schedule 07.02.2014
comment
Идеально! Спасибо, что объяснили это! Теперь это имеет смысл. Однако я не хотел бы использовать значения с плавающей запятой в моем цикле, и я бы предпочел использовать только целые числа для достижения наложения текстуры. Кроме того, я думаю, что не ясно выразился во втором вопросе. Я хотел знать, как перемещаться по различным уровням изображений, как показано в видео cvlab. epfl.ch/research/medical/em/synapses - person Eagle; 07.02.2014
comment
Да, теперь я понимаю, что ты имеешь в виду. Если для этого вы рисуете серию четырехугольников, вы можете либо начать с более высокого индекса, либо другой вариант - динамически настроить плоскость отсечения. Поскольку трехмерный объем повернут в видео, на которое вы ссылаетесь, я думаю, что простейшим решением будет простой пропуск нескольких четырехугольников. - person Andon M. Coleman; 07.02.2014
comment
Что ж, я не могу проскакивать четверные. Данные, с которыми я работаю, - это поперечные срезы тканей роговицы. Итак, мне нужно, чтобы каждое изображение исчезло, прежде чем отображать следующее. Я не понимаю, как заставить каждое изображение исчезать после его рендеринга? Я мог бы использовать функцию glScissor, но мне нужно убедиться, что другие текстуры, которые я визуализирую, также не обрезаны. - person Eagle; 07.02.2014
comment
Кроме того, я попытался использовать более высокий индекс, и он не работает с примером кода, представленным на веб-странице учебника по 3D-текстурированию. - person Eagle; 07.02.2014
comment
Каждый четырехугольник представляет собой часть объема, верно? Чтобы изображения исчезли, нужно просто очистить буфер цвета, а затем заново отрисовать квадраты (без среза, который вам больше не интересен). Теперь, чтобы добиться эффекта в этом видео, вы на самом деле не хотите сразу удалять квад - вы должны перемещать его немного назад каждый кадр, пока он не достигнет следующего фрагмента (затем удалите его). Все это предполагает, что координаты вашей текстуры связаны с положением. Кстати, datenwolf в этом разбирается, возможно, ему есть что добавить к обсуждению. - person Andon M. Coleman; 07.02.2014
comment
Также имейте в виду, что нет ничего плохого в том, чтобы рисовать больше четырехугольников для визуализации вашего 3D-изображения, чем количество 2D-изображений поперечного сечения в наборе данных. Если вы используете линейную фильтрацию текстур, это создаст интерполированные изображения для любого из четырехугольников, которые лежат где-то между точными срезами. Это свойство очень полезно для создания иллюзии непрерывного трехмерного объема. - person Andon M. Coleman; 07.02.2014
comment
@Datenwolf Ваши мысли, пожалуйста? - person Eagle; 08.02.2014
comment
Конечно, я постараюсь поработать над вашими предложениями. Я работал над первым, где я визуализирую первый фрагмент, очищаю буфер цвета, а затем визуализирую второй фрагмент, но, похоже, это не работает. Придется попробовать и посмотреть, работает ли здесь двойная буферизация. - person Eagle; 08.02.2014
comment
Я пробовал работать над циклом for с целочисленным управлением, но даже это не удалось. Мой рендеринг находится где-то далеко. Проблема в том, что в сети нет другого кода, который бы достаточно хорошо объяснял 3D-текстурирование. 3D-текстурирование плохо задокументировано: / - person Eagle; 08.02.2014