直接阅读源代码并不容易理解,建议阅读维基之后再来实现你自己的渲染器。只有当你弄懂了所有的技术细节之后,你才会知道渲染器如何工作。我很乐意通过邮件得到读者的反馈。如果你有任何问题,欢迎与我联系(dmitry.sokolov@univ-lorraine.fr)。如果你是一名教师,希望在课堂上使用本材料,我对此非常欢迎,不必授权,只需要通过邮件告知我即可,因为这能够帮助我改进本课程。
本系列文章中,我希望通过写一个渲染器来展示OpenGL是如何工作的。我经常碰到一些人,他们难以跨过学习OpenGL/DirectX的第一道坎,这确实令人吃惊。因此,我准备了这个系列文章。我的学生学习了这些文章之后都能实现一个比较好的渲染器。
本系列文章的任务是:不使用任何三方库(尤其是图形学方面的),渲染出类似以下图片的效果。
提醒:这是一个练习材料,它会引导你简单重复OpenGL库的架构,实现一个软件渲染器。我并不会向你展示如何使用OpenGL写程序,我只会向你展示OpenGL如何工作。因为我深信,不理解三维渲染库的底层实现,根本不可能写出高效的程序。
我会将最终的代码量控制在500行左右。我的学生需要10-20个小时的编时间来实现这样一个渲染器。我们使用一个多边形网格文件和图片纹理作为输入,同时输出一个经过渲染的模型。由于没有图形接口,我们的程序只生成一张图片。
由于我们的目标是尽量减少外部依赖,我只给了我的学生一个处理TGA文件的类。TGA是最简单的图片格式之一,支持RGB/RGBA/黑白格式。因此,在开始的时候,我们将获得一个简单的方式来处理图片。你会注意到,在最开始,我们用到的功能仅仅是为像素设置颜色值,当然,读写图片的功能除外。
没有绘制线和三角形的功能,我们将手动实现这些。我将把我和学生同时写的源代码提供出来。但是我不建议使用这些代码,因为不太好理解。完整的代码在GitHub上,你可以在这里看到我给学生提供的代码。
#include "tgaimage.h"
const TGAColor white = TGAColor(255, 255, 255, 255);
const TGAColor red = TGAColor(255, 0, 0, 255);
int main(int argc, char** argv)
{
TGAImage image(100, 100, TGAImage::RGB);
image.set(52, 41, red);
image.flip_vertically(); // i want to have the origin at the left bottom corner of the image
image.write_tga_file("output.tga");`
return 0;
}
输出的文件output.tga看起来是这样的:
预告:使用本课程渲染器生成的其他效果图
感谢原作者Dmitry V. Sokolov的授权,原文链接:https://github.com/ssloy/tinyrenderer/wiki