OpenGL полупрозрачное твердое вещество без преломления? - PullRequest
0 голосов
/ 05 сентября 2011

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

Возможно, мне чего-то не хватает, но я не могу найти хороших источников, которые обсуждают простые непрозрачные твердые тела (solid = набивочная геометрия) в отличие от полностью непрозрачных сеток (полый объект с непрозрачными поверхностями) или полой геометрии с прозрачным поверхностей.

1 Ответ

1 голос
/ 05 сентября 2011

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

С тех пор, как стало возможным писать шейдерные программы, стало возможным множество способов решения этой проблемы, наиболее очевидным из которых для вас является литье лучей. Вы можете загрузить куб в виде геометрии, установив для рендеринга задние грани, а не лицевые, и фактический объект в форме вокселя в виде карты 3D-текстуры. В вашем шейдере для каждого пикселя вы начнете в одном месте в 3d текстуре, получите вектор к камере и пройдете повторную выборку вперед с подходящими интервалами.

Более быстрым и простым в отладке решением было бы построить дерево BSP вашего объекта с целью разбить его на выпуклые секции, которые можно нарисовать в обратном порядке. Подготовьте два буфера глубины и один пиксельный буфер. Для ясности, вызовите один буфер глубины задним буфером, а другой - передним буфером.

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

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

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

Дополнение: если исходные данные представляют собой какие-то воксельные данные, например, от сканера КТ или МРТ, тогда альтернативой литья лучей является загрузка в виде трехмерной текстуры и рисование серии срезов (перпендикулярно плоскости обзора, если возможно, вдоль текущей большой оси в противном случае). Некоторую документацию и демонстрацию можно посмотреть на Зона разработчиков Nvidia .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...