US2S3L12——CG内置函数
CG内置函数
Unity Shader中的CG语言提供了各种用于图形编程的函数
这些函数是CG为我们封装好的逻辑,我们可以使用它们来编写Unity Shader
可以通过以下链接来查看更多的相关函数:内部函数 - Win32 apps | Microsoft Learn
这是HLSL对应的内置函数,CG和它类似 (注意:不是所有函数都在Unity中被支持)
数学函数
三角函数相关
1 2 3 4 5 6 7 8 9 10 11
| sincos(float x, out s, out c) sin(x) cos(x) tan(x) sinh(x) cosh(x) tanh(x) asin(x) acos(x) atan(x) atan2(y,x)
|
向量、矩阵相关
1 2 3 4 5 6 7
| cross(A,B) dot(A,B) mul(M,N) mul(M,v) mul(v,M) transpose(M) determinant(m)
|
数值相关
常用
1 2 3 4 5 6 7 8 9 10 11 12 13
| abs(x) ceil(x) floor(x) clamp(x,a,b) radians(x) degrees(x) max(a,b) min(a,b) sqrt(x) pow(x,y) round(x) rsqrt(x) lerp(a,b,f)
|
不常用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| exp(x) exp2(x) fmod(x,y) frac(x) frexp(x,out exp) isfinite(x) isinf(x) isnan(x) ldexp(x,n) log(x) log2(x) log10(x) saturate(x) sign(x) smoothstep(min,max,x)
step(a,x) all(x) any(x)
|
其他
1 2 3 4
| lit(NdotL,NdotH,m)
noise(x)
|
几何函数
1 2 3 4 5
| length(v) normalize(v) distance(p1,p2) reflect(I,N) refract(I,N,eta)
|
纹理函数
注意:这些纹理采样函数返回值为 fixed4
类型的颜色值
二维纹理
1 2 3 4 5 6
| tex2D(sampler2D tex, float2 s) tex2D(sampler2D tex, float2 s, float2 dsdx, float2 dsdy) tex2D(sampler2D tex, float3 sz) tex2D(sampler2D tex, float3 sz, float2 dsdx, float2 dsdy) tex2Dproj(sampler2D tex, float3 sq) tex2Dproj(sampler2D tex, float4 szq)
|
使用二维纹理查询将贴图映射到纹理上
通过2D纹理查询 tex2D()
,可以获取贴图的某个坐标上的颜色,将该颜色在片元着色器回调函数中返回出去,即可让贴图映射到纹理上
需要在外部关联一张2D贴图并获取到贴图对应的UV坐标,在片元着色器使用tex2D()
并返回出其返回的颜色值:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| Shader "TeachShader/Lesson24" { Properties { _My2D("My2D", 2D) = ""{} }
SubShader { Pass { CGPROGRAM #pragma vertex myVert #pragma fragment myFrag
sampler2D _My2D;
struct a2v { float4 vertex : POSITION; float2 uv : TEXCOORD0; };
struct v2f { float4 postion : SV_POSITION; float2 uv : TEXCOORD0; }; v2f myVert(a2v data) { v2f v2fData; v2fData.postion = UnityObjectToClipPos(data.vertex); v2fData.uv = data.uv;
return v2fData; }
fixed4 myFrag(v2f data) : SV_Target { fixed4 color = tex2D(_My2D, data.uv); return color; } ENDCG } } }
|
纹理预览效果及使用该纹理的模型效果:
纹理相关内容,详见:US3S2——Shader入门-纹理效果
立方体纹理
1 2 3
| texCUBE(samplerCUBE tex, float3 s) texCUBE(samplerCUBE tex, float3 s, float3 dsdx, float3 dsdy) texCUBEDproj(samplerCUBE tex, float4 sq)
|
其他纹理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| tex1D(sampler1D tex, float s) tex1D(sampler1D tex, float s, float dsdx, float dsdy) tex1D(sampler1D tex, float2 sz) tex1D(sampler1D tex, float2 sz, float dsdx, float dsdy) tex1Dproj(sampler1D tex, float2 sq) tex1Dproj(sampler1D tex, float3 szq)
texRECT(samplerRECT tex, float2 s) texRECT(samplerRECT tex, float2 s, float2 dsdx, float2 dsdy) texRECT(samplerRECT tex, float3 sz) texRECT(samplerRECT tex, float3 sz, float2 dsdx, float2 dsdy) texRECTproj(samplerRECT tex, float3 sq) texRECTproj(samplerRECT tex, float3 szq)
tex3D(sampler3D tex, float3 s) tex3D(sampler3D tex, float3 s, float3 dsdx, float3 dsdy) tex3DDproj(sampler3D tex, float4 sq)
|