2

The triangles are mostly ok but one or 2 triangles would have a missing pixel between them which probably means theres a issue with edge cases but i cant figure it out

the white spaces only happen on the edge of the triangles so i assume there is something wrong with either my edge equation or my top left rule but im really lost on what is wrong with it

struct EdgeEqn {
          float a, b, c;
          bool tl;
      };
GLPbo::EdgeEqn construct(const glm::vec3 a, const glm::vec3& b) {
    GLPbo::EdgeEqn x = { a.y - b.y,b.x - a.x,(b.y - a.y) * a.x - (b.x - a.x) * a.y };
    if (x.a > 0) {
        x.tl = true;
    }
    else if (x.a < 0) {
        x.tl = false;
    }
    else if (x.b < 0) {
        x.tl = true;
    }
    else {
        x.tl = false;
    }
    return x;
}

bool edgeFunction(GLPbo::EdgeEqn x, const glm::vec2& c, float& line_eval)
{

    float eval = x.a * c.x + x.b * c.y + x.c;
    line_eval = eval;
    return (eval > 0.f || (eval == 0.f && x.tl))
        ? true : false;
}

bool Topleft_increase(GLPbo::EdgeEqn x, float eval) {
    return (eval > 0.f || (eval == 0.f && x.tl))
        ? true : false;
}

bool GLPbo::render_triangle(glm::vec3 const& p0, glm::vec3 const& p1,
    glm::vec3 const& p2, glm::vec3 clr) {
    if (((p1.x - p0.x) * (p2.y - p0.y) - (p2.x - p0.x) * (p1.y - p0.y)) < 0) {
        culling++;
        return false;
    }

    GLPbo::Color random = { static_cast<GLubyte>(clr.r), static_cast<GLubyte>(clr.g)
        , static_cast<GLubyte>(clr.b), 255 };

    int min_x = static_cast<int>(std::min({ p0.x, p1.x, p2.x }));
    int min_y = static_cast<int>(std::min({ p0.y, p1.y, p2.y }));
    int max_x = static_cast<int>(std::max({ p0.x, p1.x, p2.x }));
    int max_y = static_cast<int>(std::max({ p0.y, p1.y, p2.y }));
    GLPbo::EdgeEqn l0 = construct(p1, p2);
    GLPbo::EdgeEqn l1 = construct(p2, p0);
    GLPbo::EdgeEqn l2 = construct(p0, p1);


    float ev0 = 0, ev1 = 0, ev2 = 0;
    bool  e0 = edgeFunction(l0, glm::vec2(min_x + 0.5, min_y + 0.5), ev0);
    bool  e1 = edgeFunction(l1, glm::vec2(min_x + 0.5, min_y + 0.5), ev1);
    bool  e2 = edgeFunction(l2, glm::vec2(min_x + 0.5, min_y + 0.5), ev2);
    for (int y = min_y; y <= max_y; ++y) {
        bool hE0 = e0; bool hE1 = e1; bool hE2 = e2;
        float hEv0 = ev0; float hEv1 = ev1; float hEv2 = ev2;
        for (int x = min_x; x <= max_x; ++x) {

            if (hE0 == true && hE1 == true && hE2 == true) {
                set_pixel(x, y, random);
            }

            hEv0 += l0.a;
            hEv1 += l1.a;
            hEv2 += l2.a;
            hE0 = Topleft_increase(l0, hEv0);
            hE1 = Topleft_increase(l1, hEv1);
            hE2 = Topleft_increase(l2, hEv2);
        }
        ev0 += l0.b;
        ev1 += l1.b;
        ev2 += l2.b;
        e0 = Topleft_increase(l0, ev0);
        e1 = Topleft_increase(l1, ev1);
        e2 = Topleft_increase(l2, ev2);
    }
    return true;
}
Rabbid76
  • 202,892
  • 27
  • 131
  • 174
krater
  • 21
  • 1

0 Answers0