You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于边缘检测的C++三角形光栅化实现问题排查求助

基于边缘检测的三角形光栅化实现问题

我参考一篇3D渲染相关文章实现基于边缘检测的三角形光栅化,但代码实际运行不符合预期,以下是我的实现代码,恳请帮忙排查问题:

边缘函数实现

bool SoftwareRendererImp::edgeFunction(float xa, float ya,
                                       float xb, float yb,
                                       float xp, float yp)
{
return ((xp - xa) * (yb - ya) - (yp - ya) * (xb - xa) >= 0);
}

三角形光栅化函数实现

void SoftwareRendererImp::rasterize_triangle(float x0, float y0,
                                           float x1, float y1,
                                           float x2, float y2,
                                           Color color)
{
    // Task 3:
    // Implement triangle rasterization
    cout << "triangle----------------------------------------------------------------------------------------------------------------------- \n";

    float minX = std::min(x0, x1);
    minX = std::min(minX, x2);

    float minY = std::min(y0, y1);
    minY = std::min(minY, y2);

    float maxX = std::max(x0, x1);
    maxX = std::max(maxX, x2);

    float maxY = std::max(y0, y1);
    maxY = std::max(maxY, y2);

    bool inside;

    float px, py;

    for (int x = minX; x < maxX; x++)
    {
      for (int y = minY; y < maxY; y++)
      {
        inside = true;
        px = x + 0.5f;
        py = y + 0.5f;
        inside &= SoftwareRendererImp::edgeFunction(x0, y0, x1, y1, px, py);
        inside &= SoftwareRendererImp::edgeFunction(x1, y1, x2, y2, px, py);
        inside &= SoftwareRendererImp::edgeFunction(x2, y2, x0, y0, px, py);
        if (inside)
        {
          SoftwareRendererImp::rasterize_point(x, y, color);
          cout << "inside: " << x << ", " << y << "\n";
        }
        else
        {
          // cout << "outside: " << x << ", " << y << "\n";
        }
      }
    }
}

排查方向参考

  • 顶点缠绕顺序一致性:边缘函数的符号依赖三角形顶点的顺时针/逆时针缠绕顺序,若三个边的顶点顺序规则不统一(比如部分边是A→B,部分是B→A),会导致边缘检测逻辑反向,出现漏判或误判,需确保所有边的顶点遵循同一缠绕规则。
  • 包围盒遍历范围:当前代码将浮点型的minX/minY直接转为int会截断小数部分,可能缩小遍历范围,漏掉应处理的像素。建议用floor(minX)向下取整作为遍历起始值,ceil(maxX)向上取整作为结束值,确保覆盖所有可能的像素。
  • 边缘函数符号匹配:需确认你定义的“内部区域”和参考文章逻辑一致。若顶点是顺时针排列,文章可能定义边缘函数结果≥0为内部;若为逆时针,可能需要≤0,或统一调整所有边的顶点顺序来匹配符号逻辑。
  • 浮点数精度修正:边缘函数计算的浮点数误差可能导致边界点误判,可给判断条件添加极小的epsilon值(比如>= -1e-6)抵消精度影响。

内容的提问来源于stack exchange,提问作者Tyler B. Joudrey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 16:16:05