Video Game Graphics
00:00:00Треугольники, текстуры и графические процессоры создают миры реального времени Детализированные миры построены из миллионов вершин, собранных в треугольные сетки, текстурированных и подсвеченных, и все это вычисляется в виде потоков единиц и нулей. Графика в реальном времени основана на трехэтапном конвейере: затенение вершин, растеризация и затенение фрагментов, который используется в играх на протяжении десятилетий. Графические процессоры с тысячами специализированных ядер выполняют до 35 триллионов 32-разрядных операций умножения и сложения каждую секунду, преобразуя и заштриховывая миллионы треугольников за несколько миллисекунд. Одна сцена может содержать около 2,1 миллиона вершин, образующих 3,5 миллиона треугольников с 976 цветами и текстурами, освещенных виртуальным солнцем.
Затенение вершин преобразует 3D-модели в экранное пространство Вершины каждого объекта преобразуются из пространства модели в пространство мира, затем в пространство камеры и, наконец, проецируются на экран 2D-просмотра. Матричное умножение объединяет координаты вершин, положение объекта, масштаб, поворот, а также положение камеры и поле зрения, чтобы получить на экране X и Y, а также глубину Z для обеспечения видимости. Это выполняется для каждой вершины, для сотен тысяч моделей и миллионов изображений по всей сцене, распределенных по ядрам графического процессора для поддержания высокой частоты кадров. На практике поле зрения камеры также ограничивает набор моделей, которые необходимо обработать, сокращая нагрузку только до того, что видно.
Растеризация, тестирование глубины и сглаживание Используя вершины каждого треугольника на экране, графический процессор определяет, какие пиксели он покрывает, и превращает их во фрагменты, окрашенные текстурами или материалами треугольника, заполняя буфер кадров в формате 4K объемом около 8,3 миллионов пикселей. Буфер глубины хранит значения Z для каждого пикселя, поэтому только фрагменты, расположенные ближе к камере, перезаписывают цвет, а Z интерполируется по треугольникам для корректной визуализации пересечений. Функция сглаживания с использованием суперсэмплирования использует несколько отсчетов в пределах пикселя, чтобы сгладить края и уменьшить неровности, и весь этот процесс повторяется каждые 8,3 миллисекунды со скоростью 120 кадров в секунду.
Затенение фрагментов с учетом освещения, материала и вида Реализм возникает, когда каждый фрагмент учитывает освещение, зрителя и материал, освещая поверхности, обращенные к свету, и затемняя те, которые отвернуты. При затенении используется косинус угла между направлением света и нормалью к поверхности, масштабируемый в зависимости от интенсивности света и цвета материала, затем уменьшаемый до минимума и смещаемый в зависимости от окружающего освещения, чтобы избежать получения абсолютно черного цвета. Зеркальные блики добавляют блеска, время суток изменяет общую яркость, а вклад нескольких источников света суммируется, хотя каждый добавленный источник света увеличивает стоимость графического процессора.
Плавное затенение, трассировка лучей и DLSS Плоское затенение присваивает одну нормаль каждому треугольнику и выглядит граненым на изогнутых формах, поэтому нормали к вершинам усредняются по соседним, а барицентрическая интерполяция смешивает их на пиксель для создания плавных градиентов. Некоторые игры дополняют растеризованные изображения трассировкой лучей для вычисления теней, отражений и улучшения освещения, сохраняя при этом растеризацию для обеспечения наилучшей видимости. Затем DLSS увеличивает масштаб кадра с низким разрешением до 4K с помощью сверточной нейронной сети. Современные графические процессоры запускают их вместе на отдельных аппаратных блоках, с ядрами затенения или CUDA для конвейера, ядрами трассировки лучей для rays и тензорными ядрами для DLSS, обеспечивая 4K-кадры продолжительностью менее 10 миллисекунд, что на затенение ядер потребовалось бы около 50 миллисекунд.