Металл привет 2D треугольник пример не 2D, но почему? - PullRequest
0 голосов
/ 25 сентября 2018

Яблоки Metal hello 2D пример треугольника выглядит не так, как я надеялся.

Я ожидал, что 1 на x и 1 на y будут ровно 1 пикселем, и чтобыначать с левого верхнего угла.

Я бы подумал, что 2D подразумевает плоскую форму, и без понятия глубины, естественно, следует иметь 1 единицу для отображения на 1 пиксель, как я могу исправить пример так, чтобы он работал таким образомЯ ожидал этого?Общие понятия о грубой, нет необходимости создавать код, если вы действительно не любите единорогов, в таком случае, пожалуйста;так что я могу передать миру свой блеск.

https://developer.apple.com/documentation/metal/hello_triangle

static const AAPLVertex triangleVertices[] =
{
    // 2D positions,    RGBA colors
    { {  0,  0 }, { 1, 0, 0, 1 } },
    { {  0,  4 }, { 0, 1, 0, 1 } },
    { {  4,  0 }, { 0, 0, 1, 1 } },
    { {  4,  4 }, { 0, 1, 0, 1 } },
};

Эти координаты в виде линейной полосы создают 4 на 5 px N !


Обновление

Мне не удалось решить / понять, почему рисуется полоса размером 4 на 5 пикселей.Я считаю, что алгоритм линейной полосы неверен.

Треугольная полоса с ожидаемым результатом против То же самое, но линейная полоса с неожиданными результатами

Рассмотрим эту линейную полосуУгол 3 вершин:

static const AAPLVertex triangleVertices[] =
{
    // 2D positions,    RGBA colors
    { {  0,  4 }, { 1, 0, 0, 1 } },
    { {  0,  0 }, { 0, 1, 0, 1 } },
    { {  4,  0 }, { 0, 0, 1, 1 } },
};

угол в виде линейной полосы

1 Ответ

0 голосов
/ 25 сентября 2018

Кажется, вы в основном хотите указать свои начальные позиции вершин в координаты окна .Это позволит вам получить соотношение пикселей к единице 1: 1, которое вам нужно.

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

Мы игнорируем глубину.Клип пространство от -1 до 1 в обоих направлениях X и Y.Итак, мы хотим отобразить начало нашего пространства (0, 0) в (-1, 1) в пространстве клипа.Точно так же мы хотим отобразить нижний правый ( ширина , высота ) нашего пространства на (1, -1) в пространстве клипа.

Мы можем получитьв большинстве случаев это путем умножения координат пикселя на 2, вычитания размера области просмотра и, наконец, деления на размер области просмотра.Это заменяет вычисление координат пространства клипа в вершинной функции примера:

out.clipSpacePosition.xy = ((pixelSpacePosition * 2) - viewportSize) / viewportSize;

В этом пространстве Y увеличивается вниз, но ось Y в пространстве клипов увеличивается вверх, поэтому нам нужно перевернуть его:

out.clipSpacePosition.y *= -1;
...