Unity ddx与ddy

有关Unity的dx与dy的概念

引用的文章

1link

2link

3link

4link

有关概念

我们知道在光栅化的时刻,GPUs会在同一时刻并行运行很多Fragment Shader,但是并不是一个pixel一个pixel去执行的,而是将其组织在2x2的一组pixels分块中,去并行执行。而偏导数就正好是计算的这一块像素中的变化率。从上图可以看出来ddx 就是右边的像素块的值减去左边像素块的值,而ddy就是下面像素块的值减去上面像素块的值。其中的x,y代表的是屏幕坐标。
注意:偏导数ddx/y可以计算我们FragmentShader中任意的变量。向量,矩阵等等。

最终得出结论,2x2块中,4个像素的ddx共享一个值,4个像素的ddy共享一个值。ddx只与p(x,y)、p(x+1,y)有关,ddy只与p(x,y)、p(x,y+1)有关。无论ddx与ddy都与p(x+1,y+1)无关。

相关应用

1.Mipmap:(对UV求偏导的应用)

复制代码
	ddx和ddy代表了相邻两个像素在设备坐标系当中的距离,据此可以判断应该使用哪一层的贴图LOD(如果贴图支持LOD,也就是MIPS)。这个距离越大表示三角形离开摄像机越远,需要使用更小分辨率的贴图;反之表示离开摄像机近,需要使用更高分辨率的贴图。也就是说,在开启贴图LOD功能的情况下,这两个值会被GPGPU的贴图单元自动参照,从而决定实际访问的MIPS层级

2.Flat Shader(对顶点做偏导的应用)

复制代码
	通过对顶点的偏导数,就可以实现简单的顶点作色效果。
	而且不用顶点传入法线,也能求出模型的法线,原理如下:
	VertexShader,将顶点的Pos传入到FragmentShader中;
	在FragShader中,我们如果调用ddx(Pos),和ddy(Pos)这个代表求出相邻的2个像素块之间坐标的差值,即下面图中的红色和绿色2个矢量,而这2个矢量都在这个三角形的平面上,那么执行 normalize( cross(ddx(pos),ddy(pos)) ) 就求出的面的法线,但是这里要注意,在HlSL上面,或者Unity上面要写成normalize( cross(ddy(pos),ddx(pos)) ),不然法线是反向的。这个是由于左右手坐标系引起的。

3. 贴图勾边锐化(对贴图颜色求偏导的例子)

复制代码
void surf (Input IN, inout SurfaceOutput o) {
    half4 c = tex2D(_MainTex, IN.uv_MainTex);
    //c += ddx(c)*2 + ddy(c)*2; //这行代码开启和关闭的效果
    o.Albedo = c.rgb;
    o.Alpha = c.a;
}
![效果图](https://img-blog.csdnimg.cn/062a035095c6416eba6dd107d9181fbc.png#pic_center)

左边是直接显示图片,右边是在图片上面加上x和y的偏导数。
相关推荐
爱搞虚幻的阿恺6 天前
Niagara粒子系统-超炫酷的闪电特效(加餐 纸牌螺旋上升效果)
游戏·游戏引擎
_Li.6 天前
Simulink - 6DOF (Euler Angles)
人工智能·算法·机器学习·游戏引擎·cocos2d
weixin_424294676 天前
Unity 调用Steamworks API 的 SteamUserStats.RequestCurrentStats()报错
unity·游戏引擎·steamwork
HoFunGames6 天前
Unity小地图,Easy Minimap System MT-GPS插件
unity·游戏引擎
wy3258643647 天前
Unity 新输入系统InputSystem(基本操作)
unity·c#·游戏引擎
WarPigs7 天前
着色器multi_compile笔记
unity·着色器
ECHO飞跃 0127 天前
Unity2019 本地推理 通义千问0.5-1.5B微调导入
人工智能·深度学习·unity·llama
Unity游戏资源学习屋7 天前
【Unity UI资源包】GUI Pro - Casual Game 专为休闲手游打造的专业级UI资源包
ui·unity
冰凌糕7 天前
Unity3D Shader 顶点法线外扩实现描边效果
unity
星和月7 天前
Untiy使用说明
c#·游戏引擎