OpenGL - это средство визуализации вперед, которое ограничивает объекты, которые он может растеризовать, точками, линиями и полигонами. Отправной точкой является то, что все трехмерные фигуры построены из этих двухмерных примитивов. OpenGL сам по себе не имеет концепции сплошной, заполненной трехмерной геометрии, и поэтому не имеет встроенной концепции того, как далеко через объект концептуально проходит конкретный фрагмент, сколько раз он входит или выходит.
С тех пор, как стало возможным писать шейдерные программы, стало возможным множество способов решения этой проблемы, наиболее очевидным из которых для вас является литье лучей. Вы можете загрузить куб в виде геометрии, установив для рендеринга задние грани, а не лицевые, и фактический объект в форме вокселя в виде карты 3D-текстуры. В вашем шейдере для каждого пикселя вы начнете в одном месте в 3d текстуре, получите вектор к камере и пройдете повторную выборку вперед с подходящими интервалами.
Более быстрым и простым в отладке решением было бы построить дерево BSP вашего объекта с целью разбить его на выпуклые секции, которые можно нарисовать в обратном порядке. Подготовьте два буфера глубины и один пиксельный буфер. Для ясности, вызовите один буфер глубины задним буфером, а другой - передним буфером.
Вы собираетесь пройтись по выпуклым участкам модели сзади вперед, чередуя рендеринг в буфер глубины на заднем плане без вывода цвета и запись в буфер глубины на переднем плане с выводом цвета. Вы можете обойтись только одним из них в программном рендере, но OpenGL не позволяет читать целевой буфер по различным причинам конвейера.
Для каждого выпуклого сечения сначала визуализируйте обратные полигоны в обратном буфере. Затем визуализируем фронтальные полигоны в передний буфер и буфер цвета. Напишите шейдер так, чтобы каждый выводимый вами пиксель вычислял его непрозрачность как разницу между его глубиной и глубиной, хранящейся в его местоположении в заднем буфере.
Если вы обеспокоены тем, что камера пересекается с вашей моделью, вы также можете рендерить фронтальные полигоны в задний буфер (сразу после рендеринга их в передний буфер и переключения целей было бы наиболее удобно), а затем в конце Нарисуйте полноэкранный многоугольник на передней плоскости, который выводит подходящую альфа, где значение заднего буфера отличается от значения переднего буфера.
Дополнение: если исходные данные представляют собой какие-то воксельные данные, например, от сканера КТ или МРТ, тогда альтернативой литья лучей является загрузка в виде трехмерной текстуры и рисование серии срезов (перпендикулярно плоскости обзора, если возможно, вдоль текущей большой оси в противном случае). Некоторую документацию и демонстрацию можно посмотреть на Зона разработчиков Nvidia .