Arseny Kapoulkine:
Так, GDC лично у меня закончился, пора подводить итоги.
Сначала создадим тред про PowerVR raytracing.
Была компания Caustic Graphics, которую в 2010 купил Imagination Technologies.
Продуктом совместного союза стала следующая технология.
Есть OpenRL SDK (https://www.caustic.com/HTMLDocs/OpenRL/OpenRL.html) который представляет собой попытку определить интерфейс для рейтрейсинга.
Это API похожее на OpenGL с шейдерным языком похожим на GLSL.
В нем определяются шейдеры и геометрия, и создаются объекты-примитивы, которые ссылаются на шейдеры, геометрию и константы.
Геометрия - это набор треугольников.
После чего запускается трассировка лучей.
Изначально есть некий механизм запуска primary лучей; луч, попавший в примитив, приводит к выполнению ray shader.
Ray shader умеет делать следующее:
- С помощью обычных GLSL операций типа математики и семплинга текстур посчитать что-нибудь и сложить это что-нибудь с исходным пикселем фрейм буфера.
- Запустить еще один или несколько лучей.
Интересный момент - запуск лучей асинхронный в стиле fire and forget - результат этого луча получить нельзя.
Вместо этого когда выпущенный вторичный луч попадает в примитив, запускается ray shader этого примитива.
С лучом можно передавать различные varyings; в ray shader приходят интерполированные атрибуты вершин и то что передал ему предыдущий шейдер.
Соответственно например если вы хотите усреднить результат трех лучей, то надо запустить 3 луча и передать в каждый коэффициент 1/3.
А в ray shader примитива сказать "accumulate(koeff * result);".
Плюс там еще есть всякие мелкие tweaks вида occlusion лучей (вместо того чтобы запускать шейдер примитива в который уткнулся луч, запускается шейдер 'default' примитива если луч никуда не воткнулся)
Это позволяет реализовывать аналитические источники света без реальной геометрии источников.
Ну и значит у пацанов есть CPU реализация.
И хардверный GPU прототип.
GPU прототип это обычный PowerVR (tile-based, etc.) чип мобильного класса.
Который умеет растеризовать, имеет сколько-то compute ядер и так далее.
В который добавлены два fixed function юнита.
Один юнит умеет на вход принимать набор треугольников, и собирать из них BVH.
Детали BVH может быть можно нагуглить, те кто был на стенде не знали.
Второй юнит умеет трейсить луч по этому набору и запускать ray shader.
Сам шейдер запускается на все тех же compute ядрах что и растеризация.
Скорость юнита который собирает BVH я точно не запомнил; скорость юнита который трейсит - 300M лучей в секунду.
Этот юнит умеет группировать coherent лучи вместе и трейсить сразу пачкой, так что в зависимости от когерентности лучей может быть быстрее чем 300M а может быть медленнее.
Power draw от этих двух юнитов незначительный, насколько я понял.
Эта железка пока что есть только в виде прототипа, ждем пока кто-нибудь лицензирует дизайн и напечатает чипов.
Arseny Kapoulkine:
Хайлайты примерно такие:
  • 1. fixed-function функция "пересечь луч с ббоксом" занимает в 44 раза меньше места на чипе поэтому проще добавить кастомный кусочек железа чем наращивать unified массив.
  • 2. как я понял, для того чтобы хранить геометрию, треугольники группируются в блоки и на каждый блок имеется AABB; памяти на это уходит примерно 100 байт на треугольник со всеми вершинными атрибутами (непонятно, сколько их там!..)
  • 3. в качестве структуры ускорения traversal используют octree.
Boris Batkin:
ужасно интересно, насколько быстрее (а оно быстрее, да?) чем какой-нибудь R290X с рейтрейсером на OpenCL.
Arseny Kapoulkine:
ну вот говорят 300М непонятно каких лучей в секунду.
я так понимаю это примерно столько сколько имеет OptiX.
на хорошей железке.
(очевидно это apples & oranges т.к. надо смотреть на то какая сцена и какие лучи, но за что купил за то и продаю)
Boris Batkin:
я плотно думал за raytracer - ну чтобы ray shader и всё такое.
так там и получается очередь на атомиках.
инкремент и коэффициент.
параллелизм на уровне "не дождаться" и всё такое.
т-е если бы на OpenCL писал - примерно то, что у них, и получилось-бы.
только вот в AABB я бы не полез ни разу.
Arseny Kapoulkine:
Ага, у меня такое же ощущение осталось.