Интерполяция атрибутов при растеризации

введите сюда описание изображения

Есть набор вершин:

            new Vector(-0.5,-0.5,-0.5),
            new Vector(-0.5, 0.5,-0.5),
            new Vector( 0.5, 0.5,-0.5),
            new Vector( 0.5,-0.5,-0.5),
            new Vector(-0.5,-0.5, 0.5),
            new Vector(-0.5, 0.5, 0.5),
            new Vector( 0.5, 0.5, 0.5),
            new Vector( 0.5,-0.5, 0.5)

и набор треугольников:

            new Triangle(0,2,1,[0,0,255,255],[255,255,255,255],[0,255,255,255]),
            new Triangle(0,3,2,[255,0,255,255],[0,0,255,255],[255,255,255,255]),

            new Triangle(6,5,1,[0,255,255,255],[255,255,0,255],[0,255,0,255]),
            new Triangle(1,2,6,[255,255,255,255],[255,255,0,255],[0,255,255,255]),

            new Triangle(2,6,3,[255,0,255,255],[255,255,255,255],[255,255,0,255]),
            new Triangle(6,3,7,[255,0,255,255],[255,0,0,255],[255,255,0,255]),

            new Triangle(5,1,0,[0,0,255,255],[0,255,255,255],[0,255,0,255]),
            new Triangle(5,0,4,[0,0,255,255],[0,0,0,255],[0,255,0,255]),

            new Triangle(0,7,4,[0,0,255,255],[255,0,0,255],[0,0,0,255]),
            new Triangle(0,3,7,[255,0,255,255],[0,0,255,255],[255,0,0,255]),

            new Triangle(6,5,7,[255,0,0,255],[255,255,0,255],[0,255,0,255]),
            new Triangle(7,5,4,[255,0,0,255],[0,0,0,255],[0,255,0,255]),

После проекционного преобразования для интерполяции атрибутов (в данном случае цветов в вершинах) мне нужно отсортировать величину у каждой вершины полигона по возрастанию.

class Triangle {
constructor(vA, vB, vC, cA = [255,0,0,255], cB = cA, cC = cA) {
    this.vA = vA;
    this.vB = vB;
    this.vC = vC;
    this.cA = cA;
    this.cB = cB;
    this.cC = cC;
}

static normal(vA, vB, vC) {
    var ab = Vector.subtract(vB, vA);
    var ac = Vector.subtract(vC, vA);
    return Vector.cross(ab, ac);
}

sort(projected) {
    let vA = this.vA;
    let vB = this.vB;
    let vC = this.vC;
    let cA = this.cA;
    let cB = this.cB;
    let cC = this.cC;

    if (projected[vB].y < projected[vA].y) {
        [vA, vB] = [vB, vA];
        [cA, cB] = [cB, cA];
    }

    if (projected[vC].y < projected[vA].y) {
        [vA, vC] = [vC, vA];
        [cA, cC] = [cC, cA];
    }

    if (projected[vC].y < projected[vB].y) {
        [vB, vC] = [vC, vB];
        [cB, cC] = [cC, cB];
    }
    return new Triangle(vA,vB,vC,cA,cB,cC)
}

}

Почему вершины становятся не на свои места? Пытался сортировать по разному, но при анимации движения камеры всё равно происходит такой артефакт. Если кто-то сталкивался, подскажите, в чём может быть проблема?


Ответы (0 шт):