PN-Triangles和Phong-Tesse

今天被人鄙视了一下,原因是菜鸟常被人鄙视。技术上来说,高手训斥菜鸟永远都是对的。

 

PN-Triangles需要在每个三角形patch的内部计算7个点的position和3个点的normal,并通过它们来二次插值出所有细分出来的顶点的position和normal。而Phong Tessellation直接把细分出来的顶点投影回三个原始顶点,只需要线性插值就可以得出position和normal。不但节省了大量的运算,还减少了宝贵的I/O带宽(HS到DS需要传递的量从34个float减少到4个float)。Phong Tessellation的HS部分也变得跟普通的tessellation(姑且称之为Flat Tessellation)完全相同,只要DS里面加入三四行代码就可以把Flat Tessellation变成Phong Tessellation,比起PN-Triangles需要大量修改HS、Constants HS、DS,以及互相传递的结构体来说,Phong Tessellation还是很划算的。

 

上面这个是国内开源引擎KlayGE里面的作者描述的,从描述上来看PN-Triangles和Phong-Tesse本质并没有太大的区别,就是在tess的基础上改变生成的点的位置,算法上稍有区别,Phong-Tesse简洁一些。

从这个折射出一个道理,引擎所有做的事是用更简单的方式实现更好的效果。

 

pn-triangle,phone-tess,displacement:这三个技术中,pn-triangle,phone-tess的目的一样,而displacement又是另外一个目的。前面两个是想让细节更光滑,而displacement想让细节更菱角。

 

1.PN-Triangles :

说到PN-Triangles就得说一下Bézier曲面(贝塞尔曲面),贝塞尔曲面是以曲线的基础发展起来的,最基本的是使用四个点,两个端点,两个控制点来控制一条曲线,然后在这个基础上延伸出16个点控制一个曲面。而控制曲面的算法有很多,PN-Triangles就是其中的一个算法,具有参数少算法简单的特点。P表现point,N表示法线,Triangles说明总有有3个点其对应的法线,这个算法很适用于实时渲染中的曲面生成,空间的最基本的面就是三角形面。

PN-Triangles和Phong-Tesse

 PN triangle是一个特殊的贝塞尔曲面,它的表示形式为:

PN-Triangles和Phong-Tesse

u,v, w是重心坐标,bxyz就是控制点,其中u+v+w=1,控制点的位置如下,看以看出来,b003, b030,b300就是三角形的三个顶点控制点,根据这三个控制点位置和法向,我们就可以计算出其它控制点的位置。


PN-Triangles和Phong-Tesse

PN-Triangles和Phong-Tesse

求顶点的公式:

PN-Triangles和Phong-Tesse

其本质就是根据三个点和三个法向量,求出其他的点。

PN-Triangles和Phong-Tesse

这里需要注意的是,作者并不希望通过切线的连续性来计算顶点的法线,使用的是这种方式:(Linear interpolation of the normals at the endpoints ignores infl ections in the curve

while the quadratic normal construction of curved PN triangles picks up such shape

variations.)- - 英语不好,没理解啥意思。貌似是忽略了什么二次法线提升的形状变化,ections是什么?

PN-Triangles和Phong-Tesse

反正使用的是下面这个公式计算:

PN-Triangles和Phong-Tesse

这里需要注意的是,使用这种方式计算出的法向量,后面继续细分的时候会整个曲面会继续平滑。如果这个时候你使用的是法向量纹理贴图,会是什么样的效果呢?会不会跟displacement(位移贴图)效果一样或者是更好呢?我准备试一下。

 

 

 

你可能感兴趣的:(RIA)