# Hana-SoftwareRenderer
## 关于我实现的软渲染器
![](https://github.com/DrFlower/Hana-SoftwareRenderer/blob/main/README_IMG/HANA-SoftwareRenderer_final_screenshot.png)
开发语言:C++
开发环境:Windows 10 - Microsoft Visual Studio 2022 17.2.1
### 控制
- 按W或S可以切换场景
- 长按鼠标左键可以旋转摄像机
- 长按鼠标右键可以移动摄像机
- 按空格键可以复位摄像机
- 按A或D可以旋转灯光方向
- 按E可以切换阴影开关
- 按Q可以切换Shader
## 什么是软渲染
![](https://github.com/DrFlower/Hana-SoftwareRenderer/blob/main/README_IMG/HANA-SoftwareRenderer_GPU_Pinpline_Stage.png)
在了解什么是软渲染之前,我们首先要明白,在正常渲染流程中,有很多阶段是由GPU固定实现的,只有部分阶段可供我们进行配置和编程,那么对于不可修改的阶段,我们很多时候只能从书本上通过理论知识去了解片面的内容,对于更加详细的细节想必是抱有一定的疑问的。
写软渲染器就是我们自己用代码去模拟这个流程,通过自己动手实现一遍,去彻底理清GPU究竟帮我们做了什么步骤,这就是我们写软渲染的学习目的(当然,只是在理解基本步骤上)。
软渲染的实现过程大致是这样:
![](https://github.com/DrFlower/Hana-SoftwareRenderer/blob/main/README_IMG/HANA-SoftwareRenderer_implementation_process.png)
我们只借助一个画像素点的API,其余一切自己实现,最终达到最后一张图片的效果,这是我们的实现目的。
## 前置知识
除了基本的C++基础外,写软渲染是需要具备基本的图形学基础的,在这我推荐以下这些资料:
### GAMES101
[GAMES101-现代计算机图形学入门-闫令琪](https://www.bilibili.com/video/BV1X7411F744)
目前图形学入门中文视频课程中的最强课程
看完GAMES101前9课即可,后续课程与实现光栅化的渲染器关系不大。前9课程已经清晰讲过向量、矩阵、变换、渲染管线、着色等知识,学习完毕后便具备动手实操的理论知识。然后建议完成作业1至作业3,作业提供了一个比较完整的框架,其中某些关键函数会留空,让我们根据课堂内容自行去实现,并得出要求的结果,其中涉及到MVP矩阵构建、包围盒、三角形内外判断、深度缓冲、纹理映射、凹凸映射等关键步骤,这个时候我们对渲染流程已经有比较明确的认识了。
### 《Unity Shader入门精要》
另外推荐结合《Unity Shader入门精要》一起阅读,不需要读完整本书,看到第七章基础纹理即可,书本前部分内容与GAMES101前面课程高度重合,后面会讲一些shader相关的东西,因为我们需要在软渲染器上实现可编程的渲染管线,包括vertex shader和fragment shader,这要求我们对shader本身有一定的理解,个人认为跟着这本书在unity上动手实现一下blinn phong和纹理等内容,然后带着一些流程上的疑问,例如vertex shader之前发生了什么?为什么vertex shader一定要输出裁剪空间坐标?vertex shader和fragment shader之间又发生了什么?等问题我们再回头实现我们的软渲染,相信理解会更加透彻。
[《Unity Shader入门精要》- 第四章 数学基础](https://candycat1992.github.io/unity_shaders_book/unity_shaders_book_chapter_4.pdf)
入门精要的第四章数学内容是免费公开的,上面是作者Github中给出的第四章数学篇链接,个人认为这是很简洁很易懂的图形学数学基础资料,非常适合新手,我也看过诸如《3D数学基础 图形和游戏开发》这类专业数学工具书,但内容不够精炼,翻译过于生硬,且表达方式确实不易于国人理解,不适合新手入门。如果因为GAMES101是视频,翻阅起来不方便,那么配合这里的数学篇一起阅读即可,基本满足我们实现基础的软渲染所需的数学知识,美中不足的是这里都没涉及到逆矩阵的计算,对于任意n阶方阵的逆矩阵计算,稍微有点复杂,这是需要我们自行实现的,需要另外翻阅资料去了解。
### 3Blue1Brown - 线性代数的本质
[3Blue1Brown - 线性代数的本质 - 系列合集](https://www.bilibili.com/video/BV1ys411472E)
相信不少人在初学的时候跟我一样,虽然知道了矩阵的各种性质和运算,但是仍然不能理解矩阵里这些神奇的数字是究竟是怎么帮助我们完成了变换的,这个系列的视频用动态的方式生动地演示了,矩阵是如何在空间中作用的。
## 工程实践的参考资料
### TinyRenderer
![](https://github.com/DrFlower/Hana-SoftwareRenderer/blob/main/README_IMG/HANA-SoftwareRenderer_tinyrenderer.jpg)
[Tiny Renderer or how OpenGL works: software rendering in 500 lines of code](https://github.com/ssloy/tinyrenderer)
国外大佬的一个开源教程,通过500行代码实现一个软渲染,让你去理解诸如OpenGL这类图形API内部是如何工作的。
如果说GAMES101带你完成了软渲染的关键步骤,那么TinyRenderer将会带你从零去构建一个软渲染,实际上他的实现过程就是上文配图`软渲染实现过程`的过程。
建议可以搭配以下文章一起食用,不错的讲解:
[Shawoxo - 从零构建光栅器,tinyrenderer笔记(上)](https://zhuanlan.zhihu.com/p/399056546)
[Shawoxo - 从零构建光栅器,tinyrenderer笔记(下)](https://zhuanlan.zhihu.com/p/400791821)
有同学可能会提出疑问,既然TinyRenderer教程教我们从0开始构建软渲染,那么我们是不是可以跳过GAMES101直接从TinyRenderer入手呢?实际上这个系列教程主要是教你工程实践,对于图形学本身所需要的理论知识是讲得没那么详细的,如果你跟我一样并不是什么天赋异禀的选手,建议还是从GAMES101开始看起。
### 知乎热贴 - 如何开始用 C++ 写一个光栅化渲染器
[如何开始用 C++ 写一个光栅化渲染器?](https://www.zhihu.com/question/24786878)
这个贴集中了各路大佬提供的实现思路以及他们的开源demo,可以选一个自己喜欢的进行参考,其中对我帮助最大的是zauonlok的回答:
[如何开始用 C++ 写一个光栅化渲染器? - zauonlok的回答](https://www.zhihu.com/question/24786878/answer/820931418)
![](https://pica.zhimg.com/80/v2-5d84718cdd38cb31a49b796603df84a5_1440w.jpg?source=1940ef5c)
zauonlok给出了功能很强大的软渲染实现示例,并在回答中指出了TinyRenderer中一些可改进的地方,并且对于一些容易忽略的细节盲点,在回答中和评论区中也给出了答疑和参考。我实现的软渲染也是在TinyRenderer基础上再参考zauonlok给出的开源软渲染提取出部分内容出来结合改进。
**以上提到的资料中,GAMES101以及TinyRenderer为重要资料,其他为辅助资料**
## 实现过程
我们先根据TinyRenderer教程来实现以下步骤
1. 利用画点API实现画线
2. 利用画线API实现画实心三角形
3. 实现OBJ模型数据读取,根据数据画出模型三角形面
4. 利用zbuffer建立正确的深度数据,从而正确地绘制模型的前后关系
5. 实现透视投影
6. 实现摄像机的观察变换
7. 实现基础Shader,包括基础光照模型、纹理映射、切线空间下的法线映射等。
8. 实现ShadowMap
![](https://github.com/DrFlower/Hana-SoftwareRenderer/blob/main/README_IMG/HANA-SoftwareRenderer_tinyrederer_final.png)
不出意外你将会得到跟我上图一样的效果,此时基本的软渲染器已经完成了。
这个时候,还存在很多可改进优化的地方,下面列举以下我做的优化。
### 改进1:实时渲染和摄像机控制
第一大痛点就是,TinyRenderer是把渲染结果输出到tga图片上的,相当于是个离线渲染,有时候渲染的问�
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
【项目资源】: 包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。 包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】: 所有源码都经过严格测试,可以直接运行。 功能在确认正常工作后才上传。 【适用人群】: 适用于希望学习不同技术领域的小白或进阶学习者。 可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】: 项目具有较高的学习借鉴价值,也可直接拿来修改复刻。 对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】: 有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 鼓励下载和使用,并欢迎大家互相学习,共同进步。
资源推荐
资源详情
资源评论
收起资源包目录
基于C++实现的一个光栅化软渲染器.zip (55个子文件)
资料总结
README_IMG
HANA-SoftwareRenderer_tinyrenderer_switch_shader.gif 1.09MB
HANA-SoftwareRenderer_top_image.png 1.48MB
HANA-SoftwareRenderer_tinyrenderer_orbit_camera.gif 4.8MB
HANA-SoftwareRenderer_final.gif 7.88MB
HANA-SoftwareRenderer_GPU_Pinpline_Stage.png 127KB
HANA-SoftwareRenderer_top_image.webp 130KB
HANA-SoftwareRenderer_final_screenshot.png 124KB
HANA-SoftwareRenderer_tinyrederer_final.png 61KB
HANA-SoftwareRenderer_implementation_process.drawio 430KB
HANA-SoftwareRenderer_tinyrenderer.jpg 22KB
HANA-SoftwareRenderer_implementation_process.png 75KB
Hana-SoftwareRenderer
color.h 540B
matrix.h 4KB
gameobject.h 767B
tgaimage.cpp 11KB
model.h 1004B
renderbuffer.h 468B
IShader.h 4KB
scene.cpp 4KB
platform.h 1KB
assets
african_head
african_head_nm_tangent.tga 2.87MB
african_head_spec.tga 977KB
african_head.obj 190KB
african_head_nm.tga 3.82MB
african_head_read_me.txt 439B
african_head_diffuse.tga 2.67MB
african_head_SSS.jpg 7KB
diablo3_pose
diablo3_pose.obj 417KB
diablo3_pose_spec.tga 2.24MB
diablo3_pose_diffuse.tga 2.83MB
diablo3_pose_nm.tga 3.36MB
diablo3_pose_nm_tangent.tga 2.85MB
color.cpp 2KB
Hana-SoftwareRenderer.vcxproj 8KB
Hana-SoftwareRenderer.vcxproj.filters 3KB
win32.cpp 13KB
camera.h 1KB
renderbuffer.cpp 2KB
camera.cpp 5KB
scene.h 4KB
main.cpp 4KB
Hana-SoftwareRenderer.sln 1KB
graphics.cpp 13KB
model.cpp 3KB
vector.cpp 471B
mathapi.h 91B
vector.h 4KB
IShader.cpp 6KB
graphics.h 268B
maths.h 881B
gameobject.cpp 1KB
maths.cpp 6KB
tgaimage.h 2KB
.gitignore 6KB
README.md 14KB
共 55 条
- 1
资源评论
- D4C5032024-03-10资源质量不错,和资源描述一致,内容详细,对我很有用。
- m0_675203722024-04-22资源很实用,对我启发很大,有很好的参考价值,内容详细。
妄北y
- 粉丝: 1w+
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功