法线贴图:Slope(斜坡) 法线生成算法 在地形渲染中的应用



原文出处:
http://www.azure.com.cn/article.asp?id=285

如有转载请注明:
http://www.azure.com.cn
 

     现在地形渲染般都使用高度图来作为数据源高度图中每个像素颜色都代表着个高度值就为其y值其x,z值为生成规格数据所以将所有这些顶点依次用 3角形带绘制出来即形成块地形
      但问题出来了高度图中没有包含法线信息无法进行光照当然你可以说我可以用张图R,G,B来储存法线信息用A来储存高度值这样当然最好但这样你得为它写个完善地形编辑器了而且这个法线是不可更改
      如果你要做顶点波动水面这时又需要用当前顶点法线去查询cubemap来产生反射效果你就必须要动态更新法线信息了如果快速实时计算就是我们需要面对问题了Slope思路方法就可以解决此问题

有关 Slope 计算法线先见下图:
\" border=\"0\" _disibledevent=>screen.width-333) {this.width=screen.width-333;this.title=\'open window\';}\" _disibledevent=>

上图为个网格图假设有顶点p00,p10,p20.......
首先见图中深色部分
如果我们要计算p31此点法线
Slope法线算法如下:


p[3][1].normal.x = p[4][1].position.y - p[2][1].position.y;
p[3][1].normal.y = -k;
p[3][1].normal.z = p[3][2].position.y - p[3][0].position.y;
p[3][1].normal.normalize;   //归
[/code]

所以推广到任意点为:
[code]
p[a][b].normal.x = p[a+1][b].position.y - p[a-1][b].position.y;
p[a][b].normal.y = -k;
p[a][b].normal.z = p[a][b+1].position.y - p[a][b-1].position.y;
p[a][b].normal.normalize;   //归







有关这个k值:
这个值是个调整值反复调整才能达到最好效果
如果两个顶点水平距离较大k值应该大点反的小点
在我地形demo中我取20

边缘特殊处理:
当顶点为p00, p10, p20, p01 这些边缘顶点时候用以上思路方法计算必然导致越界
所以我们强制定义边缘处顶点法线为(0, 1, 0).

相关此思路方法demo截图:

此地形法线是用Slope思路方法预计算出来效果还不错吧.
screen.width-333) {this.width=screen.width-333;this.title=\'open window\';}\" _disibledevent=>

这个水面法线是用Slope思路方法动态计算出来用来查询反射
screen.width-333) {this.width=screen.width-333;this.title=\'open window\';}\" _disibledevent=>

www.azure.com.cn

Tags:  法线贴图制作 法线方程 什么是法线 法线贴图

延伸阅读

最新评论

发表评论