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的偏导数。
相关推荐
努力的小钟25 分钟前
虚幻引擎UActorComponent的TickComponent详解
游戏引擎·虚幻
虾球xz20 小时前
游戏引擎学习第210天
学习·游戏引擎
维度攻城狮1 天前
高效创建工作流,可实现类似unreal engine的蓝图效果,内部使用多线程高效执行节点函数
python·游戏引擎·开源软件·虚幻·graph·工作流
浅陌sss1 天前
设计模式 --- 原型模式
unity·游戏引擎
1 天前
Unity中基于2.5D的碰撞系统
unity·游戏引擎
scott.cgi1 天前
「Unity3D」TextMeshPro中的TMP_InputField,用来实现输入框的几个小问题
unity·ugui·textmeshpro·tmp_inputfield·inputfield·inputfield输入框·ugui输入框
虾球xz1 天前
游戏引擎学习第212天
c++·学习·游戏引擎
虾球xz1 天前
游戏引擎学习第209天
学习·游戏引擎
蔗理苦2 天前
2025-04-08 NO.4 Quest3 交互教程
unity·交互·vr·quest
郭逍遥2 天前
[Godot] C#简单实现人物的控制和动画
游戏引擎·godot