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)).

  

参考:

1、https://blog.csdn.net/wylionheart/article/details/78026707

2、http://www.aclockworkberry.com/shader-derivative-functions/#footnote_3_1104

HLSL ddx / ddy的更多相关文章

  1. 关于ddx/ddy重建法线在edge边沿上的artifacts问题

    经验证,原来ddx/ddy这两个操作,在forward rendering与deferred rendering中存在着微妙的应用区别. 在forward rendering中,GPU shader会 ...

  2. DirectX HLSL 内置函数

    Intrinsic Functions (DirectX HLSL) The following table lists the intrinsic functions available in HL ...

  3. HLSL学习笔记(一):基础

    http://www.cnblogs.com/rainstorm/archive/2013/05/04/3057444.html 前言 五一在家无事,于是学习了一下HLSL,基于XAN4.0的.学习完 ...

  4. CG 内置函数 和 HLSL 内置函数

    CG 内置函数  英伟达官网链接: http://http.developer.nvidia.com/Cg/index_stdlib.html absacosallanyasinatan2atanbi ...

  5. HLSL Shader编程基础总结

    转自:https://blog.csdn.net/Blues1021/article/details/47093487 基本前提概念 Shader是一种映射到GPU硬件汇编语言上的高级语言,Shade ...

  6. shader函数

    Intrinsic Functions (DirectX HLSL) The following table lists the intrinsic functions available in HL ...

  7. ue4 材质表达式分类

    绿色节点 颜色 Color Desaturation 数学 Math GO 字体 Font FontSample,FontSampleParameter 实用程序 Utility 常用: Desatu ...

  8. unity shader 常用函数列表

    此篇博客转自csdn的一位大牛. 中间排版出了一些问题 Intrinsic Functions (DirectX HLSL) The following table lists the intrins ...

  9. Unity3D Shader 内置函数

    Intrinsic Functions (DirectX HLSL) The following table lists the intrinsic functions available in HL ...

随机推荐

  1. Python全栈之路----函数进阶----名称空间

    又名name space,顾名思义就是存放名字的地方,存什么名字呢?举例说明,若变量x=1,1存放于内存中,那名字x存放在哪里呢?名称空间正是存放名字x与1绑定关系的=地方 名称空间共3种,分别如下 ...

  2. jmeter4.0安装记录

    前提:jmeter需配置环境变量jdk,jmeter4.0版本需1.7以上版本, 查看jdk版本命令java -version 1.官网http://jmeter.apache.org/downloa ...

  3. 2017《JAVA技术》预备作业-计科1502-19-何俏依

    1.阅读邹欣老师的博客,谈谈你期望的师生关系是什么样的? 我期望的师生关系是长辈和晚辈,前辈和后生,朋友与朋友之间的关系,作为晚辈,要尊敬长辈,不能对长辈进行言语攻击和起冲突:作为后生,要谨遵教诲,有 ...

  4. poj 3264 倍增 ST表

    #include<iostream> #include<cmath> using namespace std; ; int a[maxn]; ]; ]; int quick(i ...

  5. Angular + Websocket

    Angular使用RxJS,它本质上是一个反应式扩展的javascript实现.这是一个使用可观察序列组成异步和基于事件的程序的库,非常适合使用WebSockets. 简而言之,RxJS允许我们从we ...

  6. oracle-logminer

    LogMiner工具实际上是由两个新的PL/SQL内建包((DBMS_LOGMNR 和 DBMS_ LOGMNR_D)和四个V$动态性能视图(视图是在利用过程DBMS_LOGMNR.START_LOG ...

  7. 十三、springboot (八)Admin

    1.创建server端spring-boot-admin 2.添加依赖 <parent> <groupId>org.springframework.boot</group ...

  8. QT QHttpMultiPart上传图片

    使用get请求或post请求可以传递简单的参数,但要上传图片到服务器,就要多做一些工作了,如下代码片段利用post请求可成功上传图片到服务器: QNetworkRequest request; req ...

  9. [zz]有哪些优秀的科学网站和科研软件推荐给研究生?

    https://www.zhihu.com/question/37061410 如题,各位科研前辈,有没有一些好的科研网站或者适合科研人员用的软件以及APP,推荐给一只研一的菜鸡,帮助我们提高科研效率 ...

  10. 一个基于typelist的typemap

    前面的typelist的e一个小扩展,http://www.cnblogs.com/flytrace/p/3551414.html. 可以插入pair<key_type, value_type& ...