Недавно я прочитал эту статью о raymarching облаках (осторожно, это PDF-файл, если вам это не нужно: http://www.diva-portal.org/smash/get/diva2:1223894/FULLTEXT01.pdf), где автор продолжает оптимизацию (стр. 22 и далее) алгоритм через репроекцию. Он утверждает, что путем raymarching только 1/16 всех пикселей в кадре (выбранный пиксель прыгает по сетке 4x4) и повторного проецирования остальных, он получил увеличение производительности примерно в 10 раз.
Теперь я попытался реализовать это и в Unreal Engine 4 (пользовательский шейдер HLSL), и теперь у меня работает raymarching и репроекция. Однако я застрял на самом деле только в том, чтобы запускать raymarching на необходимых пикселях. Насколько мне известно, при любом ответвлении в HLSL будут вычисляться обе стороны ответвления, а одно будет отбрасываться. Поэтому я не могу сделать что-то вроде этого псевдокода в пиксельном шейдере: if(!PixelReprojection) { return 0;} else { return Raymarch(...); }, так как он будет вычислять Raymarch даже для пикселей, которые перепроецируются.
Я не вижу другого способа архивировать это... Есть ли в HLSL какое-либо ветвление, которое позволяет это сделать? Он не может быть статичным, поскольку пиксели, подвергнутые raymarching и репроецированию, меняются каждый кадр. Насколько мне известно, мне действительно любопытны любые идеи, как автор мог добиться такого десятикратного увеличения производительности, поскольку он пишет код и на графическом процессоре.
Я был бы очень признателен за любой вклад здесь.
С уважением, фудий