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

Пример отрендеренной сцены

Первое, что следует понять, это то, как компьютеры даже для начала так быстро рисуют сложные картинки. Это делается с помощью физически обоснованного рендеринга — концепции, разработанной более десяти лет назад и основанной на приближении того, как свет взаимодействует с физическими поверхностями. Он использует 3D-модели (формы), источники света и поверхностные материалы для рисования изображения. Материалы поверхности — это то, на чем мы собираемся сосредоточиться — числовые значения, описывающие цвет, шероховатость и металличность поверхности в заданных точках.

Например, предположим, что мы хотели описать яблоко (как показано выше). Вы можете сказать, что поверхность этого яблока «красная и блестящая». С нашей моделью рендеринга мы бы придали поверхностным материалам высокие значения красного цвета и низкие значения шероховатости («красный» и «блестящий»), но низкие значения синего, зеленого и металлического.

Мультяшный рендеринг яблока

Ранее я сделал устройство (ссылка здесь, некоторое обсуждение здесь и здесь), который получил другое изображение, используемое при рендеринге, карту нормалей, чтобы увидеть, насколько легко получить эти данные из реальной жизни. Получение карты нормалей работало нормально, но в реальной жизни карты нормалей не существует. Из-за этого нам не нужно знать о них для этой статьи. Однако после того, как мы отправили электронное письмо нескольким исследователям, стало очевидным, что получить другие изображения (изображения, которые действительно имеют эквивалентные эффекты в реальной жизни) из фотографий или иным образом невозможно или, по крайней мере, будет очень сложно. Вероятно, это связано с тем, что он не был основан на реальной жизни с самого начала — физический рендеринг просто обеспечивает быструю оценку, основанную на реальных свойствах оптики.

Сводка изображений, используемых в физически обоснованном рендеринге. Для целей этой статьи не принимайте во внимание изображения «НОРМАЛЬНОЕ» и «АО», которые больше связаны с формой объекта, чем с материалом.

Тем не менее, мы все еще можем вывести «правильные» значения. Предположим, кто-то попросил вас угадать десятичное число, о котором он думает, от одного до ста. Если бы вы продолжали гадать, в конце концов вы подошли бы довольно близко. То, как это применимо к компьютерной графике, следует логически. Из всех возможностей рендеринга значений, которые мы рассмотрим чуть позже, предположительно один из этих рендеров «ближе» к реальной фотографии, чем все остальные. Поскольку эти вещи, которые считаются качественными — цвет, шероховатость и металличность — на самом деле являются числами в случае рендеринга, это может сработать.

Те из вас, кто знаком с рендерингом, могут сразу же отказаться от этой идеи, и на то есть веская причина — в рендеринге участвует множество переменных, таких как 3D-формы, освещение, различные карты материалов и так далее. Что сделало бы эту идею практичной, так это если бы многие из этих переменных были исключены или «оставлены постоянными». Например, чтобы больше не беспокоиться о форме, отсканируйте 3D-модель реального объекта. Чтобы не беспокоиться об освещении или размещении, воссоздайте сцену в 3D и управляйте освещением и расстоянием, используя, скажем, один точечный источник света. По сути, мы воспроизвели бы все в контролируемой сцене из реальной жизни в контролируемой трехмерной сцене, которую мы создали бы, кроме материалов поверхности (или цветов) — наших значений рендеринга.

Предыдущая реализация этой идеи, в которой такие переменные, как расстояние и фон, остаются постоянными между рендерингом и фотографией.

Допустим, мы подошли к этому моменту — и это, безусловно, можно сделать, как это делалось раньше — что тогда? Насколько сложно было бы вычислить максимально реалистичные значения рендеринга? Сколько возможных рендеров можно вычислить?

Чтобы найти необходимое количество рендеров, мы можем представить задачу с точки зрения одного пикселя. Мы можем сделать это, потому что мы можем предположить, что вывод одного пикселя не зависит от вывода другого в нашем контролируемом 3D-рендеринге (в отличие от изображения выше), что может быть легче сказать, чем сделать. Однако после этого мы можем применить наши изменения единообразно. Например, чтобы проверить, является ли где-то правильным определенный оттенок синего, измените всю поверхность объекта на эти значения и сравните его с эквивалентом в реальной жизни. Поскольку никакие другие выходы пикселей не зависят от других, если мы сделаем это для всех входов, мы исчерпаем все возможности. Итак, мы можем думать о проблеме с точки зрения одного пикселя из-за этого — сколько возможных входных данных есть для одного пикселя?

Цветовой диапазон RGB, каждый цвет, который может отображать ваш экран

Давайте немного подумаем об этом. Во-первых, это цвет. Эти значения составляют три из пяти наших значений рендеринга, числа от нуля до 255 для красного, зеленого и синего (значение синего, равное нулю, вовсе не является синим, а значение синего цвета, равное 255, соответствует максимальному синему цвету). может быть — и то же самое относится к нашим красным и зеленым значениям). Там 256^3 возможностей — или около 16 с половиной миллионов. Этот диапазон возможностей представлен выше в цветовом пространстве RGB. Позже мы посмотрим, сколько времени это может занять для вычисления, а сейчас нам нужна грубая оценка количества возможностей.

Увеличение стоимости металла — различные аспекты изменения отражения

Увеличение значения шероховатости — свет рассеивается больше

Как рассчитывался диапазон возможностей для этого типа рендеринга

Далее в нашей модели затенения есть два других значения рендеринга — металличность и шероховатость. Металличность определяет, насколько металлическим является что-либо в данной точке, поскольку металлические объекты, в частности, по-разному ведут себя со светом. Шероховатость определяет, как свет распределяется в данной точке — действительно ли объект блестит или действительно тусклый? Больше похоже на яблоко или наждачную бумагу? Эти два параметра, металличность и шероховатость, также определяются числами от 0 до 255 на пиксель. Это увеличивает наше общее количество возможностей с 256 ^ 3 до 256 ^ 5, или примерно 1,1 триллиона возможностей рендеринга, как показано на рисунке выше. Это очень большое число, но есть способы обойти это вычисление или, по крайней мере, вычислить его за разумное время, как я объясню позже.

Геометрическое представление формулы расстояния

Диаграмма того, как применяется формула расстояния

А пока давайте посмотрим на функцию, которая определяет, насколько данный рендер близок к реальной фотографии. Если вы изучали математику в средней школе, скажем, геометрию или исчисление, вы, возможно, уже знакомы с этим — это называется формулой расстояния. Имея две точки в трехмерном пространстве, мы можем определить их расстояние друг от друга. Вы можете сказать: «Но это же расстояние между 3D-точками, мы говорим о рендере и фотографии!», и будете правы. Однако каждая точка или пиксель на рендере и на фотографии соответствует цвету — одному из 16,7 миллионов значений, как мы упоминали ранее, — а те действительно соответствуют трехмерной точке, в том, что известно. как диапазон sRGB или 3D-пространство. Вместо (x, y, z) точки (R, G, B). Таким образом, для измерения разницы в цвете или расстояния между этими точками абсолютно применима формула расстояния. Чем ниже это число, тем более «реальным» мы можем считать рендеринг в данной точке. Другими словами, мы хотим минимизировать это число во всех точках. Это должно удовлетворить беспокойство по поводу измерения того, насколько «реальным» является рендеринг, как сказал один из создателей «физически обоснованного рендеринга», когда я отправил им электронное письмо о своем предыдущем проекте.

Таким образом, на высоком уровне программа, которую нужно было бы создать для создания правильных рендеров и создания максимально близких «поверхностных материалов», была бы тривиальной. Начните с модели, источника света и соответствующего реального изображения объекта. Сделайте рендеринг с одним из 1,1 триллиона возможных значений рендеринга на поверхности объекта, равномерно. Для каждого из этих рендеров сравните выходные значения цвета со значениями цвета фотографии и измените значения материала, если цвета ближе к значениям фотографии, чем в предыдущих рендерах. Повторите для всех возможных значений рендеринга.

Логотип OpenGL, популярной графической библиотеки.

Однако на низком уровне есть ряд препятствий. У меня, например, недостаточно знаний о доступных графических библиотеках (таких как OpenGL и Vulkan), чтобы реализовать это. Вы только посмотрите, сколько информации нужно, чтобы нарисовать треугольник! Если кто-то регулярно работает с графикой и заинтересован в том, чтобы помочь в рабочей демонстрации этого, я призываю вас связаться со мной (мой адрес электронной почты указан внизу этой статьи). В противном случае любой может попробовать это сам.

Наш тестовый рендеринг с одним объектом и несколькими точечными источниками света, который равномерно изменяет входные данные рендеринга в каждом кадре (каждом рендере).

Наша кажущаяся скорость рендеринга (количество рендеров в секунду), которая дает нам некоторое представление о том, сколько времени это займет.

Во-вторых, существует проблема огромного количества рендеров, которые необходимо вычислить. После этих вычислений материалы доступны для использования в режиме реального времени, но до этого требуется большая вычислительная мощность. Чтобы приблизительно оценить, сколько времени может потребоваться для создания 1,1 триллиона рендеров, я провел небольшой эксперимент на своей машине. Я загрузил простую модель с изменяющимися материалами PBR (физический рендеринг) и одним точечным источником света и оставил ее в простом рендерере (на фото выше. Raylib, изображенная библиотека, доступна здесь: (https://www. raylib.com/)). Он делал около 3000 кадров или рендеров в секунду, если считать, что счетчик точен. Это много, но имейте в виду, что большая часть логики, необходимой для одновременного сравнения рендера и фотографии, еще не реализована, поэтому реальная скорость рендера может быть намного медленнее. Тем не менее, при таком уровне 3000 все равно потребуется много времени, если цель состоит в том, чтобы сделать 1,1 триллиона рендеров — около 11 лет. Решения этой проблемы включают в себя использование какой-либо серверной фермы, более быстрого графического процессора (в этой системе использовался AMD Vega 64) или меньшее количество рендеров для начала. Последний вариант кажется наиболее разумным — вместо вычисления 256^5 возможностей 64^5 заняло бы гораздо меньше времени и при этом было бы точным с точностью до плюс-минус двух единиц каждого значения рендеринга. 64 ^ 5, или 1,07 миллиарда рендеров, потребовалось бы около четырех дней, чтобы сделать на той же машине. По крайней мере, этого было бы достаточно, чтобы доказать концепцию.

Визуальное представление принципа ячейки — обратите внимание, что в первой ячейке два голубя.

Последнее препятствие вполне логично — предположим, у вас есть десять вещей и девять коробок, в которые их нужно поместить. Само собой разумеется, что по крайней мере в одной из коробок будет как минимум две вещи. Это известно как принцип классификации. Следуя той же логике, поскольку существует гораздо больше возможных входных данных, чем выходных (256⁵ входных значений рендеринга против 256³ выходных значений цвета), несколько наборов входных значений могут дать один и тот же выходной результат. Это означает, что мы получили не самые точные значения рендеринга, а одно из точных значений для этого угла освещения. Поскольку выходные данные одних и тех же входных значений меняются в зависимости от угла освещения — в этом и состоит цель физически обоснованного рендеринга, и его лучше всего можно представить, например, с металлическими объектами — имеет смысл повторить процесс как есть, но с другим углом освещения. Таким образом, можно сделать вывод, какие значения верны не только для одного угла освещения, но и для двух. Это могло бы избежать ранее упомянутой проблемы. Еще неизвестно, будет ли это иметь какой-либо эффект или потребуется еще больше условий освещения.

Наконец, я хотел бы сказать, что это упрощенная версия того, что нужно для эксперимента в реальной жизни. Детали, которые я пропустил, включают объективно-телецентрический объектив камеры, сопоставление местоположений на рендере с местоположениями на УФ-карте и использование материал типа black-3.0. Тем не менее, я уловил общую мысль. Конечным результатом будут максимально реалистичные значения рендеринга, возможные с учетом наших моделей затенения в реальном времени, которые либо дадут нам потрясающий рендеринг в реальном времени, либо подскажут нам, как можно улучшить модель затенения. В любом случае, это беспроигрышный вариант.

Если вы считаете эту идею интересной, или у вас есть глубокие познания в области графики, которые сделали бы это возможным, или вы видели эксперименты, которые хотя бы отдаленно похожи, со мной можно связаться по адресу mriadzaky [at] fordham [dot] edu.