shader实例(二)色彩融合之地球仪
- 2019 年 12 月 2 日
- 筆記
结合前面的UV动画,控制白云的颜色并与地球的材质融合,形成一个带有白云的地球仪效果,原理都写在注释里了。
Shader "Custom/my1" { Properties { _MainTex ("Base (RGB)", 2D) = "white" {} _Cloud("_Cloud", 2D) = "white" {} } SubShader { Tags{"Queue" = "Transparent" "RenderType"="Transparent"} AlphaTest Greater 0.1 Pass{ // 使用Vertex and Fragment Shader可编程渲染管线 CGPROGRAM #pragma vertex vert #pragma fragment frag // 为了引入系统自带的结构体appdata_base #include "UnityCG.cginc" // 声明参数 float4 _Color; sampler2D _MainTex; sampler2D _Cloud; // 获取地球材质的纹理坐标 float4 _MainTex_ST; // 定义输出结构体 struct v2f{ float4 pos : SV_POSITION; // 视口位置 float2 uv : TEXCOORD0; // 贴图纹理坐标 };
// 操作顶点 v2f vert(appdata_base v) { v2f o; // UNITY_MATRIX_MVP // model 从本地坐标 到 世界坐标 // view 从世界坐标到相机坐标 // projection 从相机坐标到屏幕空间 // 使用mul转化为投影坐标pos o.pos = mul(UNITY_MATRIX_MVP, v.vertex); // 用于带材质的写法,获取纹理坐标 o.uv = TRANSFORM_TEX(v.texcoord, _MainTex); return o; } half4 frag(v2f i) : COLOR { // 移动地球材质的x float u_x = i.uv.x + -2 * _Time; float2 uv_earth = float2(u_x, i.uv.y); half4 texcolor_earth = tex2D(_MainTex,uv_earth); // 移动白云材质的x u_x = i.uv.x + -4 *_Time; float2 uv_cloud = float2(u_x, i.uv.y); half4 tex_cloudDepth = tex2D(_Cloud, uv_cloud); // 白色透明的点 * 包含cloud纹理的R通道的色值 = 带纹理的黑白点(RGB值一样,且值为x) // 因为A是0,所以其实这里白云是不可见的 // 写法等同于float4(tex_cloudDepth.x,tex_cloudDepth.x,tex_cloudDepth.x, 0 * tex_cloudDepth.x); half4 texcolor_cloud = float4(1,1,1,0) * (tex_cloudDepth.x); // 地球与白云的纹理混合,很显然包括A通道,所以才能看到白云。 return lerp(texcolor_earth,texcolor_cloud,0.5f); } ENDCG } } }