• 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层级
    
    • 1

    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)) ),不然法线是反向的。这个是由于左右手坐标系引起的。
    
    • 1
    • 2
    • 3
    • 4

    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的偏导数。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
  • 相关阅读:
    III.二分算法
    shell脚本查询硬件信息(仅在centos7和rh7做了测试)
    安卓四大组件:ContentProvider
    QT学习日记28——QT动态库制作和使用
    Jmeter 如何做性能测试生成聚合HTML报告?
    C++程序设计题(2道)
    八、T100应付管理系统之员工费用报销管理篇
    进程的基本概念(操作系统)
    csmall-passport(Day15)
    相机镜头、焦距与视野
  • 原文地址:https://blog.csdn.net/u011105442/article/details/133528974