В даний час я розробляю ігровий движок, який використовує підписані поля відстані як техніку візуалізації для відображення гладкої процедурної геометрії (згенерованої простими примітивами, такими, як у вашому посиланні на даний момент, прагнучи реалізувати фрактали Джулії та IFS у майбутньому). Оскільки мій двигун зосереджений на процедурному генеруванні і повинен визначати фігури таким чином, що робить їх доброзичливими, я вважаю, що я в змозі відповісти на це питання: P.
Що стосується потокової передачі, найпростішим рішенням є використання введеного буфера якогось типу та перекинути його на GPU, коли ви хочете зробити маршируючий промінь. Кожен елемент буфера є складним типом (наприклад, структура в C / C ++), і кожен тип містить елементи, що визначають, яку функцію слід використовувати для її представлення, її позицію, обертання, масштаб тощо та середній колір. Потім процес спрощується до:
- Складіть свою сцену в керовану підмножину (зауважте, що винищення фрустуму та відключення оклюзії частково виконуються автоматично за допомогою алгоритму проходження променів)
- Передайте підмножину у свій вхідний буфер візуалізації
- Передайте буфер до графічного процесора, якщо його там вже немає, тоді візьміть свою сцену звичайним традиційним промінням. Вам потрібно буде здійснити якийсь покроковий пошук, щоб оцінити, який елемент у вхідному буфері найближчий до кожного променя для кожної ітерації променевого маршу, і вам потрібно буде застосувати перетворення або до променів (у такому випадку Вам потрібно буде інвертувати обертання фігури до того, як вони дістануться до GPU) або самі функції відстані (переміщення походження функції для зміни положення, регулювання, наприклад, кубічної довжини сторони для зміни масштабу тощо). Найпростіший підхід - просто змінити промені перед ви передаєте їх до фактичної функції основної відстані.
Що стосується кольорів фігури, пам’ятайте, що шейдери дозволяють визначати складні типи, а також примітиви;). Це дозволяє перекинути все на структуру у стилі С, а потім передати ці структури назад від функції дистанції.
У моєму двигуні кожна структура містить відстань, колір та ідентифікатор, які прив'язують її до відповідного визначення фігури у вхідному буфері. Кожен ідентифікатор виводиться з оточуючого контексту відповідної функції відстані (оскільки моя функція відображення проходить через вхідний буфер, щоб знайти найближчу цифру до кожного променя для кожного кроку, я можу сміливо обробляти значення лічильника циклу, коли викликається кожен SDF як ідентифікатор фігури для цієї функції), тоді як значення відстані визначаються за допомогою довільної основної SDF (наприклад,point - figure.pos
для сфери), а кольори або визначаються із середнього кольору відповідного елемента в буфері фігури (отже, чому корисно зберігати ідентифікатор фігури навколо) або через процедурне забарвлення, зважене до збереженого середнього (один приклад може бути прийнятим підрахунок ітерації для деякої точки на Мандельбулі, відображення вашого "середнього кольору" з кольорового простору FP на цілий кольоровий простір, потім використання відображеного кольору як палітри, XOR'ing його проти кількості ітерацій).
Процедурні текстури - це інший підхід, але я сам ніколи їх не використовував. iq провів досить багато досліджень у цій галузі та розмістив кілька цікавих демонстрацій на Шадертої, так що це може бути одним із способів зібрати додаткову інформацію.
Незалежно від того, чи є ваш колір статичним для кожної фігури, процесуально генерованим або магічним чином відібраний з процедурної текстури, основна логіка є однаковою: абстрактні фігури у якийсь проміжний складний тип (наприклад, структура), зберігайте як локальну відстань, так і локальну кольором в екземплярі цього типу, а потім передайте складний тип у вигляді зворотного значення з функції дистанції. Залежно від вашої реалізації, вихідний колір може потім проходити безпосередньо на екран або слідувати точці зіткнення у вашому освітлювальному коді.
Я не знаю, чи було вище сказане достатньо зрозумілим чи ні, тому не хвилюйтеся питати, чи щось не має сенсу. Я не можу дійсно надати будь-які зразки коду GLSL / пікселів, оскільки я працюю з HLSL та обчислюючої затінення, але я радий спробувати переглянути все, що я не написав належним чином в першу чергу :).