Shader | 视差遮蔽映射与局部差异导数函数
Shader技术渲染代码数学Thepoly 15302 2
实名

通过了实名认证的内容创造者

发布于 2022-3-26 14:39:15

您需要 登录 才可以下载或查看,没有账号?注册

x
本帖最后由 Thepoly 于 2022-3-26 14:41 编辑

             src=http___img-blog.csdnimg.cn_img_convert_bb16c68e8b798b1ea8771e1b08482ac3.pngrefer=http___img-blog.csdnimg.webp.jpg
174551k9r66ex7z719e99h.jpg




Hello . 大家好
今天带来的是美术向的UnityShader小教学
我是麦田


没错,上个月月底工作太忙我鸽了

"If it looks right, it is right.”
(“如果它看起来是对的,那它就是对的”)
——《3D Math Primer for Graphics and Game Development》


1
视差映射


什么是视差映射?即视差贴图。游戏/影视中使用的一种改进法线贴图技术。也可以理解为高度图。

举个不恰当的例子,一只鸽子以为自己是一只老鹰在天上飞的很高。往下看,下面群山沟壑。受制于我们手机性能的影响,我们就要想办法去解决这种问题。又或者我需要表达高度的地方,通过曲面细分或者置换出面的话,实在太贵了。

这时我们就可以根据实际情况来选择这方面的优化方式。视差,其实就是通过切线空间中的视角(相对于法线的角度)和该点处的高度图的值的函数,来渲染多边形上某个点的纹理坐标来实现的。

在较陡的视角下,纹理坐标的位移更大,由于视线变化而产生的视差效应给人眼造成了深度错觉。




2
”上才艺“
BGM



1,打开Unity,我用的版本是2019.3.6,安装好Amplify Shader Editor;
2,版本选择1.8,最新版本的确实舒服,最重要的是老版本在视差映射方面MAC上有BUG;
3,然后我们在场景内创建一个平面 ;
4,Ctrl+Shift+F,选中Cramea,快速切换摄像机角度朝地45度;
5,创建一个Shader文件;
6,准备好一套图,Base,Normal,AO,Height等等。

OK,正文开始,
可以看一下这里的设置,前向渲染,层级2000。



首先,我们创建一个Texture Object和UV,注意一下,是Object,不是Sample Texture,然后将Height贴图给它,UV需要指认为获取Height。(下图)


获取一个View Dir(视口方向),设置到切线空间。

这里补充一下,图表封装的还是非常好的,View Dir在代码里都是要手撸的。View Dir的原理图长这样。

View Dir原理图


创建一个核心节点视差遮挡映射,图表已经给你封装好了,就是这个,让你免去计算的痛苦。


其基本原理即为获取到Height贴图的数据(0-1),进行V方向偏移,记录获取到的数据进行步进采样。

具体算法请参见网易大佬的知乎两篇译文,里面有详细的计算方式和实现原理。

https://zhuanlan.zhihu.com/p/128682162
https://zhuanlan.zhihu.com/p/129366157


以及原作者的GitHub链接:
https://github.com/UPBGE/upbge/issues/1009


创建以下内容,将获取到的高度UV给到视差遮挡映射。并且创建一个Range,最大值给1,暴露到材质面板。



3
”上才艺x2“


创建DDX与DDY这两个函数


DDX&DDY节点输出相对于屏幕空间xy坐标的指定输入值的偏导数。

这又是什么玩意?


简单的说就是三角面上一个像素的位置上对屏幕坐标x和y方向的导数,也就是该点位置的表面相对于屏幕平面的倾斜程度的度量。

具体解释链接:http://www.aclockworkberry.com/shader-derivative-functions/

链接中解释的是GLSL中的用法,两者其实是一样的,这里的dFdX即为DDX,同理dFdy即为DDY。

看到下图我们能理解,DDX与DDY的计算方式了,GPU光栅的时候,会将他们变成2×2像素的块。通过获取块中像素值之间的差异来计算出导数,即为右边减去左边,底下减去上面。所以,导数是逐像素计算的。


那么应用场景在哪里?Unity3D引擎中的MipMap就是这样计算而来。


介绍完了核心的视差遮蔽映射与局部差异导数函数,下面我们就来继续完善我们想做的东西吧!


创建四个TexSample,将MipMode改为Derivative,再创建一个Range(快捷键1),暴露出DDX与DDY后,将DDX&DDY给到与其对应的数值。


最后我们将自定义后的UV传递给TexSample,以下为总节点图:



最后我们来Game视图看一下效果。

1.只有法线无视差的效果


2.拥有了视差

我们看到,类似一个置换的效果,但是边缘有拉伸锯齿感(和高度图有关)。

3.拥有了DDX&DDY

摄像机拉远一点之后,就会计算局部差异导数函数,此时锯齿感消失。


归根结底,他还是一个Plane,并没有改变平面模型,但是是造成了视觉假象,正印证了文章开头的第一句话:如果它看起来是对的,那就是对的。


"If it looks right, it is right.”
(“如果它看起来是对的,那它就是对的”)
——《3D Math Primer for Graphics and Game Development》

文章中的源文件已经打包传到后台,关注公众号后,首页回复麦田即可获取。

- End -

喜欢Thepoly的可以通过三种方式与我们建立联系。分别是公众号、微信群以及QQ群。公众号是我们最为官方的窗口,更多内容都必须关注公众号后才能获取。另外现已开通微博:手机版http://weibo.cn/thepoly网页版http://weibo.com/thepoly
         

本帖被以下画板推荐:

还没有设置签名!您可以在此展示你的链接,或者个人主页!
使用道具 <
Teny  发表于 2022-3-26 18:43:40  
3#
谢谢楼主分享!!!
回复 收起回复
使用道具
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表