固定管道软件渲染器

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sixdaycoder/article/details/77853122

缘起

童年时候“丰富”的玩游戏的经验让我顺便对计算机产生了浓厚的兴趣。
不像贴吧十几岁就开始写引擎的大神们,我对游戏开发是一窍不通的。
而我巧不巧的又是一个偏执的人,总认为所谓的“内功不深厚”是做不好一件事情。游戏开发的内功大概有很多,可是我想计算机图形学作为游戏开发的内功应该不会有人介意吧?
本科期间,并没有任何课程是和计算机图形学的,网上的课程大都是用OpenGL或者DirectX来讲解,原理没怎么记住,API倒是记了一堆。
那怎么办?
问过很多大神,都说,那你就写一个软件渲染器吧!
我就入坑了。

网上的教程其实也不算少,我以skywind3000前辈的版本为模板,写了一个C#版本的固定管道的软件渲染器。

选用C#好处多多,.NET封装了GDI使得绘图颇为方便,C#语言用起来也比较舒服,这个项目不需要额外的配置,直接下载下来使用VS2010以上的版本打开即可。

概述

  • 基于左手系,和D3D一致。
  • 线框模式的绘制使用Bresenham算法
  • 相机基于UVN模型
  • 灯光基于平行光,使用HalfLambert计算漫反射,BlinnPhong计算高光反射
  • 实现简单背面消隐BackFaceCulling
  • 深度缓冲和透视投影矫正的应用

目录结构

直接从MainWindow.cs的代码开始读,有详细的注释。

Math3D文件夹:

  • Math3D
    • Color4 : 颜色类,可以方便的和System.Drawing.Color进行转换。
    • Matrix4X4 : 4X4矩阵,在该类的static方法中实现旋转,平移,放缩,透视投影,相机变换矩阵的构造。
    • Vector3 : 三维向量类.

RenderStruct文件夹:

  • RenderStruct
    • Camera : 基于UVN模型的相机类
    • Light : 基于平行光的光照类(未完成)
    • Mesh : 模型网格类,主要包含vertexList和indicesList
    • Transform : 静态类,包含坐标变换的变换算法
    • Vertex : 顶点类,包含顶点坐标、颜色、法线、UV坐标
    • Texture : 贴图类(待添加)。

Utility文件夹:

  • Utility
    • MathUtility : 静态类,包含一些数学方法
    • RenderUtiltiy : 静态类, 包含所有的渲染算法,包括Bresenham绘线算法,光栅化算法,扫描线填充算法

TestData文件夹:

  • TestData
    • Cube : 立方体测试数据
    • Primitive : 三角形测试数据
    • Quad : 平面测试数据

其他:

  • MainEntry.cs : 程序的入口,无需关心
  • MainWindow : 运行程序时显示的窗口的抽象,在这里开启渲染流程,设定上述类的初始值,载入模型等。

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

总结

虽然现在都是使用可编程管道的软件渲染器,编写一个实现基本功能的固定管道软件渲染器对渲染引擎的了解一定是很有帮助的。
完成这个之后,不要纠结于优化你的程序,这是没有意义的。当掌握了渲染流程之后,去学习OpenGL或者DirectX,也会有很大的启发。

如果你没有任何的计算机图形基础,那么你不适合来看这个代码。
建议看
<<3D游戏与计算机图形学中的数学方法》
<<3D游戏编程大师技巧>>
之后,再来动手做一做。

Github中的版本是我重构并且加了很多注释,现在实际上还没有完成,但是我会继续做下去,老旧的版本虽然功能都在,但是我并不满意,不过还是给出代码,希望有所帮助。

skywind3000 C语言版 软件渲染器

C#版本 软件渲染器

旧版的软件渲染器在我的上传资源里可以看到。
旧版C#

猜你喜欢

转载自blog.csdn.net/sixdaycoder/article/details/77853122