Я делал самозванки с цилиндрической трассировкой, как он описывает в OpenGL ES 2.0. Это немного сложнее, чем с настольным OpenGL, но это возможно.
Для этого я подал четыре вершины для каждого цилиндра (в начальной точке центральной линии для цилиндра), а также вектор направления от начала до конца для цилиндра. В вершинном шейдере я сместил четыре вершины в пространстве экрана, чтобы покрыть область, в которой будет находиться трассированный лучом цилиндр. В фрагментном шейдере я рисую трассированное лучом представление этого цилиндра.
Эта схема демонстрирует общий процесс:
Что немного усложняет OpenGL ES 2.0, так это то, что у нас нет возможности записывать в gl_FragDepth
, чтобы справиться с перекрытием двух сплошных цилиндров. Я закончил тем, что сделал предварительный проход, где я рендерил глубину каждого фрагмента цилиндра на внеэкранную текстуру, затем использовал эту текстуру глубины на этапе трассировки лучей, чтобы отбросить невидимые фрагменты.
Чуть более подробное описание этого процесса можно найти здесь , а исходный код моего приложения, использующего это, можно загрузить с здесь . Я предупреждаю вас, что математика глубины и трассировки лучей не подходит для моих цилиндров в этом приложении, и я все еще работаю над ее исправлением.