Shader指南(一)

Unity水面Shader
尽管Unity为我们开发游戏提供了很多便利,但是在一些需要特殊画面效果的地方,仍然很复杂,其中Shader就是里面的一大难题。

什么是Shader

Shader程序:GPU执行的,针对3D对象进行操作的程序。

Shader编程有那几种?

  • CG 与DirectX 9.0 以上以及OpenGL 完全兼容。运行时或事先编译成GPU汇编代码
  • HLSL 主要用于Direct3D。平台:Windows

  • GLSL 主要用于OPenGL。 平台:移动平台(IOS,Android),Mac(only use when you target Mac OS X or OpenGL ES 2.0)

Unity3d 里CG输出什么?

  • Windows Direct3D,GPU汇编代码

  • Mac OpenGL GPU汇编代码

  • Flash Flash GPU 汇编代码

  • IOS/Android Unity会将CG转换成GLSL代码。

总结: 也就是除了移动平台会把CG转换成GLSL代码,其余平台都是转化成汇编代码。

Unity中自定义的Shader:

  • Surface Shaders 表面着色器(最常用,比固定功能管线高级)(之前默认创建的shader类型)它是 Vertex and fragment shaders 的包装,让我们可以不用关心这些顶点和片段程序的细节,可以直接得到我们想要的着色器。

  • Vertex and Fragment Shaders 顶点和片元着色器(细节处理,偏底层)

CG部分函数列表

方法名 描述
abs(x) 返回x的绝对值。对x的每个元素都会独立计算一次。
acos(x) 返回x的反余弦值。对x的每个元素都会独立计算一次。
all(x) 检测x的所有元数的值是否为0.
any(x) 检测x是否有某个元数的值为0.
asfloat(x) 将x转换为float类型。
asin(x) 返回x的反正弦值。对x的每个元素都会独立计算一次。
asint(x) 将x转换为int类型。
asuint(x) 将x转换为uint类型。
atan(x) 返回x的反正切值。
atan2(y, x) 返回y、x的反正切值。
ceil(x) 返回大于或等于x的最小整数。
clamp(x, min, max) 将x截取在[min, max]范围内。
clip(x) 如果x中存在值小于0的参数,则丢弃当前像素。
cos(x) 返回x的余弦值。
cosh(x) 返回x的双曲余弦值。
cross(x, y) 返回x、y的叉积。
D3DCOLORtoUBYTE4(x) 混合和缩放4D向量x用于补偿一些对UBYTE4支持的硬件。
ddx(x) 返回关于屏幕坐标x轴的偏导数。
ddy(x) 返回关于屏幕坐标y轴的偏导数。
degrees(x) 将x(弧度)转换到角度。
determinant(m) 返回的正方形矩阵m的行列式。
distance(x, y) 返回x、y之间的距离。
dot(x, y) 返回x、y的点积。
exp(x) 返回以e为底数,x为指数的指数函数值。
exp2(x) 返回以2为底数,x为指数的指数函数值。对x的每个字段都会计算一次。
faceforward(n, i, ng) 检测多边形是否位于正面。-n * sign(•(i, ng))。
floor(x) 返回小于等于x的最大整数。
fmod(x, y) 返回x/y的浮点余数。
frac(x) 返回x的小数部分。
frexp(x, exp) 返回x的尾数和指数。
fwidth(x) 返回 abs(ddx(x)) + abs(ddy(x)),
GetRenderTargetSampleCount() 返回渲染目标采样器的个数。
GetRenderTargetSamplePosition(x) 返回关于给定采样器的一个采样点(x,y)。
isfinite(x) 如果x为有限值则返回true,否则返回false。
isinf(x) 如果x为无限值则返回true,否则返回false。
isnan(x) 如果x为NAN或QNAN则返回true,否则返回false。
ldexp(x, exp) frexp的逆运算,返回 x * 2 ^ exp。
length(v) 返回v向量的长度。
lerp(x, y, s) 对x、y进行插值计算。Returns x + s(y - x)。
lit(n • l, n • h, m) 返回光照向量(环境光,漫反射光,镜面高光,1)。
log(x) 返回以e为底的对数。
log10(x) 返回以10为底的对数。
log2(x) 返回以2为底的对数。
max(x, y) 返回x、y中较大值。
min(x, y) 返回x、y中较小值。
modf(x, out ip) 把x分割为整数和小数部分。
mul(x, y) 返回x、y矩阵相乘的积。
noise(x) Generates a random value using the Perlin-noise algorithm.
normalize(x) 返回单位化向量,定义为 x / length(x)。
pow(x, y) 返回x^y。
radians(x) 将x(角度)转换到弧度。
reflect(i, n) 返回入射光线i对表面法线n的反射光线。
refract(i, n, R) 返回在入射光线i,表面法线n,折射率为R下的折射光线。
round(x) 返回最接近x的整数。
rsqrt(x) 返回x平方根的倒数。 1 / sqrt(x) 。
saturate(x) 把x截取在[0, 1]之间。
sign(x) 返回x的符号。
sin(x) 返回x的正弦值。
sincos(x, out s, out c) 返回x的正弦值和余弦值。
sinh(x) 返回x的双曲正弦值。
smoothstep(min, max, x) 如果x的范围是[min, max],则返回一个介于0和1之间的Hermite插值。
sqrt(x) 返回x的平方根,对x的每个字段都会计算一次。
step(a, x) 返回 (x >= a) ? 1 : 0 。
tan(x) 返回x的正切值。
tanh(x) 返回x的双曲正切值。
tex1D(s, t) 返回纹理s在t位置的颜色。1D texture lookup.
tex1Dbias(s, t) 使用bias返回纹理s在t位置的颜色。1D texture lookup with bias.
tex1Dgrad(s, t, ddx, ddy) 1D texture lookup with a gradient.
tex1Dlod(s, t) 使用LOD返回纹理s在t位置的颜色。1D texture lookup with LOD.
tex1Dproj(s, t) 使用透视分离返回纹理s在t位置的颜色。
tex2D(s, t) 返回纹理s在t位置的颜色。
tex2Dbias(s, t) 2D texture lookup with bias.
tex2Dgrad(s, t, ddx, ddy) 2D texture lookup with a gradient.
tex2Dlod(s, t) 2D texture lookup with LOD.
tex2Dproj(s, t) 2D texture lookup with projective divide.
tex3D(s, t) 3D texture lookup.
tex3Dbias(s, t) 3D texture lookup with bias.
tex3Dgrad(s, t, ddx, ddy) 3D texture lookup with a gradient.
tex3Dlod(s, t) 3D texture lookup with LOD.
tex3Dproj(s, t) 3D texture lookup with projective divide.
texCUBE(s, t) Cube texture lookup.
texCUBEbias(s, t) Cube texture lookup with bias.
texCUBEgrad(s, t, ddx, ddy) Cube texture lookup with a gradient.
tex3Dlod(s, t) Cube texture lookup with LOD.
texCUBEproj(s, t) Cube texture lookup with projective divide.
transpose(m) 返回m的转置矩阵。
trunc(x) 将x的所有元素从浮点值截断到整数值。

参考

Search by:GoogleBingBaidu