Spiele-101 Aufgabe 02

1. Implementieren Sie zunächst den Rasterisierungsalgorithmus:

void rst::rasterizer::rasterize_triangle(const Triangle& t) {
    //v储存了该三角形的三个顶点,是一个包含了三个Vector4向量的数组
    auto v = t.toVector4();
    // TODO : Find out the bounding box of current triangle.
    //对现在的三角形创建我们的bounding box
    //那么就需要找到我们现在的三角形的所有坐标,然后获取其三个顶点横纵坐标极值
    int x_l = std::floor(std::min(v[0][0],std::min(v[1][0],v[2][0])));
    int x_r = std::ceil(std::max(v[0][0],std::max(v[1][0],v[2][0])));
    int y_d = std::floor(std::min(v[0][1],std::min(v[1][1],v[2][1])));
    int y_u = std::ceil(std::max(v[0][1],std::max(v[1][1],v[2][1])));

    // iterate through the pixel and find if the current pixel is inside the triangle
    //遍历bounding box内所有的像素,使用整数索引,然后用像素中的屏幕空间坐标来检查中心点是否在三角形内
  for(int x= x_l;x<=x_r;x++){
    for(int y = y_d;y<=y_u;y++){
        if(insideTriangle(x+0.5f,y+0.5f,t.v)){
           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)]){//如果现在的深度比Z_Buffer中更小,那么就更新深度,然后重新设置该点的颜色
            depth_buf[get_index(x,y)] = z_interpolated;
            set_pixel(Eigen::Vector3f(x,y,z_interpolated),t.getColor());
           }
        }
    }

  }

Für diese Aufgabe müssen wir den Quellcode kurz lesen. Die Idee ist folgende: Um die Rasterung zu implementieren, müssen wir zuerst die drei Eckpunkte des Dreiecks ermitteln, dann unseren Begrenzungsrahmen finden und anhand des Begrenzungsrahmens den Start- und Endpunkt der Durchquerung bestimmen. Dann wird beurteilt, ob die Spitze des Dreiecks in die Mitte des Pixels eintritt, um die Diskretisierungsoperation durchzuführen. Daher stellen wir fest, dass die Koordinaten des Dreiecks in unserer Dreiecksklasse deklariert sind und wir sie über die Variable v am Anfang der Funktion verwenden.

Durchlaufen Sie dann alle Punkte im Begrenzungsrahmen und ermitteln Sie dann mithilfe von insideTriangle, ob sich der Dreieckspunkt innerhalb des Pixels befindet (beachten Sie, dass der Punkt zur Beurteilung um +0,5 zur Pixelmitte versetzt sein muss).

Als nächstes implementieren Sie die Funktion insideTriangle, die wiederum durch Kreuzmultiplikation beurteilt werden kann.

static bool insideTriangle(int x, int y, const Vector3f* _v)
{ //参数解释,x和y代表像素中心的坐标,_v储存了三角形的三个顶点的坐标 
    // TODO : Implement this function to check if the point (x, y) is inside the triangle represented by _v[0], _v[1], _v[2]
    //接下来将点和三角形的边按照顺序叉乘法,
    //首先构建某点指向三角形顶点的向量,设点为P,三角形三个顶点为A,B,C
    Vector2f P;
    P<<x,y;
    //令v0 = A,v1 = B,v2 = C;
    Vector2f BA = _v[0].head(2)-_v[1].head(2);
    Vector2f BP = P-_v[1].head(2);
    Vector2f CB = _v[1].head(2)-_v[2].head(2);
    Vector2f CP = P-_v[2].head(2);
    Vector2f AC = _v[2].head(2)-_v[0].head(2);
    Vector2f AP = P-_v[0].head(2);
    //叉乘判断像素点是否在三角形内
    return AP[0] * AC[1] - AP[1] * AC[0] > 0 && BP[0] * BA[1] - BP[1] * BA[0] > 0 && CP[0] * CB[1] - CP[1] * CB[0] > 0;
   //依次实现Cross操作
}

Die Ausgabe ist wie folgt

 Es ist nicht schwer zu erkennen, dass es an der Fasenkante immer noch viele gezackte Kanten gibt.

Der nächste Schritt besteht also darin, den Verbesserungsteil (MSAA) umzusetzen.

Sie müssen jedes Mal, wenn Sie jedes Pixel durchqueren, nur 4 Abtastpunkte (Pixelmitte) durchlaufen.

			if (insideTriangle((float)x + 0.25, (float)y + 0.25, t.v)) fineness += 0.25; //改为判断四个采样块的中心点在不在三角形内
			if (insideTriangle((float)x + 0.25, (float)y + 0.75, t.v)) fineness += 0.25;
			if (insideTriangle((float)x + 0.75, (float)y + 0.25, t.v)) fineness += 0.25;
			if (insideTriangle((float)x + 0.75, (float)y + 0.75, t.v)) fineness += 0.25;

Schließlich mit einem bestimmten Verhältnis multipliziert

set_pixel(p, fineness * t.getColor()); //将比例乘给颜色

Sichtbare Leistungseinbußen (sehr festgefahren)

Acho que você gosta

Origin blog.csdn.net/qq_24917263/article/details/129148533
Recomendado
Clasificación