Скретчапиксельная перспективная верная интерполяция атрибутов вершин - PullRequest
0 голосов
/ 22 января 2020

Я пытаюсь реализовать базовый c программный рендерер.

Похоже, мои интерполированные текстурные координаты некорректны

, но я выполнил все математические операции чтобы исправить перспективу

Я пишу код, следующий за этой статьей https://www.scratchapixel.com/lessons/3d-basic-rendering/rasterization-practical-implementation/perspective-correct-interpolation-vertex-attributes

исходный код https://github.com/RKGekk/PerspectiveCorrectTexturing

        float v0z = 1.0f / v0.z;
        float v1z = 1.0f / v1.z;
        float v2z = 1.0f / v2.z;
        float yTemp = v0.y;
        if (v0.x >= 0 && v0.x < pixelWidth && v1.x >= 0 && v1.x < pixelWidth && v2.x >= 0 && v2.x < pixelWidth) {

            for (loop_y = iy1; loop_y <= iy3; loop_y++) {

                int ixStart = (int)xStart;
                int ixEnd = (int)xEnd;
                float xTemp = xStart;

                for (int x = ixStart; x < ixEnd; x++) {

                    Vec2f p = new Vec2f(xTemp, loop_y);
                    Vec3f w = poly.nlambdas(p);
                    float z = 1.0f / (w.x * v0z + w.y * v1z + w.z * v2z);

                    Vec3f color = new Vec3f(
                        (poly.c0.r * v0z * w.x + poly.c1.r * v1z * w.y + poly.c2.r * v2z * w.z) * z,
                        (poly.c0.g * v0z * w.x + poly.c1.g * v1z * w.y + poly.c2.g * v2z * w.z) * z,
                        (poly.c0.b * v0z * w.x + poly.c1.b * v1z * w.y + poly.c2.b * v2z * w.z) * z
                    );

                    Vec2f UV = new Vec2f(
                        (poly.t0.x * v0z * w.x + poly.t1.x * v1z * w.y + poly.t2.x * v2z * w.z) * z,
                        (poly.t0.y * v0z * w.x + poly.t1.y * v1z * w.y + poly.t2.y * v2z * w.z) * z
                    );

                    bool alphaColor = false;
                    if (poly.rasterType == RPolygon.RasterType.Textured) {
                        Vec4f texColor = poly.texture.sampleTextureA(UV);
                        if (texColor.a == 1.0f) {
                            color.r = texColor.r;
                            color.g = texColor.g;
                            color.b = texColor.b;
                        }
                        else {
                            alphaColor = true;
                        }
                    }

                    if (!alphaColor) {
                        printPixelZ(
                            x,
                            loop_y,
                            z,
                            color
                        );
                    }

                    xTemp += 1.0f;
                }

                xStart += dx_left;
                xEnd += dx_right;
                yTemp += 1.0f;
            }
        }

perspective incorrect texture coordinates interpolation

...