推荐直接阅读博客原文,更新更及时,阅读体验更佳

十天自制软渲染器」这个标题我承认标题党了.在对图形学一无所知的情况下想十天自制一个软渲染器,就好似一节课没上过却试图一个晚上看完《30 天精通 C++》然后第二天早上八点考试得满分一样,我承认世界上有这种天才,但很可惜我不是。

就像前文所说,本系列造的轮子都是站在巨人的肩膀上完成的,需要对相关知识有一定的了解和学习,如果你是一个图形学大牛,这种软渲染器肯定是不屑于做的;如果你刚刚进入图形学的大门,造一个软渲染器的轮子,非常利于你巩固自己的底层知识。

本文主要(90%)参考 ssloy 大神的 tinyrenderer 教程,零依赖实现一个软渲染器,通过这个教程可以实现一个简易版本的 OpenGL2.0(rendering pipeline 只支持 Vertex ShaderFragment Shader 两种自定义 Shader 类型),了解 OpenGL 这类图形学 API 在底层是如何工作的。

我自己造的轮子是 toyRenderer,在 tinyrenderer 的基础上加入了大量的注释并按自己的理解优化了部分代码(不排除有反向优化),如果大家对 tinyrenderer 感兴趣,可以参考一下我的实现和我现在写的这个教程,点个 star 就更好不过了~

本专栏的目录结构和 tinyrenderer 保持一致,方便大家对比阅读。

前置知识

要想看懂 tinyrenderer 的代码,需要有一定的知识储备,下面是我在造轮子时的一些总结,大家学习前可以参考一下。

1.数学

对于图形学来说,数学是一道绕不过的坎儿;对于这个软渲染器器轮子来说,并没有涉及太多的数学内容,我个人总结如下:

1.1 高中数学

造一个软渲染器需要你还记得一些高中几何的内容,难度都不大,比如说直线的坐标公式,重心坐标等。

1.2 微积分

微积分其实只有少量的涉及,原教程里有一点点梯度的内容,个人感觉对整体学习进度影响不大。

1.3 线性代数

线性代数涉及的内容比较多,从最简单的向量,再到各种坐标系变换,都需要对线性代数有比较扎实的理解。

如果你线性代数都忘的差不多了,这里我推荐 3Blue1Brown 的教程——《线性代数的本质》,这是我见过最好的线性代数入门教程了。而且图形学里涉及的矩阵变换绝大部分都是三维空间的,基本上看完这门课就可以上手图形学的学习了。


3Blue1Brown——线性代数的本质

2.图形学

图形学入门课程我只推荐一个,闫令琪大神的《GAMES101-现代计算机图形学入门》


GAMES101-现代计算机图形学入门

闫令琪大神有多厉害我就不多介绍了,最关键的是 GAMES101 优点太多了:

  • 全中文讲解,大大降低国内小伙伴的学习门槛
  • 课程非常新,2020 年初才开课,不会存在课程/教案过时的情况
  • 知识点全面,正如课程名「现代图形学入门」,本课程不但讲了经典的光栅化成像,还讲了光线追踪等相对较新较前沿的内容

学完这门课可以收获什么呢?比如说 2077 的图形设置面板你都知道是啥意思了


2077 图形设置面板

如果跟着这门课学下来,其实课下作业就会完成一个小的软渲染器,但由于我是后期才加入学习的,所以作业也没有跟着做,经过搜索发现 tinyrenderer 这个教程推荐的人最多,所以最后参照这个教程实现了自己的软渲染器。

闫老师的是视频教程,大家可以配合他的 PPT 学习。如果习惯看书,我这里推荐两本,一本是大名鼎鼎的虎书《Fundamentals of Computer Graphics 4th Edition》,另一本是《Real Time Rendering 4th》,都是非常经典非常有名的书籍。


Graphics Books

这两本书国内都没有引进,我这里有英文版的 PDF,大家可以关注我的公众号「卤蛋实验室」后回复「图形学」获取下载链接。

3.C++

本渲染器是用 C++ 写的,但用到的都是基础语法,稍微高级点儿的知识就是模版编程和操作符重载。个人认为只要有其他语言基础,看个半小时的 C++ 语法就可以上手实践了。

如果上面的三个知识点都掌握的差不多了,我打保票十天内肯定能写出一个软渲染器;如果没有掌握好(尤其是图形学基础知识),十天内实现是有些够呛。废话不多说,我们先去搭环境吧!


本教程要做的是一个零依赖软渲染器,所以依赖的环境就是 C++ 的开发环境。

注:零依赖意味着这个项目不依赖任何第三方库,软渲染意味着所有计算都是在 CPU 侧进行的,没有 GPU 参与

C++ 环境搭建配置有多种方法,最快捷的方式就是直接用高度集成的 IDE,win 电脑可以用 Visual Studio,Mac 用户可以用 Xcode。当然你也可以用 CMake + VSCode 搭建 C++ 运行环境。

我这个人很懒,平常开发 Xcode 用的又比较多,不想多折腾了,所以直接用 Xcode 构建项目了,小伙伴们千万不要学习我这种坏习惯。

Xcode 创建 C++ 项目

1.新建项目

1.Xcode 创建 C++ 项目非常简单,启动 XCode 后点击 Create a new Xcode project,创建一个新项目

2.在跳出的弹框里选择 Command Line Tool,然后点击 Next

3.在新的弹窗里填写好 Product NameLanguage 选择 C++,然后点击 Next

4.在新的弹窗里选择项目路径,点击 Create 创建项目

到这里项目就创建好了。

2.配置相对路径

软渲染器需要对硬盘上的一些文件做一些 IO 操作,这时候就需要配置项目的相对路径。

首先按照 Product -> Scheme -> Edit Scheme 的次序,打开一个弹窗。

然后在弹窗里勾选 Using custom working directory,并选择项目文件所在路径就可:

3.把源代码拖进去

因为本项目是零依赖的,渲染方式是根据源代码生成一张 tga 格式的图片。因为我们是来写软渲染器而不是写图片编码器的,所以直接把源代码里的 tgaimage.htgaimage.cpp 拖到我们的项目工程里就可以了。

加上 main.cpp,现在的工程目录里只有三个文件

.
├── main.cpp
├── tgaimage.cpp
└── tgaimage.h

然后我们在 main.cpp 里写一些简单的代码——创建一个 100x100 的图片,在 (52, 41) 这个坐标上画一个红的的点(rgb(255, 0, 0)

#include "tgaimage.h"

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();
 image.write_tga_file("output/lesson00.tga");
 return 0;
}

点击 Xcode 左上角三角形的 build 按钮,如果编译成功并在 output 这个文件夹下生成一张名为 lesson00.tga 的图片,就说明环境配置成功了!
(红点只有一个像素大,看不清可以点击查看大图)

今天在图片上画了一个点,明天我们就学习一下如何高性能的画一条直线。


欢迎大家关注我的微信公众号:卤蛋实验室,目前专注前端技术,对图形学也有一些微小研究。

也可以加我的微信 egg_labs,欢迎大家来撩。

【十天自制软渲染器】DAY 01:图形学学习建议与环境搭建的更多相关文章

  1. [小北De编程手记] : Lesson 01 - Selenium For C# 之 环境搭建

    在我看来一个自动化测试平台的构建,是一种很好的了解开发语言,单元测试框架,自动化测试驱动,设计模式等等等的途径.因此,在下选择了自动化测试的这个话题来和大家分享一下本人关于软件开发和自动化测试的认识. ...

  2. Django 01 django基本介绍及环境搭建

    Django 01 django基本介绍及环境搭建 #http服务器 #用来接收用户请求,并将请求转发给web应用框架进行处理 #Web应用框架 #处理完请求后在发送给http服务器,http服务器在 ...

  3. 03 Mybatis:01.Mybatis课程介绍及环境搭建&&02.Mybatis入门案例

    mybatis框架共四天第一天:mybatis入门 mybatis的概述 mybatis的环境搭建 mybatis入门案例 -------------------------------------- ...

  4. 流畅的python第十五章上下文管理器和else块学习记录

    with 语句和上下文管理器for.while 和 try 语句的 else 子句 with 语句会设置一个临时的上下文,交给上下文管理器对象控制,并且负责清理上下文.这么做能避免错误并减少样板代码, ...

  5. JDK1.8源码分析01之学习建议(可以延伸其他源码学习)

    序言:目前有个计划就是准备看一下源码,来提升自己的技术实力.同时现在好多面试官都喜欢问源码,问你是否读过JDK源码等等? 针对如何阅读源码,也请教了我的老师.下面就先来看看老师的回答,也许会有帮助呢. ...

  6. 《30天自制操作系统》学习笔记--Mac环境搭建

    弄了三天了,终于弄好了,先说结果,就是作者在网站上放了os x的工具(hrb.osask.jp,也有linux下的工具,可以自己去下载),也就是说我白忙活了三天... 再说一下这几天都干啥了,主要是想 ...

  7. 用 windows GDI 实现软光栅化渲染器--gdi3d(开源)

    尝试用windows GDI实现了一个简单的软光栅化渲染器,把OpenGL渲染管线实现了一遍,还是挺有收获的,搞清了以前一些似是而非的疑惑. ----更新2015-10-16代码已上传.gihub地址 ...

  8. Restful framework【第十篇】响应器(渲染器)

    基本使用 -响应器(一般用默认就可以了) -局部配置 renderer_classes=[JSONRenderer,] -全局配置 'DEFAULT_RENDERER_CLASSES': ( 'res ...

  9. 渲染器 Shader BitmapShader

    渲染模式: tileX tileY:The tiling mode for x/y to draw the bitmap in.   在位图上 X/Y 方向 瓦工/花砖/瓷砖 模式 CLAMP  :如 ...

  10. Restful API学习Day5 - DRF之限制 分页 解析器和渲染器

    参考文档: Django REST framework基础:认证.权限.限制 Django REST framework基础:分页 Django REST framework基础:解析器和渲染器 一. ...

随机推荐

  1. wordpress上传图片时重命名--修改插件时遇到的一些问题

    wordpress是用php语言开发的博客平台,它扩展性强,容易扩展,很适合拿来做二次开发. 1,问题由来 本周五,我在浏览公司的网站(基于wordpress开发)时发现,网站首页上有两篇文章的缩略图 ...

  2. expdp导出数据库

    源地址:http://www.cnblogs.com/luluping/archive/2010/03/16/1687093.html 使用EXPDP和IMPDP时应该注意的事项: EXP和IMP是客 ...

  3. iOS NSNotificationCenter(消息机制)

    转自:http://blog.csdn.net/liliangchw/article/details/8276803 对象之间进行通信最基本的方式就是消息传递,在Cocoa中提供Notificatio ...

  4. Uva_11462 GCD - Extreme (II)

    题目链接 题意: 给定一个n, 求:GCD(1, 2) + GCD(1, 3) + GCD(2, 3) + …… + GCD(1, n) + GCD(2, n) + …… + GCD(n-1, n); ...

  5. jquery 仅仅读

    大家都理解这是什么,正常的写法例如以下: if (status == true) { $("#minDelistStr").val(totalAmount);// 去掉首部的&qu ...

  6. 结队编程-基于gui的四则运算生成器

    成员:卢少锐 201421123027.刘存201421033023 coding.net地址 1.需求分析:除了实现四则运算的功能外,还添加了计时器功能和语言选择功能 2.程序设计:这次作业是基于上 ...

  7. 在C++中怎么判断一个double型数据的小数点部分是否为零

    例:double sf = 123.123: 这里我们怎么判断sf小数点部分是否为零,可以直接用原数减去将sf强制转换后的整数是否为零来判断. if((sf - (int)sf) == 0),则说明s ...

  8. 解决tomcat端口被占用:Port 8005 required by Tomcat v7.0 Server at localhost is already in use

    问题提示8005端口被占用 首先:在cmd下,输入  netstat   -ano|findstr  8005 (什么端口号被占用就输入什么端口号),回车 再输入 taskkill  /pid  20 ...

  9. 网络-Cisco

    选择题(每题2分,共20分) 1.192.168.11.1/23的网络地址是(  A) A.192.168.10.0 B.192.168.11.0 C.192.168.10.255 D.192.168 ...

  10. System.ServiceModel.AddressAccessDeniedException

    发生了 System.ServiceModel.AddressAccessDeniedException   HResult=0x80131501   Message=HTTP 无法注册 URL ht ...