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

实现

创建一个JFrame窗口

光栅化2d点

光栅化2d线段

2D直线裁剪

光栅化2D三角形

创建3D数学库,实现3D空间变换。

创建虚拟摄像机,实现3D观察。

接收用户输入,实现第一人称摄像机控制器。

背面剔除

3D光栅化

深度缓冲

纹理采样。实现纹理包裹(WarpMode),以及最邻近点(Nearest)和二次线性(Bilinear)滤波。

Alpha测试

颜色混合

透视校正插值

实现了材质和着色器框架。

基于Gouraud Shader的顶点光照

实现了Blinn-Phong Shader

..

相关文章

  1. Java软光栅渲染器-创建窗口
  2. Java软光栅渲染器-光栅化2D点
  3. Java软光栅渲染器-光栅化2D直线
  4. Java软光栅渲染器-2D直线剪切
  5. Java软光栅渲染器-光栅化2D三角形
  6. Java软光栅渲染器-3D数学库
  7. Java软光栅渲染器-三维向量
  8. Java软光栅渲染器-四元数
  9. Java软光栅渲染器-矩阵
  10. Java软光栅渲染器-空间变换
  11. Java软光栅渲染器-网格数据结构
  12. Java软光栅渲染器-三维观察
  13. Java软光栅渲染器-摄像机控制器
  14. Java软光栅渲染器-背面消隐
  15. Java软光栅渲染器-3D图形渲染管线
  16. Java软光栅渲染器-光栅化3D三角形
  17. Java软光栅渲染器-渲染状态
  18. Java软光栅渲染器-深度缓冲
  19. Java软光栅渲染器-纹理
  20. Java软光栅渲染器-透明度
  21. Java软光栅渲染器-透视校正插值
  22. Java软光栅渲染器-光照、材质与着色器
  23. Java软光栅渲染器-顶点光照
  24. Java软光栅渲染器-渲染个球