500行C++代码实现软件渲染器 - 0.引言

直接阅读源代码并不容易理解,建议阅读维基之后再来实现你自己的渲染器。只有当你弄懂了所有的技术细节之后,你才会知道渲染器如何工作。我很乐意通过邮件得到读者的反馈。如果你有任何问题,欢迎与我联系([email protected])。如果你是一名教师,希望在课堂上使用本材料,我对此非常欢迎,不必授权,只需要通过邮件告知我即可,因为这能够帮助我改进本课程。

本系列文章中,我希望通过写一个渲染器来展示OpenGL是如何工作的。我经常碰到一些人,他们难以跨过学习OpenGL/DirectX的第一道坎,这确实令人吃惊。因此,我准备了这个系列文章。我的学生学习了这些文章之后都能实现一个比较好的渲染器。

本系列文章的任务是:不使用任何三方库(尤其是图形学方面的),渲染出类似以下图片的效果。

500行C++代码实现软件渲染器 - 0.引言_第1张图片

提醒:这是一个练习材料,它会引导你简单重复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看起来是这样的:

https://raw.githubusercontent.com/ssloy/tinyrenderer/gh-pages/img/00-home/reddot.png

预告:使用本课程渲染器生成的其他效果图

500行C++代码实现软件渲染器 - 0.引言_第2张图片

500行C++代码实现软件渲染器 - 0.引言_第3张图片

500行C++代码实现软件渲染器 - 0.引言_第4张图片

500行C++代码实现软件渲染器 - 0.引言_第5张图片

感谢原作者Dmitry V. Sokolov的授权,原文链接:https://github.com/ssloy/tinyrenderer/wiki

 

你可能感兴趣的:(图形学,3D,OpenGL,图形学,OpenGL,三维渲染)