我的软件渲染器终于初步完成了~

记录一个大好事:在 2021年第一个月的上旬,我的软件着色器终于初具雏形了~
中间参考了 很多 资料

最初是 知乎上的系列教程

https://zhuanlan.zhihu.com/p/141210744

这个教程是基于 OpenGL ,右手坐标系实现的。是翻译的 github 上一个叫做 tinyrender 的 教程。结合原版食用效果更佳~
原版 github 上的图片都 看不到了,所以结合这篇知乎上的教程看,也很帮助人理解。

当时觉得比较困难的地方是 矩阵的推导,看这篇教程的时候完全没有去理解。后来觉得这样不行,翻出来在家里吃灰的两本书仔细参考:

第一本是<<3D数学基础:图形与游戏开发>> .这本书重点看了矩阵推导的部分。
由于一开始我看的教程是 基于 右手坐标系的 OpenGL 习惯的教程,而这本书所有地方全都是相反的,我去花时间掰顺了这方面的知识。在矩阵计算时候分为两套:

标准一:
左手坐标系 , 列矩阵(column major), 行向量, 向量 乘 Matrix 时 向量在左侧, 对向量做矩阵变换的时候 NewVertex = SrcVertex x Matrix1 x Matarix2 …

标准二:
右手坐标系,行矩阵(列矩阵的转置), 列向量, Matrix 乘 向量时 向量在右侧, 对向量做矩阵变换的时候 NewVertex = … x Matrix2 x Matrix1 x SrcVertex

上面值得一提的是 列矩阵,行矩阵。书里面的所有推导都是基于标准一的,所以那些结论中的 变换矩阵,在转换到 标准二的时候,都需要做转置!这些都是我亲自用笔来计算 得出的结论,如果不做转置那么结果整个就是错误的!

<<3D数学基础:图形与游戏开发>> 的推导部分虽然讲得很好,但是矩阵变换的部分却没有和实践联系起来。另一本书弥补了这一段的空白:<<3D 游戏大师变成技巧(上册)>>。

这本书从第6章第3节开始,和 整个第7章,就是在 讲解 矩阵的推算的。并且很有意思的是 给我感觉仿佛讲了两边。我当时的阅读顺序是先看的第 7 章矩阵推导的部分, 反过头来再看 第6章矩阵推导的部分,两部分结合起来,就觉得对矩阵推导成竹在胸了。

之前在看知乎上的材料的时候,我搭建了一个 基于 SDL2 的工作台,用于能够方便的 drawPixel(). 矩阵推导虽然我不是在知乎的链接上看明白的,但是 绘制直线 Bresenham 和 填充三角形的 线扫描算法,我是在那边看懂的。结合自己的 SDL2 的框架,先实现了一个简单的 2D 光栅渲染器。

在此之后,经过反复阅读上面两本书的矩阵推导部分,最后把矩阵变换录入到 我的 代码里。为了实现这个程序,我自己写了 基于 template 的vector 和 matrix , 重载了大部分常用的计算。其中有个很坑的地方: 在做 Matrix 和 Matrix 相乘的时候,我把 累积的 和 用 int 型保存了,但是这个问题在 Matrix 乘 Vector 的时候没有犯错。导致有一段时间,我的 Matrix 累成之后的 MVP 矩阵 和 我的 点坐标相乘结果是错误的,然而 每个矩阵 单独 和 点坐标 依次做乘法是正确的。这个问题让我查了三个中午。

准备好了 SDL2 绘点工作台,简单的 向量矩阵数学库,录入了 所有的 坐标变换矩阵公式之后,填充上一些 testcase 的顶点坐标信息(比如自己手填一个 Cube 的所有顶点坐标),一个 简单的软件光栅渲染器 就完成了!

下一步要做的是 面剔除,根据投影区域做剪裁,纹理采样,片段插值 ,增加光照等等。我要尽早挨个完成它们。

经过了这么 一个过程,渲染管线不再神秘,之前觉得 Vertex Shader 和 Fragment Shader 如何与宿主通信,以及这两个 shader 之间如何通信 这件事 也不再神秘。

我会在工作之余尽快把剩下的事情做完,摸透其中的原理,争取做到在公司内部做一次技术分享~

github 链接贴在这里

https://github.com/yunyou730/spinning

这个 repo 里面是一个 xcode 的 workspace .这个 workspace 里面的 AnyToy 工程无视~ tinyrender 工程是我看知乎帖子时候实现的版本,当时很多细节还没摸透。ayyrender 是我自己实现的版本,这个Demo 里面用到的代码每个字 都是自己理解之后手敲的,很有成就感。毕竟一个 从 2016年的时候就想做的事情,终于在 2021年开年有眉目了。在基础好的同学眼里看可能没什么,但是我已经是当年自己眼里的大神了~

我会继续完善它,陆续再记录一些实现细节吧

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值