微软文档HLSL内部函数:
https://docs.microsoft.com/zh-cn/windows/win32/direct3dhlsl/dx-graphics-hlsl-intrinsic-functions
一、基本数学运算
1 | max(a,b)//最大值 |
二、幂指对函数
1 | pow(x,y);//x^y |
三、三角函数与双曲函数
1 | sin(x);cos(x);tan(x);//x均为弧度 |
四、数据范围类
1 | ceil(x);//向上取整 |
五、类型判断类
1 | all(x);//确定x所有分量是否均为非零,均非零则返回true,否则false(处理浮点型、整形、布尔型数据定义的标量、向量或矩阵) |
六、向量与矩阵类
1 | length(v);//向量模长 |
七、光线运算
1 | //注意所有的入射方向都表示入射方向的相反方向 |
八、1D纹理查找(几乎不用)
函数ddx,ddy用于求取相邻像素间某属性的差值;输入参数通常是纹理坐标,返回相邻像素间的属性差值;
1 | tex1D(s,t);//一维纹理查找,返回纹理采样器s在标量t位置的color4 |
九、2D纹理查找
1 | tex2D(s,t);//二维纹理查找,返回纹理采样器s在t(x,y)位置的color4 |
十、3D纹理查找
3D纹理资源(体积纹理),包含3D体积的纹理像素
1 | tex3D(s,t);//三维纹理查找,返回纹理采样器s在vec t位置的color4 |
十一、立体纹理查找
指CubeMap
1 | texCUBE(s,t);//返回纹理采样器s在vec t位置的color4 |
作业
- 写出最常用的5个函数
- dot,mul,normalize,tex2d,pow
- 这是我当前感觉最常用的,dot和mul不必说,向量矩阵运算必备;而由于光照计算中使用方向,常常需要对向量归一化;有贴图就有纹理采样;最后这个pow方法,看看各种光照模型的公式里,就有很多地方出现幂运算了。
- ddx ddy的实际使用测试
ddx/ddy与法线贴图
ddx/ddy计算法线
首先ddx与ddy是两个函数,完整的表达是ddx(m),ddy(m)。
在glsl中,它相当于dFdx(m),dFdy(m)。
这两个函数只能作用于片元着色器中,根据他们的作用也很好理解这一点。
我们需要提供一个属性,然后这个函数会计算当前片元在屏幕空间中,沿x或y方向关于这个属性的偏导,因为片元是离散的,当然是以差分形式。

如果是考虑世界空间位置这一属性,我的理解是,对于当前着色点,计算的是这两个方向的切线方向。
于是有一个通常的法线计算方法
1 | normal = normalize(cross(ddx(pos),ddy(pos))); |
左边是ddx,ddy计算出的法线,右边是顶点法线在fs中插值的法线。
很明显,这两者就好像flat shading和phong shading的关系。仔细想想确实如此。不考虑着色,只考虑几何信息,这个球体本来就是三角网格
对于三角形上的一个点的法线,使用切线叉乘计算的法线当然是原原本本的网格法线。而右边的法线是顶点法线插值。
在unity中还原flat shading或是low poly风格的渲染,确实会采用ddx和ddy的方法。
ddx/ddy与法线贴图
learnopengl中这一段代码给我留下了深刻印象。当时用的时候完全不知道dFdx是做什么的,只能硬着头皮用了。现在我们已经了解了ddx函数,再回过头来看一下它对发现贴图的处理。
1 | // Easy trick to get tangent-normals to world-space to keep PBR code simplified. |
核心就是求TBN矩阵嘛。N向量和B向量都很好理解,一个直接就是模型法线,一个就是由叉乘计算的副切线。
问题就在于切线的计算。
1 | vec3 T = normalize(Q1*st2.t - Q2*st1.t); |
(这里把E1看作Q1,E2看作Q2)
$E_1=ΔU_1T+ΔV_1B$
$E_2=ΔU_2T+ΔV_2B$
这样再结合cpu计算TBN的方法,就很好理解了。
似乎后面的课程马上就会到法线贴图的部分,到时候再详述好了。
参考资料
[1]https://www.bilibili.com/video/BV1q64y1m7Ev 【技术美术百人计划】图形 2.3 常用函数介绍
[2]https://www.jianshu.com/p/7fc6a2fef29d
[3]https://learnopengl.com/code_viewer_gh.php?code=src/6.pbr/1.2.lighting_textured/1.2.pbr.fs
[4]https://learnopengl-cn.github.io/05%20Advanced%20Lighting/04%20Normal%20Mapping/
[5]https://zhuanlan.zhihu.com/p/484182779