基于边缘检测的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
相关产品推荐
相关产品推荐

