HLSL 偏导数 ddx / ddy

HLSL ddx / ddy

  在光栅化的时刻,GPUs会在同一时刻并行运行很多Fragment Shader,但是并不是一个pixel一个pixel去执行的,而是将其组织在2x2的一组pixels分块中,去并行执行。

  偏导数就正好是计算的这一块像素中的变化率。从下图可以看出来ddx 就是右边的像素块的值减去左边像素块的值,而ddy就是下面像素块的值减去上面像素块的值。其中的x,y代表的是屏幕坐标。

    

偏导数的应用

1、LOD的确定。

  

  大家应该都知道mipmap 的用处,但是可能并不知道mipmap的核心在选择到底用那一块mipmap的level时,靠的就是偏导数。屏幕空间的贴图UV偏导数过大的时候代表贴图离我们过远,就会选择低等级的mipmap。

  比如,原图的LOD=1,次大的LOD=2,依此类推。

  

  在Shader中使用tex2D(tex, uv)的时候相当于在GPU内部展开成下面:
    

tex2D(sampler2D tex, float4 uv)
{
    float lod = CalcLod(ddx(uv), ddy(uv));
    uv.w= lod;
    return tex2Dlod(tex, uv);
}

2、计算法线。

  如果调用ddx(Pos),和ddy(Pos)这个代表求出相邻的2个像素块之间坐标的差值,即下面图中的红色和绿色2个矢量,而这2个矢量都在这个三角形的平面上,那么执行 normalize( cross(ddx(pos),ddy(pos)) ) 就求出的面的法线。

  但是这里要注意,在HlSL上面,或者Unity上面要写成normalize( cross(ddy(pos),ddx(pos)) ),不然法线是反向的。这个是由于左右手坐标系引起的。

void surf (Input IN, inout SurfaceOutput o)

{

o.Albedo = normalize(cross(ddy(IN.worldPos),ddx(IN.worldPos)));

}

  

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;

}

  

  左边是直接显示图片,右边是在图片上面加上x和y的偏导数。

 【fwidth

  This function computes the following: abs(ddx(x)) + abs(ddy(x)).

  

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DDX很有用,用它重新计算DDX后的一大发现,让人着实兴奋不已,现提供图表给大家看一下, 用HprSnap6软件可以打开看,我将4月16日的所有股票都用图表显示,可以看到正确性在98以上, 注意左的图中的线(不是矩形,而是单根的线),跌时5天前已经全在上方很久,涨时5天前就在 下方很久了。本图是用VBA编的,VBA太有用了。 图是以涨幅降序排列的,共二张图,右边写的是涨幅,要看的是左边的图,百分之98的正确。 希望大家对DDX多加研究的话,定有惊喜的收获的。 另外,本人用模糊分析的方法得到的大单重要性的初步结果是如下:好象符合实际。 ddx 7.507214709 小单差% -2.611936371 特大差% -4.118645137 特大买入% -4.470760296 特大差量 -6.141661167 单数比 -6.35653337 特大卖出% -6.414990299 强度 -6.643649985 小单卖出% -7.158680792 大特累计 -8.274703516 60日ddy -8.440081804 大单卖出% -9.459333104 大单买入% -10.01915699 小单买入% -10.70956148 大单差% -10.72609128 ddz -11.10892985 买单均手 -11.30064578 60日ddx -11.56574557 中单差量 -11.62611809 活跃 -11.71759307 中单买入% -11.84260611 小单累计 -12.0672123 卖单均手 -12.19972861 中单差% -12.41499139 小单差股 -14.41325469 中单卖出% -14.51495897 大单差量 -14.56020615 小单差量 -14.65446439 ddy -15.23886754 量比 -16.46188466 次 -16.86515806 涨幅 -17.97181076 买入单数 -19.37005172 资金强度 -19.60573475 卖出单数 -19.85060378 换手率% -21.07516064
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值