Games101 作业2 cross + BoundingBox

这篇博客介绍了如何使用叉乘判断点是否在三角形内,并实现了一个简单的三维图形渲染器。首先,通过叉乘计算三角形边的法向量,然后判断像素点是否在三角形内。接着,确定三角形的边界框(BoundingBox),遍历每个像素,使用Barycentric坐标计算像素的深度值,并进行深度缓冲区更新。最后,根据深度值填充像素颜色。博客还提及了Rasterizer类的相关函数和变量,但未详细展开。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       设 a ( x 1 , y 1 ) , b ( x 2 , y 2 ) a(x_1,y_1),b(x_2,y_2) a(x1,y1),b(x2,y2),叉乘: a ⋅ b = x 1 y 2 − x 2 y 1 a\cdot b=x_1y_2-x_2y_1 ab=x1y2x2y1
       实现叉乘,代码意思对即可

static bool insideTriangle(int x, int y, const Vector3f* _v)
{   
    Vector3f v[3];
    for(int i=0;i<3;i++)
        v[i] = {_v[i].x(),_v[i].y(), 1.0};
    Vector3f f0,f1,f2;
    f0 = v[1].cross(v[0]);
    f1 = v[2].cross(v[1]);
    f2 = v[0].cross(v[2]);
    Vector3f p(x,y,1.);
    return (p.dot(f0)*f0.dot(v[2])>0) && (p.dot(f1)*f1.dot(v[0])>0) && (p.dot(f2)*f2.dot(v[1])>0);    
    
}

       利用三角形的顶点求 BoundingBox,即xmin,xmax,ymin,ymax。剩余部分按部就班实现即可,注意看Rasterizer类中有什么函数和变量。

void rst::rasterizer::rasterize_triangle(const Triangle& t) {
    auto v = t.toVector4();
    float xmin = std::min(t.v[0].x(), std::min(t.v[1].x(), t.v[2].x()));
    float xmax = std::max(t.v[0].x(), std::max(t.v[1].x(), t.v[2].x()));
    float ymin = std::min(t.v[0].y(), std::min(t.v[1].y(), t.v[2].y()));
    float ymax = std::max(t.v[0].y(), std::max(t.v[1].y(), t.v[2].y()));
    for(int x = (int)std::ceil(xmin); x <= xmax; x++){
        for(int y = (int)std::ceil(ymin); y <= ymax; y++){
            if(!insideTriangle(x, y, t.v)) continue;
            auto[alpha, beta, gamma] = computeBarycentric2D(x, y, t.v);
            float w_reciprocal = 1.0/(alpha / v[0].w() + beta / v[1].w() + gamma / v[2].w());
            float z_interpolated = alpha * v[0].z() / v[0].w() + beta * v[1].z() / v[1].w() + gamma * v[2].z() / v[2].w();
            z_interpolated *= w_reciprocal;
            if(z_interpolated < depth_buf[get_index(x, y)]){
                depth_buf[get_index(x, y)] = z_interpolated;
                Vector3f v(x, y, 0);
                set_pixel(v, t.getColor());
            }
        }
    }
}

       采样懒得实现了,原理懂就行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值