Алгоритмы 3D-графики (Аппаратное обеспечение) - PullRequest
0 голосов
/ 04 апреля 2011

Я пытаюсь создать графический процессор asic. Я провел обширные исследования по этой теме, но я все еще не совсем понял, как переводить и вращать точки. Я использую ортографическую проекцию, чтобы растеризовать преобразованные точки.

Я использовал следующую лекцию о умножении матриц (однородные координаты) http://www.cs.kent.edu/~zhao/gpu/lectures/Transformation.pdf

Может кто-нибудь, пожалуйста, объясните мне это немного подробнее. Я все еще немного шаткий по алгоритму. Я передаю камеру (x, y, z) и вектор камеры (x, y, z), представляющий угол камеры, вместе с точкой (x, y, z). Что должно быть в матрицах, чтобы преобразовать точку в новое подходящее место?

Ответы [ 2 ]

1 голос
/ 04 апреля 2011

Вот полный алгоритм преобразования в псевдокоде:

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 .

0 голосов
/ 05 апреля 2011

В течение первых нескольких лет, когда они продавались, графические процессоры для ПК массового рынка вообще не переводили и не вращали точки. Требуется ли вам реализовать эту функцию? Если нет, вы можете позволить программному обеспечению сделать это. В зависимости от ваших обстоятельств, программное обеспечение может быть более разумным маршрутом.

Если вам потребуется реализовать эту функцию, я расскажу вам, как они это делали в первые дни.

Аппаратное обеспечение имеет шестнадцать регистров с плавающей запятой, которые представляют матрицу 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 '].

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

...