Сферический гармонический шейдер iOS GLSL. Как сделать Raycast с помощью iOS GPU

Я начинаю шейдерный проект Spherical Harmonics для приложения для iOS, которое я пишу. Я начал с чтения этой превосходной углубленной статьи по этому вопросу (PDF) - http://bit.ly/aQmax3.

В документе описывается этап предварительной обработки сцены, который включает в себя приведение лучей. Может кто-нибудь описать, как приведение лучей может быть выполнено с использованием GLSL на iOS?

1 ответ

Решение

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

В моем случае я использую тестирование глубины, чтобы определить области на поверхности, пораженные окружающим светом в различных ориентациях. Я беру свою модель и отображаю ее в последовательности ориентаций, которые соответствуют тому, кто на нее смотрит, из равномерно распределенного набора точек на сфере, окружающей объект. Для каждой точки на поверхности объекта я определяю, является ли эта точка видимой с этой ориентации, проверяя ее преобразованное положение Z по глубине, рассчитанной для видимой поверхности в этой точке.

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

Мои окружающие текстуры окклюзии выглядят примерно так:

Окружающая текстура окклюзии

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

Сопоставленные значения окклюзии окружающей среды

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

Это не распространяется на случай отраженного рассеянного освещения, но, по крайней мере, описывает средства, которыми я использовал затенение окружающего окклюзии. Исходный код этого приложения доступен по ссылке выше, если вы хотите покопаться в нем и посмотреть, как все это работает на практике.

Другие вопросы по тегам