game101 第二课作业以及框架
以作业二为例继续我们的框架理解
作业二中要绘制两个三角形,三角形一前一后具有遮挡的关系。来看看这两个三角形的相关数据
std::vector<Eigen::Vector3f> pos
{
{2, 0, -2},{0, 2, -2},{-2, 0, -2},
{3.5, -1, -5},{2.5, 1.5, -5},{-1, 0.5, -5}
};
std::vector<Eigen::Vector3i> ind
{
{0, 1, 2},{3, 4, 5}
};
std::vector<Eigen::Vector3f> cols
{
{217.0, 238.0, 185.0},{217.0, 238.0, 185.0},{217.0, 238.0, 185.0},
{185.0, 217.0, 238.0},{185.0, 217.0, 238.0},{185.0, 217.0, 238.0}
};
在pos中存放了6组顶点坐标,每组顶点坐标都说三维浮点向量的格式。ind中存放了两组整型向量,每个向量中三个值,三个值定义一个三角形,说明了在其他向量中存储的三角形三个点的数据下标,以及三角形的三个点的存放次序(默认要求逆时针存放)。
然后将这三组数据载入到光栅器之中去:
auto pos_id = r.load_positions(pos);
auto ind_id = r.load_indices(ind);
auto col_id = r.load_colors(cols);
跳过在作业1中讲到过的MVP矩阵变换,直接关注光栅器的rasterizer.draw()函数:
r.draw(pos_id, ind_id, col_id, rst::Primitive::Triangle);
auto& buf = pos_buf[pos_buffer.pos_id];
auto& ind = ind_buf[ind_buffer.ind_id];
auto& col = col_buf[col_buffer.col_id];//draw函数中首先读入光栅器中存储的三角形顶点的次序信息和其他位置颜色信息。
Eigen::Matrix4fmvp = projection*view*model;//计算mvp矩阵
之后通过for(auto& i: id)遍历id,每次遍历过程i中存储了一组三角形的下标。
Eigen::Vector4fv[] = {
mvp*to_vec4(buf[i[0]], 1.0f),//to_vec4()函数将输入的数据拼接成四维浮点型向量返回,
mvp*to_vec4(buf[i[1]], 1.0f),
mvp*to_vec4(buf[i[2]], 1.0f)
};//创建一个数组v,数组中的每个对象类型为四维浮点型向量,即齐次形式的空间点坐标,求三角形的点坐标经过mvp变换后的结果
再将每个点坐标化为规范的齐次形式
for (auto& vec : v) {
vec /= vec.w();
}
准备光栅化,求出每个三角形顶点在光栅器中的坐标纵横坐标。这其中z被作为深度信息使用,经过处理后全部大于0,数值越大离相机越远。
for (auto & vert : v)
{
vert.x() = 0.5*width*(vert.x()+1.0);
vert.y() = 0.5*height*(vert.y()+1.0);
vert.z() = vert.z() * f1 + f2;
}
在triangle t中写入每个顶点在光栅器中的坐标,以及颜色
for (int i = 0; i < 3; ++i)
{
t.setVertex(i, v[i].head<3>());
}
auto col_x = col[i[0]];
auto col_y = col[i[1]];
auto col_z = col[i[2]];
t.setColor(0, col_x[0], col_x[1], col_x[2]);
t.setColor(1, col_y[0], col_y[1], col_y[2]);
t.setColor(2, col_z[0], col_z[1], col_z[2]);
再调用rasterize_triangle(const Triangle& t)函数光栅化Triangle t.

浙公网安备 33010602011771号