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 选择了
最后,如果我们不取离三条边距离最小值,相对的,我们将代码改成 float minDistanceToEdge = min(i.dist[0], max(i.dist[1], i.dist[2])) * i.dist[3];
便可以得到没有对角线的网格:
- UnityShader——Wireframe
- UnityShader——玩弄GlobalFog
- UnityShader案例(一)——漫反射
- UnityShader——初探Compute Shader
- UnityShader——挺进体积光
- UnityShader初级篇——单张纹理
- UnityShader——球谐光照
- UnityShader初级篇——凹凸映射
- UnityShader初级篇——渐变纹理
- UnityShader初级篇——透明度测试
- UnityShader初级篇——透明度混合
- UnityShader
- UnityShader官方案例讲解——SurfaceShader(1)
- UnityShader官方案例讲解——SurfaceShader(2)
- UnityShader官方案例讲解——SurfaceShader(3)
- UnityShader官方案例讲解——SurfaceShader(4)
- UnityShader案例(二)——Phong高光反射
- UnityShader案例(三)——BlinnPhong高光反射
- shell下合并多文件内容
- [PHP]将二维数组中的键值替换为其中的某个下标的值,
- BZOJ3594: [Scoi2014]方伯伯的玉米田
- hdu 1532 最基础的求网络最大流问题
- pc端对应跳转手机端代码,适用所有网站!
- UnityShader——Wireframe
- Oracle创建用户
- Cpp-this指针
- druid连接池监控在spring中的配置(注)
- 爱奇艺播放按钮动画解析
- BZOJ 1624: [Usaco2008 Open] Clear And Present Danger 寻宝之路
- js中math常用方法总结
- SEO优化
- ESP8266 RTOS SDK使用GPIO中断的方法