SoftRenderer
Android、iOS、Unity、Unreal都能够运行,不应用任何图形库接口,纯代码来实现渲染管线,比起学习Opengl等更好的了解渲染管线,代码中都有具体注解。(感觉乏味麻烦给个star)
平台 | 语言 | 工程门路 | 成果 |
---|---|---|---|
https://github.com/wlxklyh/So… | 2020-09-07-15-07-21.png | ||
https://github.com/wlxklyh/So… | 2020-09-16-20-43-34.png | ||
https://github.com/wlxklyh/So… | 2020-09-17-12-49-37.png | ||
https://github.com/wlxklyh/So… | 2020-09-17-12-49-41.png |
前言
程序员的三大浪漫,编译原理、图形学、操作系统,所以我也有一种情节,想去学图形学。而后我拿起图形学的书,看完了第一章 似懂非懂,而后书又沾灰了。过了一段时间工作上遇到渲染管线相干的问题,而后又开始去网上看博客,看完之后也是似懂非懂,你是否也有跟我一样的经验了?Opengl的接口背地是什么呢?渲染管线怎么用程序表白。于是我找到一个skywind3000的软渲染器,而后本人再实现一遍,这样之后对渲染管线的了解更加粗浅了。
通过代码来理解渲染管线 不调用图形库,ado、ios、unity、unreal都能够运行
一、渲染管线
渲染管线流程图
/*
* 1、最简略的渲染流水线:
* 分成CPU阶段和GPU阶段
* +--------------+ +-------------+
* | | | |
* | CPU +-----> GPU |
* | | | |
* +--------------+ +-------------+
*
* 2、其中CPU阶段就是利用阶段 GPU阶段包含了几何阶段和光栅化阶段
* +--------------+ +-----------------+ +----------------+ +----------------+
* | | | | | | | |
* | 利用阶段 +-----> 几何阶段 +--> 光栅化 +---> 像素解决 |
* | | | | | | | |
* +--------------+ +-----------------+ +----------------+ +----------------+
*
* 3、几何阶段:
* +--------------+ +-----------------+ +------------------+ +-------------+ +-------------+
* | | | | | | | | | |
* | 顶点着色器 +-----> 曲面细分着色器 +--> 几何着色器 +---> 裁剪 |--> 屏幕投射 |
* | | | | | | | | | |
* +--------------+ +-----------------+ +------------------+ +-------------+ +-------------+
*
* 4、光栅化阶段:
* +--------------+ +--------------+ +------------------+
* | | | | | |
* | 三角形遍历 +-----> 三角形设置 +--> 片元着色器 |
* | | | | | |
* +--------------+ +--------------+ +------------------+
*
* 5、像素解决阶段:
* 深度测试ZTest
* 颜色混合
* 模板测试(模板缓冲)
*
工程调用堆栈
* 【阐明】:上面的代码依据下面的流水线来解说和划分
* 绘制调用堆栈:
* HScreenDevice::Draw
* HScreenDevice::ClearScreen 清屏
* HCube::Draw Cube绘制
* HCube::DrawBox 立方体绘制
* HCube::DrawPlane 长方形绘制
* HCube::DrawTriangle 三角形绘制
*
* HCube::UpdateMVPMat() 1、更新MVP矩阵 -|
* HCube::vert() 2、顶点着色器 之后就是裁剪空间坐标了 |
* 3、曲面细分着色器 几何着色器【TODO】 |--->几何阶段
* HCube::CheckTriangleInCVV() 4、裁剪 查看在不在裁剪空间外面 |
* HCube::CalTriangleScreenSpacePos() 5、屏幕投射 -|
*
* HCube::InitTriangleInterpn() 1、插值初始化 前面透视校对用 -|
* Triangle::CalculateTrap() DrawTrap DrawScanline 2、三角形设置、三角形遍历 失去片元信息 |--->光栅化阶段
* HCube::frag 3、片元着色器 -|
*
* ZTest Zwrite
二、工程阐明
Ado
- 根本介绍:
用了ImageView来显示HScreenDevice的buffer,次要去看FirstFragment这个的代码。
- 如何关上工程:
用AndroudStudio关上
- 主代码:
具体看代码的正文:
https://github.com/wlxklyh/So…
iOS
- 根本介绍:
用了UIImage来显示HScreenDevice的buffer,次要去看SoftRenderer.h这个的代码。
- 如何关上工程:
xcode关上工程
- 主代码:
具体看代码的正文:
https://github.com/wlxklyh/So…
unity
- 根本介绍:
MainScene上面有个Canvas Canvas有个Image,MainCode.cs脚本每帧会调用软渲染器的Draw,而后把FrameBuffer数据取出来 调用Unity的Texture2D.SetPixel接口 而后用Image把这个Texture2d显示进去。
- 如何关上工程:
Unity关上工程 MainScene
- 主代码:
具体看代码的正文:
https://github.com/wlxklyh/So…
Unreal
- 根本介绍:
UMainUICpp外面有个MainImage 每帧会把软渲染器的数据显示到MainImage中,除此之外,没应用Unreal的其余接口。
- 如何关上工程:
关上工程,关上MainUILevel关卡,而后运行就会如下显示
- 主代码
具体看代码的正文:
https://github.com/wlxklyh/So…
三、TODO
后续要用C++跨平台。
- 三角形裁剪欠缺
- 几何着色器和片元着色器欠缺
- BRDF光照模型
- 模板测试
附
欢送加微信探讨(备注Gituhb)
个人简介:高级开发工程师,趣味和畛域(Unity、Unreal、cocos creator、安卓终端开发、ios终端开发、音视频开发、图形学),欢送加W:wlxklyh 探讨问题。(欢送star:https://github.com/wlxklyh/So…)
个人简介:高级开发工程师,趣味和畛域(Unity、Unreal、cocos creator、安卓终端开发、ios终端开发、音视频开发、图形学),欢送加W:wlxklyh 探讨问题。(欢送star:https://github.com/wlxklyh/So…)
发表回复