参考文档:hlsl内部函数[MSDN]
注:
lit函数的光照计算为blinn-phong模型;
faceforward意思是如果ng向量与i(从view position指向shading positon)方向<90°,则对n向量取反,否则不变,但是看文档查资料没找到ng指的是什么意思
注:tex1Dgrad()中ddx和ddy参数作用是根据tex1Dlod()一样的原理取出值后还进行判定,该像素点的ddx,ddy大于给定的值才能取出来
作业
1.写出个人认为最常用的5个函数
cross,dot用于矩阵和向量运算,normalize单位化向量,clip用于透明度测试,模板测试等,tex2D纹理采样
2.ddx ddy的实际应用测试
图像锐化
四领域拉普拉斯算子常用于图像锐化,原理是利用下图卷积核对图像进行卷积即可,而ddx/ddy恰好可以获取目前像素与右边/下边像素之差,因此可以用ddxddy实现“二领域拉普拉斯滤波”(自己编的)
shader代码只需要在unlit代码上稍作修改即可
Shader "Custom/HalfLaplacian"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_intensity("Intensity",range(0,5))=1
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};
sampler2D _MainTex;
float4 _MainTex_ST;
float _intensity;
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
// sample the texture
fixed4 col = tex2D(_MainTex, i.uv);
return col+(ddx(col)+ddy(col))*_intensity;
}
ENDCG
}
}
}
结果:
未开启锐化(生化奇兵无限玩到这的时候有点感慨就截了图)
开启图像锐化(intensity=1)
如果最后输出改为 return (ddx(col)+ddy(col))*_intensity ,即去掉原本的颜色col,得到的图像也可用于边缘检测