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的偏导数。
相关推荐
游乐码12 小时前
UnityGUI(五)GUI控件综合使用
开发语言·unity·c#
LF男男12 小时前
TshitBullect.cs
unity
游乐码20 小时前
Unity(十六)切换场景及鼠标相关
unity·游戏引擎
FakeEnd20 小时前
Unity开发笔记6
笔记·unity·游戏引擎
游乐码20 小时前
Unity(十七)Unity随机数及Unity委托
unity·游戏引擎
ellis197021 小时前
Unity性能优化之检测工具Profiler
unity·性能优化
RPGMZ1 天前
RPGMZ游戏引擎 一个窗口 文本居中显示
开发语言·javascript·游戏引擎·rpgmz
tohand1 天前
Unity 完美假阴影实现文档
unity·游戏引擎
@蓝莓果粒茶1 天前
【Unity笔记】保姆级AssetBundle详解(含代码+避坑指南)
笔记·游戏·unity
Zephyr_01 天前
Unity2D游戏制作
游戏·unity