在上一节第1个绘制结果[174902192023] 的源码基础上,再在main函数中增加深度值来剔除模型背面看不到的三角面:
int main(){
Vec3f light_dir(0,0,-1); // define light_dir
for (int i=0; i<model->nfaces(); i++) {
std::vector<int> face = model->face(i);
Vec2i screen_coords[3];
Vec3f world_coords[3];
for (int j=0; j<3; j++) {
Vec3f v = model->vert(face[j]);
screen_coords[j] = Vec2i((v.x+1.)*width/2., (v.y+1.)*height/2.);
world_coords[j] = v;
}
Vec3f n = (world_coords[2]-world_coords[0])^(world_coords[1]-world_coords[0]);
n.normalize();
float intensity = n*light_dir;
if (intensity>0) {
saomiaoxiansuanfa_160802192023(screen_coords[0], screen_coords[1], screen_coords[2], image, TGAColor(intensity*255, intensity*255, intensity*255, 255));
}
}
}
这段代码为一个简单的渲染器,使用的模型是一个三维模型。程序首先定义了光线的方向,并迭代遍历三维模型中的每个面。对于每个面,程序计算出它在三维世界中的顶点坐标,将其映射到屏幕上,计算出光照的强度,将其作为颜色参数,调用一个函数在屏幕上绘制出该面的三角形。最终,渲染器将输出绘制好的图片文件。
绘制结果:
