unity的hdrp对半透明渲染的upsample做法以及ue5的做法

在升采样中,hdrp会执行UpsampleTransparent.shader。他参考的是Nividia的Fast rendering of opacity-mapped particles using DirectX 11 tessellation and mixed resolutions。这里面又个upsample的做法。https://developer.download.nvidia.cn/assets/gamedev/files/sdk/11/OpacityMappingSDKWhitePaper.pdf

主要做法如下:

1.在顶点着色中先把uv和裁剪坐标转到高分辨率下的值。

2.片元中执行NEAREST_DEPTH升采样

在片元着色中如果是NEAREST_DEPTH就会在从左上角开始往右下角找最小的深度值,这个值对应的uv做为最终的uv值。

他的方式是最接近深度上采样过滤器获取图像中的2x2低分辨率深度当前全分辨率像素的双线性足迹,并比较这4种深度具有当前像素的全分辨率深度。然后过滤器计算出在这四个低分辨率深度中,最接近全分辨率深度和返回该样本对应的低分辨率颜色。

NEAREST_DEPTH的一个问题是,因为它只使用一个低分辨率每组2x2 texel的颜色样本,如果可能会在非边缘产生块状瑕疵像素。对于这些非边缘像素,双线性滤波通常效果良好。因此解决方案是如果全分辨率深度和低分辨率深度之间的绝对深度差小于给定的深度阈值,我们可以将当前像素分类为非边缘像素。

扫描二维码关注公众号,回复: 13718836 查看本文章

如果所有找到四个方向的uv都小于低分辨率的百分之10,则用线性过滤的方式,不然就用point的方式得到最终升采样的颜色值。

3.如果不走NEAREST_DEPTH

在片元着色中如果不是NEAREST_DEPTH则直接返回uv最小的一个值做为升采样的uv。

4.混合方式

他的混合方式是用Blend One SrcAlpha, Zero One,目的是让自己的颜色信息能写入,而透明度不写入。

5.对比ue5

UE5的升采样算法是找4个方向或者9个方向深度,

深度和当前像素场景的深度越接近的权重越高。然后如果利用了法线规则,则法线越接近当前像素的法线就权重越高。

 

然后加起来除采样过的次数就是他的升采样的颜色值。

 

猜你喜欢

转载自blog.csdn.net/llsansun/article/details/123159319
今日推荐