开个新坑。
这两天在知乎上搜索关与如何学习图形学的问题,看到了叶神(昵称 Milo Yip)的几个回答:
目标
我决定自己动手实现一个Java软光栅渲染器,把整个渲染的过程搞明白。按照叶神的建议,从图形学的历史进程来学习,这样做练习:
2D部分:
- 光栅化2D点(就是在二维数组上画点,了解色彩的基本原理,并解决图像的输出问题)。
- 光栅化2D直线(布雷森汉姆直线演算法、吴小林直线算法等)
- 2D直线的剪切算法(见Line clipping)。
- 光栅化2D三角形(scan conversion)。避免重复光栅化相邻三角形边界的像素(edge equation)。
- 光栅化简单/复杂多边形
3D部分:
- 把顶点从三维世界空间变换至二维屏幕空间,绘制顶点(如银河星系数据),操控摄像机旋转模型。
- 在剪切空间进行3D直线的剪切算法,把顶点连线(如各种三维正多面体)光栅化成wire frame模型。
- 以多边形来定义三维模型。使用画家算法来光栅化那些多边形。
- 改为使用深度缓冲。
- 实现简单的纹理映射,先做屏幕空间插值,然后实现简单的perspective-correct texture mapping。
- 实现简单的顶点光照,使用顶点颜色插值实现Gouraud shading。
- 通过顶点法线插值,实现Phong shading。
- 实现其他贴图技术,如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
..
相关文章
- Java软光栅渲染器-创建窗口
- Java软光栅渲染器-光栅化2D点
- Java软光栅渲染器-光栅化2D直线
- Java软光栅渲染器-2D直线剪切
- Java软光栅渲染器-光栅化2D三角形
- Java软光栅渲染器-3D数学库
- Java软光栅渲染器-三维向量
- Java软光栅渲染器-四元数
- Java软光栅渲染器-矩阵
- Java软光栅渲染器-空间变换
- Java软光栅渲染器-网格数据结构
- Java软光栅渲染器-三维观察
- Java软光栅渲染器-摄像机控制器
- Java软光栅渲染器-背面消隐
- Java软光栅渲染器-3D图形渲染管线
- Java软光栅渲染器-光栅化3D三角形
- Java软光栅渲染器-渲染状态
- Java软光栅渲染器-深度缓冲
- Java软光栅渲染器-纹理
- Java软光栅渲染器-透明度
- Java软光栅渲染器-透视校正插值
- Java软光栅渲染器-光照、材质与着色器
- Java软光栅渲染器-顶点光照
- Java软光栅渲染器-渲染个球