UnityShader——Wireframe

来源:互联网 发布:mysql 最小id 查询 编辑:程序博客网 时间:2024/05/21 09:42

昨天无意中看到群里有个小伙伴发的一张截图中有个 VR/Wireframe 的 shader,晚上便抽空下载了5.6.3 的 bulit-in 看看源码,Unity 还是良心,直接把理论资料注释在了代码的开头,是NVIDIA的一篇文章,像DX11本身提供了FillMode = D3D11_FILL_WIREFRAME选项,可以直接渲染网格,但NVIDIA认为这样渲染有诸多问题,文章比较了该技术和以前的双 pass Wireframe 渲染在各方面的优劣。当然,文章里说自己的技术基本上各方面全面领先,我也没有再去找以前的双 pass 渲染相关资料了。

整体的思路很简单也很明确,只渲染离三角形边缘距离在一定范围内的像素,那么怎么知道像素离边缘的距离呢,NVIDIA 通过在Geometry Shader中计算三角形在裁减空间中每个顶点到对边的距离,即三角形三条边的高,高很容易得到,两条边叉乘得到两倍面积,两倍面积再除以边长即可得到高:


将三条边的高传入 fragment shader,则在光栅化插值后,我们便可得到任一像素离三条边的距离:


最后,在fragment shader中取最小距离与预先设置的阈值做比较即可得到下面的结果:


可以看到,锯齿感比较严重,因此 NVIDIA 又加了一个调和函数做插值:



NVIDIA 选择了 22x2 ,得到的效果如下:


最后,如果我们不取离三条边距离最小值,相对的,我们将代码改成
float minDistanceToEdge = min(i.dist[0], max(i.dist[1], i.dist[2])) * i.dist[3];
便可以得到没有对角线的网格:


原创粉丝点击