Алгоритмы 3D-графики (Аппаратное обеспечение)
Я пытаюсь создать графический процессор ASIC. Я провел обширные исследования по этой теме, но я все еще не совсем понимаю, как переводить и вращать точки. Я использую ортографическую проекцию, чтобы растеризовать преобразованные точки.
Я использовал следующую лекцию о матричном умножении (однородные координаты) http://www.cs.kent.edu/~zhao/gpu/lectures/Transformation.pdf
Может ли кто-нибудь объяснить мне это немного подробнее? Я все еще немного шаткий по алгоритму. Я передаю камеру (x,y,z) и вектор камеры (x,y,z), представляющий угол камеры, вместе с точкой (x,y,z). Что должно быть в матрицах для преобразования точки в новое подходящее место?
2 ответа
Вот полный алгоритм преобразования в псевдокод:
void project(Vec3d objPos, Matrix4d modelViewMatrix,
Matrix4d projMatrix, Rect viewport, Vec3d& winCoords)
{
Vec4d in(objPos.x, objPos.y, objPos.z, 1.0);
in = projMatrix * modelViewMatrix * in;
in /= in.w; // perspective division
// "in" is now in normalized device coordinates, which are in the range [-1, 1].
// Map coordinates to range [0, 1]
in.x = in.x / 2 + 0.5;
in.y = in.y / 2 + 0.5;
in.z = in.z / 2 + 0.5;
// Map to viewport
winCoords.x = in.x * viewport.w + viewport.x;
winCoords.y = in.y * viewport.h + viewport.y;
winCoords.z = in.z;
}
Затем растеризуйте, используя winCoords.x и winCoords.y.
Для объяснения этапов этого алгоритма см. Вопрос 9.011 из FAQ по OpenGL.
Первые несколько лет они продавались, массовые графические процессоры для ПК вообще не переводили и не вращали точки. Требуется ли вам реализовать эту функцию? Если нет, вы можете позволить программному обеспечению сделать это. В зависимости от ваших обстоятельств, программное обеспечение может быть более разумным путем.
Если вам потребуется реализовать эту функцию, я расскажу вам, как они делали это в первые дни.
Аппаратное обеспечение имеет шестнадцать регистров с плавающей запятой, которые представляют матрицу 4x4. Разработчик приложения загружает эти регистры с помощью матрицы ModelViewProjection непосредственно перед рендерингом сетки треугольников. Матрица ModelViewProjection:
Модель * Вид * Проекция
Где "Модель" - это матрица, которая переводит вершины из координат "модели" в "мировые" координаты, "Вид" - это матрица, которая переводит вершины из "мировых" координат в координаты "камеры", а "Проекция" - это матрица, которая приводит вершины от координат "камеры" до "экранных" координат. Вместе они приводят вершины из "модельных" координат - координат относительно трехмерной модели, к которой они принадлежат, - в "экранные" координаты, где вы намерены растеризовать их в виде треугольников.
Это три разные матрицы, но они умножаются вместе, и результат 4x4 записывается в аппаратные регистры.
Когда буфер вершин должен отображаться как треугольники, аппаратное обеспечение считывает из вершин как [x,y,z] векторы из памяти и обрабатывает их, как если бы они были [x,y,z,w], где w всегда равно 1 Затем он умножает каждый вектор на матрицу ModelViewProjection 4x4, чтобы получить [x',y',z',w']. Если есть перспектива (вы сказали, что ее не было), то мы делим на w, чтобы получить перспективу [x'/w',y'/w',z'/w',w'/w'].
Затем треугольники растеризуются с недавно вычисленными вершинами. Это позволяет вершинам модели находиться в памяти только для чтения, если это необходимо, хотя модель и камера могут находиться в движении.