个人作品

合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下

纯软件算法实现 3D 渲染(by 桌子)

大部分说明在源码中可以看见,这个项目是在尝试做软件渲染器时边想边做的,模仿了很多 OpenGL 的 API 定义(类似 OpenGL 运行库),然后在 main.cpp 里面写用户自己的模型及贴图代码。

软件运行可以得到如下的效果:

主要实现的功能:

  • 一些简单的数学运算(矩阵相乘,向量叉乘等)
  • 使用扫描线多边形填充算法绘制多边形
  • 线性插值(linear interpolation)
  • 透视校正插值(perspective correct interpolation)
  • 深度测试(用于消隐)

一些我想到的但是暂时没实现的功能:

  • 不支持 ddx 和 ddy,所以没有 Mipmap,因为实现起来比较麻烦。
    ddx 和 ddy 是指在屏幕空间上求 vbo 的偏导数。真正的 GPU 绘制的时候是在屏幕同时绘制多个像素,GPU 并行处理能力很强。
    比如当前 GPU 同时在屏幕上绘制四个点 (x,y), (x+1,y), (x,y+1), (x+1,y+1) 分别记为p1、p2、p3、p4,设前面三个点 p(即不包含点 (x+1, y+1))的纹理坐标分别为(u1,v1), (u2,v2), (u3,v3),则点 p1 上的:
    ddx(u) = (u2 - u1) / 1
    ddy(u) = (u3 - u1) / 1
    这个计算值可以用来计算 Mipmap,同时现在主流游戏引擎上面的法线贴图都是用 MikktSpace 计算切线空间,也需要求偏导数,但是对我们现在的这个渲染器来说,这些可以暂时不考虑。

编译环境:

  • Visual Studio 2019
  • EasyX_20190529(beta)

完整源码:

如果提示错误“error MSB8020: 无法找到 Visual Studio 2019 (v142) 的生成工具”,请修改项目配置。在项目上右键 -> 属性 -> 配置属性 -> 常规 -> 平台工具集,选择自己安装的 VS 版本即可。如下图:

作者:桌子
QQ:775697360
邮箱:775697360@qq.com
github:https://github.com/yangzhenzhuozz

分享到

添加评论