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

输出的文件output.tga看起来是这样的:

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

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

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

  1. TinyRenderer(1):500行代码实现软件渲染器

    Lsson 0 从头开始 这是一个微型软件光栅化程序,如果您正在寻找一个微型软件光线跟踪器,则可以在此处找到它. 我的源代码无关紧要.阅读本文并实现自己的渲染器.只有当您经历所有细微的细节时,您才能了 ...

  2. output怎么用_如何用 C++ 写一个可编程软件渲染器?

    今天你想用最新的 D3D12 画一个三角形,少说也要上千行代码了,对于初学者来讲,这个门槛是非常高的,太多干扰了,而一千多行代码,已经足够你重头实现一个简易版 D3D 了,为什么不呢?比起从图形 AP ...

  3. 移花接木—做一个简单的软件渲染器

    移花接木-根据PBRT魔改出自己的软件渲染器 本文包含以下你可能感兴趣的内容: 门外汉是如何学习computer graphic领域的 从模仿到实践:PBRT给我带来了什么? 如何自编一个软件渲染管线 ...

  4. 想用C++实现一个软件渲染器

     想用C++实现一个软件渲染器 : https://www.zhihu.com/question/33712299

  5. python代码大全p-21行Python代码实现拼写检查器

    引入 大家在使用谷歌或者百度搜索时,输入搜索内容时,谷歌总是能提供非常好的拼写检查,比如你输入 speling,谷歌会马上返回 spelling. 下面是用21行python代码实现的一个简易但是具备 ...

  6. [软件渲染器入门]五-平面着色和高氏着色

    译者前言: 本文译自MSDN,原作者为David Rousset,文章中如果有我的额外说明,我会加上[译者注:]. 正文开始: 这可能是整个系列中最棒的部分:如何处理光照!在之前,我们已经搞定了让每个 ...

  7. [软件渲染器入门]六-应用纹理、背面剔除以及一些WebGL相关

    译者前言: 本文译自MSDN,原作者为David Rousset,文章中如果有我的额外说明,我会加上[译者注:]. 正文开始: 下面是本系列的最后一个章节了.我们将看到如何从Blender中导出贴图和 ...

  8. CG-3D渲染器-0.1

    引言 在学习GAMES101的路上,我总是会心血来潮,想要做出一个3D渲染器.所谓3D渲染器,就是可以加载模型,并且通过调整参数来渲染出不同的视觉效果. 最近看视频看到了第9课,想着做个作业,于是通过 ...

  9. python代码示例500行源代码-500行Python代码打造刷脸考勤系统,其实也就那么简单...

    需求分析 "员工刷脸考勤"系统,采用Python语言开发,可以通过摄像头添加员工面部信息,这里就涉及到两个具体的个问题,一个是应该以什么样的数据来标识每一个员工的面部信息,二是持久 ...

最新文章

  1. 博士真正搞科研的姿势,是这样的
  2. 院士:人一生有两个阶段最能逼出成果,一是拿博士学位,二是评正教授
  3. 跨镜追踪“智”眼识人技术策略研究及实现
  4. ubutu14.04无法使用sudo,也无法切换到root用户去解决问题怎么办?
  5. c++中#include“stdafx.h”
  6. 嵌入式Linux系统之I.MX6触摸屏驱动程序TSC2007.C的分析、移植与校准
  7. 肯耐珂萨助力世界500强零售企业在线春招:单次面试3000人
  8. shell下后台挂起
  9. MySQL 定时任务event 按天建表 并将前一天数据导入新建的表中并删除总表数据 实现分表功能
  10. java方法里面能改定时器的时间吗_Kafka 时间轮的原理和实现
  11. JAVA编程中异常问题处理方式的区别和分析
  12. Oracle P6培训系列:06创建项目日历
  13. 提问的智慧(学习笔记)
  14. c++ primer kindle_开箱测评掌阅iReader Ligtht悦享版阅读器,电纸书不止有kindle
  15. idea快速切换不同JDK版本
  16. 计算机辅助教学属于多媒体技术应用吗,多媒体技术在计算机辅助教学中的应用...
  17. 看牙分期软件3.10版本更新及功能介绍
  18. centos6使用devtoolset快速升级GCC版本4.8/5.2/8.3
  19. 5分钟外设学堂:耳机不响别慌,换个插头能救活!
  20. 关于eclips的一些使用

热门文章

  1. 云队友丨阿里张勇:别让35岁成为职场分水岭!
  2. iphone12怎样快速录屏(苹果12录屏方法)
  3. 固态硬盘逻辑坏道简单修复方法(2015-04-02更新)
  4. w ndows哪个版本好用2019年,关于高通骁龙8cx PC平台的11个问题
  5. 腾讯云+社区技术沙龙预告
  6. 关于实现平台账号密码登录后,再进行微信授权认证步骤的实现方法
  7. RPA机器人的2大类型
  8. 天喻信息上市前陷股权纠纷 法院已立案
  9. linux搭建私网的ntp时间同步服务
  10. OFD转PDF ~java实现