Инструменты пользователя

Инструменты сайта


3d_graphics

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
3d_graphics [2026/10/15 15:25] – gecko3d_graphics [2026/10/15 20:39] (текущий) – gecko
Строка 1: Строка 1:
 ====== 3D-графика ====== ====== 3D-графика ======
  
-Процесс рендеринга 3D-треугольника выглядит следующим образом:+Типичный процесс рендеринга 3D-треугольника выглядит следующим образом:
  
   * Координаты вершин загружаются в регистры [[GTE]] VXY0, VZ0, VXY1, VZ1, VXY2, VZ2;   * Координаты вершин загружаются в регистры [[GTE]] VXY0, VZ0, VXY1, VZ1, VXY2, VZ2;
   * Загружается матрица поворота 3x3, вектор смещения и параметры проекции;   * Загружается матрица поворота 3x3, вектор смещения и параметры проекции;
-  * Выполняется инструкция GTE RTPT;+  * Выполняется инструкция GTE [[RTPT]];
   * Результат - три вершины в экранном пространстве - считывается обратно в регистры CPU;   * Результат - три вершины в экранном пространстве - считывается обратно в регистры CPU;
   * При необходимости вершины отсекаются в зависимости от направления (winding), чтобы не рисовать треугольники, повернутые в сторону от камеры;   * При необходимости вершины отсекаются в зависимости от направления (winding), чтобы не рисовать треугольники, повернутые в сторону от камеры;
Строка 14: Строка 14:
   * При рендеринге индексированных мешей не трансформируйте вершины по несколько раз. Создайте буфер для кэширования вершин в экранном пространстве. В первом цикле трансформируйте все вершины по три штуки, вне зависимости от индексов (для GTE индексы не имеют значения), во втором - рисуйте треугольники по индексам.   * При рендеринге индексированных мешей не трансформируйте вершины по несколько раз. Создайте буфер для кэширования вершин в экранном пространстве. В первом цикле трансформируйте все вершины по три штуки, вне зависимости от индексов (для GTE индексы не имеют значения), во втором - рисуйте треугольники по индексам.
   * Используйте буфер команд и DMA, это гораздо быстрее, чем отправлять команды рисования по одной.   * Используйте буфер команд и DMA, это гораздо быстрее, чем отправлять команды рисования по одной.
 +
 +===== Ordering Table =====
 +
 +Ordering Table (OT) - это специальный контейнер, который позволяет рендерить 3D-примитивы в порядке приближения к камере. В современных видеокартах это достигается путем использования Z-буфера - сравнения координаты Z пикселя с уже существующим значением в специальной области видеопамяти. [[GPU]] PlayStation работает только с 2D-примитивами, он ничего не знает о координате Z и не имеет аппаратной Z-буферизации - задача по сортировке примитивов ложится на программиста. Такая сортировка должна быть эффективной, ведь перебирать все треугольники и сравнивать их друг с другом - слишком дорого. Поэтому используется нечто вроде хеш-таблицы, где хеш-функцией выступает глубина примитива.
 +
 +В основе OT лежит односвязный список, элементами которого выступают пакеты GPU. В оперативной памяти создается буфер фиксированного размера под некоторое максимальное количество дискретных значений глубины - обозначим его как N. Каждый пакет в буфере ссылается на предыдущий - таким образом, цепочка команд отрисовки хранится задом наперед. Когда мы хотим нарисовать какой-то примитив, мы вычисляем его глубину и перенормируем ее в диапазоне 0..N - получается индекс (i), по которому мы находим соответствующий элемент в нашем буфере и вставляем новый пакет в связный список после этого элемента. Иными словами, пакет i ссылается на новый пакет, а тот - на пакет i+1. Затем GPU линейно обрабатывает все пакеты, начиная с последнего - последний пакет рисуется первым, поэтому они и хранятся в списке задом наперед. Получается сортировка сложности O(1).
 +
 +Если какие-то примитивы будут иметь одинаковую глубину, возникнет коллизия - в данном случае новый пакет всегда будет помещаться после старого, и отрисован будет первым. Это и приводит к глюкам сортировки, которые порой можно видеть в некоторых играх, когда один объект перекрывает другой, хотя вроде бы и не должен.
  
3d_graphics.1792077957.txt.gz · Последнее изменение: — gecko

Если не указано иное, содержимое этой вики предоставляется на условиях следующей лицензии: CC0 1.0 Universal
CC0 1.0 Universal Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki