500行C++代码实现软件渲染器 - 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 imageimage.write_tga_file("output.tga");`return 0;
}
输出的文件output.tga看起来是这样的:
预告:使用本课程渲染器生成的其他效果图
感谢原作者Dmitry V. Sokolov的授权,原文链接:https://github.com/ssloy/tinyrenderer/wiki
500行C++代码实现软件渲染器 - 0.引言相关推荐
- TinyRenderer(1):500行代码实现软件渲染器
Lsson 0 从头开始 这是一个微型软件光栅化程序,如果您正在寻找一个微型软件光线跟踪器,则可以在此处找到它. 我的源代码无关紧要.阅读本文并实现自己的渲染器.只有当您经历所有细微的细节时,您才能了 ...
- output怎么用_如何用 C++ 写一个可编程软件渲染器?
今天你想用最新的 D3D12 画一个三角形,少说也要上千行代码了,对于初学者来讲,这个门槛是非常高的,太多干扰了,而一千多行代码,已经足够你重头实现一个简易版 D3D 了,为什么不呢?比起从图形 AP ...
- 移花接木—做一个简单的软件渲染器
移花接木-根据PBRT魔改出自己的软件渲染器 本文包含以下你可能感兴趣的内容: 门外汉是如何学习computer graphic领域的 从模仿到实践:PBRT给我带来了什么? 如何自编一个软件渲染管线 ...
- 想用C++实现一个软件渲染器
想用C++实现一个软件渲染器 : https://www.zhihu.com/question/33712299
- python代码大全p-21行Python代码实现拼写检查器
引入 大家在使用谷歌或者百度搜索时,输入搜索内容时,谷歌总是能提供非常好的拼写检查,比如你输入 speling,谷歌会马上返回 spelling. 下面是用21行python代码实现的一个简易但是具备 ...
- [软件渲染器入门]五-平面着色和高氏着色
译者前言: 本文译自MSDN,原作者为David Rousset,文章中如果有我的额外说明,我会加上[译者注:]. 正文开始: 这可能是整个系列中最棒的部分:如何处理光照!在之前,我们已经搞定了让每个 ...
- [软件渲染器入门]六-应用纹理、背面剔除以及一些WebGL相关
译者前言: 本文译自MSDN,原作者为David Rousset,文章中如果有我的额外说明,我会加上[译者注:]. 正文开始: 下面是本系列的最后一个章节了.我们将看到如何从Blender中导出贴图和 ...
- CG-3D渲染器-0.1
引言 在学习GAMES101的路上,我总是会心血来潮,想要做出一个3D渲染器.所谓3D渲染器,就是可以加载模型,并且通过调整参数来渲染出不同的视觉效果. 最近看视频看到了第9课,想着做个作业,于是通过 ...
- python代码示例500行源代码-500行Python代码打造刷脸考勤系统,其实也就那么简单...
需求分析 "员工刷脸考勤"系统,采用Python语言开发,可以通过摄像头添加员工面部信息,这里就涉及到两个具体的个问题,一个是应该以什么样的数据来标识每一个员工的面部信息,二是持久 ...
最新文章
- 博士真正搞科研的姿势,是这样的
- 院士:人一生有两个阶段最能逼出成果,一是拿博士学位,二是评正教授
- 跨镜追踪“智”眼识人技术策略研究及实现
- ubutu14.04无法使用sudo,也无法切换到root用户去解决问题怎么办?
- c++中#include“stdafx.h”
- 嵌入式Linux系统之I.MX6触摸屏驱动程序TSC2007.C的分析、移植与校准
- 肯耐珂萨助力世界500强零售企业在线春招:单次面试3000人
- shell下后台挂起
- MySQL 定时任务event 按天建表 并将前一天数据导入新建的表中并删除总表数据 实现分表功能
- java方法里面能改定时器的时间吗_Kafka 时间轮的原理和实现
- JAVA编程中异常问题处理方式的区别和分析
- Oracle P6培训系列:06创建项目日历
- 提问的智慧(学习笔记)
- c++ primer kindle_开箱测评掌阅iReader Ligtht悦享版阅读器,电纸书不止有kindle
- idea快速切换不同JDK版本
- 计算机辅助教学属于多媒体技术应用吗,多媒体技术在计算机辅助教学中的应用...
- 看牙分期软件3.10版本更新及功能介绍
- centos6使用devtoolset快速升级GCC版本4.8/5.2/8.3
- 5分钟外设学堂:耳机不响别慌,换个插头能救活!
- 关于eclips的一些使用