Алгоритмы 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'].

Затем треугольники растеризуются с недавно вычисленными вершинами. Это позволяет вершинам модели находиться в памяти только для чтения, если это необходимо, хотя модель и камера могут находиться в движении.

Другие вопросы по тегам