[图形图像]C++实现的软件光栅器

目前渲染部分基本告一段落,实现了双线性、三线性、mipmap纹理采样、重复/镜像uv寻址模式、镜面光和纹理的叠加、gouraud着色、phong着色、z缓存、1/z缓存、透视纹理/光照修正、平面裁剪(含三角形分割)、正交投影摄像机。
 
以后如果再增加功能,大概就是顶点动画之类,重心应该在引擎层了,渲染层基本完毕。
 
上图。

 

第1张:

从坐到右,从上到下。无纹理、无镜面光、无深度缓冲,依次是:

1. 线框。

2. 纯色。 即每个三角形一个颜色。

3. flat着色(相比上次,修正后的效果好多了)。也是每个三角形一个颜色,但是这个颜色是参照了光照情况的。

4. gouraud着色。根据光照计算每个三角形的顶点颜色,三角形内部根据顶点颜色进行线性插值。

5. phong着色(这里分辨率太低,看不出和gouraud的区别)。每个像素分别计算光照。

第2张:

 分别是flat、gouraud、phong着色,相比第1张,加入了镜面光(注意茶壶的不少地方出现了白色的光斑)。

 

第3张:

 在上一张的基础上引入了纹理。注意壶嘴上的光斑,一个比一个细腻。这一组图仍然没打开深度缓冲,因此显示不太正确。 

 

第4张:

 高分辨率的茶壶。软件渲染瓶颈首先是像素处理,因此这么大的茶壶,帧率特别低。

两张分别对应低、高两套设置。

第一个,gouraud着色 + 最近点采样 + 三角形排序(油画家算法)+ 镜面光。帧率123。

第二个,phong着色 + 三线性采样 + 1/z缓冲 + 镜面光。帧率30。

 

 第5张:

 平面裁剪。第一个是一个竖着的平面,第一个是一竖一横两个平面。注意裁剪边缘三角形密度较大,因为进行了三角形分割。

 

第5-2张:

正交投影和平面裁剪。

正交投影,相比普通的透视投影,失去了近大远小的效果。

第二个茶壶,从侧面来观察裁剪平面,证实了这确实是三维空间的裁剪,而非屏幕上的像素裁剪。

 

第6张:

 高分辨率来了!

在屏幕上绘制两个大三角形,展示纹理过滤效果。

从上到下分别是:线框、最近点采样、双线性过滤、三线性过滤、透视纹理修正。

三线性过滤:这里很难看出和双线性的区别,但是在程序中切换状态时是能察觉到变化的。

透视纹理修正:操,屎都给我吓出来了!跟它一比,难怪之前总觉得前面两张怪怪的。这证明了,大纹理三角形不能乱用啊...

 

 

第7张:

演示纹理地址寻址方式。

整张图纹理坐标是-2~+2,从上到下,寻址方式依次为箝位、重复、镜像。 

 

第8张:

演示mipmap。

 红色是第0层,绿色是第1层,蓝色是第2层,淡蓝色是第三层,等等。

 

  

再贴一个骷髅头吧,6万个面,还能有30帧,很好。毕竟我在顶点处理环节非常谨慎的。

 gouraud + 镜面光 + 三角形排序(油画家算法,代替z缓冲)。

 

 看了一下水银上的记录,这个项目大概开始10来天了,成品是9000行C++代码,目前效果还是满意的。能够享受成品从视觉上带来的成就感,这是图形相比其他技术的优点。

 

代码6、7月份分享,执行文件在下面:

 

 http://115.com/file/anwxb9xp#Scan软件光栅.rar

 

记得看里面的readme.txt。

注意,如果你运行后显示不自然(遮挡关系错误,尤其是骷髅头),尝试按几下4开启深度缓冲,或者按几下5开启油画家算法

posted @ 2012-04-29 22:13  Scan.  阅读(3069)  评论(5编辑  收藏  举报