Java软光栅渲染器

开个新坑。

这两天在知乎上搜索关与如何学习图形学的问题,看到了叶神(昵称 Milo Yip)的几个回答:

我决定自己动手实现一个Java软光栅渲染器,把整个渲染的过程搞明白。按照叶神的建议,从图形学的历史进程来学习,这样做练习:

2D部分:

  1. 光栅化2D点(就是在二维数组上画点,了解色彩的基本原理,并解决图像的输出问题)。
  2. 光栅化2D直线(布雷森汉姆直线演算法吴小林直线算法等)
  3. 2D直线的剪切算法(见Line clipping)。
  4. 光栅化2D三角形(scan conversion)。避免重复光栅化相邻三角形边界的像素(edge equation)。
  5. 光栅化简单/复杂多边形

3D部分:

  1. 把顶点从三维世界空间变换至二维屏幕空间,绘制顶点(如银河星系数据),操控摄像机旋转模型。
  2. 在剪切空间进行3D直线的剪切算法,把顶点连线(如各种三维正多面体)光栅化成wire frame模型。
  3. 以多边形来定义三维模型。使用画家算法来光栅化那些多边形。
  4. 改为使用深度缓冲。
  5. 实现简单的纹理映射,先做屏幕空间插值,然后实现简单的perspective-correct texture mapping。
  6. 实现简单的顶点光照,使用顶点颜色插值实现Gouraud shading。
  7. 通过顶点法线插值,实现Phong shading。
  8. 实现其他贴图技术,如mipmapping(也可试 Summed area table)、bilinear/trilinear filtering、bumpmapping、normal mapping、environment mapping等。

项目地址:https://github.com/jmecn/JSoftwareRenderer