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

4 篇文章 0 订阅
4 篇文章 0 订阅

直接阅读源代码并不容易理解,建议阅读维基之后再来实现你自己的渲染器。只有当你弄懂了所有的技术细节之后,你才会知道渲染器如何工作。我很乐意通过邮件得到读者的反馈。如果你有任何问题,欢迎与我联系(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看起来是这样的:

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

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

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

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

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

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

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

 

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值