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的所有元素从浮点值截断到整数值。 |