软件渲染器-软渲染
- 安装emscripten(如果网络好的话,非常简单,几行命令就完成),如果不想编译,可以直接使用"wasm_test"目录下的文件先观察运行结果
- 执行如下命令编译 emcc .\Matrix.cpp .\GraphicsDevice.cpp .\GraphicsLibrary.cpp .\main.cpp --preload-file model -O3
- 因为wasm文件不能在本地打开,所以需要启用webserver,然后使用浏览器访问index.html
- 安装http-server(需要先安装node):npm i -g http-server
- index.html的目录下执行命令:http-server
- 在浏览器中打开:localhost:8080
- 观看执行结果
强烈建议使用chromium内核的浏览器或者Firefox,我在chrome、新版Edge(chromium内核)和火狐中测试一切正常
最近我在学习计算机图形学的时候大量的上网翻书查阅资料,但是从网上和部分书籍里面看到的知识有些零散,所以我作此文章,将这些知识点串联起来。我的演示代码只是提供一个参考,希望读者通过阅读本文自己实现相应功能。本书主要是介绍 3D 渲染的流程和原理,所以有几乎没有对代码进行优化。如果要实现可用的高性能的渲染器,代码优化是必不可少的。
Windows | Linux |
---|---|
- 在第一部分中,我们先学习2D图像绘制的一些相关知识,我们将会学习最基础最核心的知识:在屏幕上绘制图案。只有能在屏幕上绘制图案,我们才能在3D的世界遨游。
- 在第二部分中,我们将会进入3D的世界,体验3D图形学的奥妙。
- 在第三部分中,我们将对前面章节所做出的渲染器进行功能扩展,使其使用起来更加的方便。本部分将会模仿OpenGL的渲染管线来扩充我们渲染器的功能,实现VBO、顺时针逆时针三角形的剔除、深度复位、像素复位、双缓冲、用矩阵完成坐标变换、纹理读取、漫反射光照数学模型等功能,最终让画面动起来。
- 第一部分:预备知识
- 第1章 在屏幕上绘制图案
- 像素
- 像素的抽象表示
- 通过控制不同像素的亮度来组合成不同图案
- 单独控制每个像素的亮度
- Windows和Linux上的程序实现
- 使用EasyX实现windows下的像素绘制
- 使用FrameBuffer实现Linux下的像素绘制
- CMake的简单使用
- 第2章 直线和三角形的绘制
- 线段的绘制
- 三角形的绘制
- 第3章 重心坐标插值
- 插值
- 重心坐标插值
- 一维重心坐标插值
- 二维重心坐标插值
- 重心坐标插值的规律
- 重心坐标插值在栅格化程序的优化
- 多属性的插值
- 二维纹理
- 第1章 在屏幕上绘制图案
- 第二部分:进阶知识
- 第4章 齐次坐标和透视投影
- 齐次坐标
- 透视投影
- 二维透视投影
- 三维透视投影
- 用齐次坐标表示透视投影
- 第5章 透视校正插值
- 空间三角形的绘制
- 绘制两个三角形拼接成一个正方形
- 仿射变换导致的错误
- 透视校正插值
- 附录
- 附录一
- 附录二
- 附录三
- 附录四
- 第6章 深度测试
- 画家算法
- Z-Buffer算法
- 第7章 裁剪
- 一些裁剪的基本知识
- 深度值的另外一种表示
- 近平面裁剪的必要性
- 裁剪的实现
- 附录
- 附录一
- 第8章 标准视锥体和设备坐标
- 设备坐标
- 设备坐标的标准化
- 将多边形裁剪到视锥体内部
- 一个核心功能完备的渲染器出炉了
- 第4章 齐次坐标和透视投影
- 第三部分:渲染器的功能扩展
- 第9章 渲染器功能升级
- OpenGL渲染管线简介
- 改造我们的渲染器
- 三角形剔除
- 屏幕刷新
- 上一帧残留数据清理
- 双缓冲
- 第10章 矩阵
- 透视投影矩阵
- 缩放矩阵
- 平移矩阵
- 旋转矩阵
- 坐标变换的一些技巧
- 完成旋转动画
- 第11章 走进图形学的大门
- 漫反射光照模型
- 纹理生成
- 模型读取
- 第9章 渲染器功能升级
目录 | 内容 |
---|---|
\3D 图形学知识汇编.pdf | 教学文档 |
\code\ | 配套代码 |
\old\ | 考古内容 |
\wasm\ | 移植到wasm的代码 |
\wasm_test\ | wasm的编译结果 |
之前我写了一些图形学的教程,但是经过验证,发现里面有一部分数学推导是错误的(深度测试的插值算法,在齐次空间中裁剪的解释和证明),甚至深度插值的错误会导致错误的渲染结果(并且这个错误还不太明显,所以我一直没发现自己的错误),为此我重新修订了绝大部分的内容,这次经过我一个人(还是有点势单力薄)的努力推导,修复了上述的错误,整个教程的结构也进行的大改。但是我知识有限,可能还有很多错误存在其中,如果有读者能找到错误,还望不吝赐教。
之前的代码和文章内容被我移动到了old目录,有兴趣的同学可以考古一下。