Shader-应用V&F实现透明材质

来源:互联网 发布:淘宝哪家羽绒服是正品 编辑:程序博客网 时间:2024/06/06 12:33

看到风宇冲实现的地球很帅。他写的这个程序很精妙,将地球和云的颜色做一个插值,作为此像素的颜色值,很妙。先膜拜一下大神嘛!

http://blog.sina.com.cn/s/blog_471132920101d6xb.html

不过,我今天写的shader也是实现相同的效果,咱的思路就很常规:地球作为不透明物体,先渲染。云层作为透明体后渲染。废话不多说开始!

Earth.shader

Shader "Custom/Earth" {Properties {_MainTex ("Texture", 2D) = "white" { }}SubShader {Tags{"Queue" = "Geometry" "RenderType"="Opaque"}Pass {CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"sampler2D _MainTex;struct v2f {float4  pos : SV_POSITION;float2  uv : TEXCOORD0;};float4 _MainTex_ST;v2f vert (appdata_base v){v2f o;// 视口上的位置o.pos = mul (UNITY_MATRIX_MVP, v.vertex);// 贴图纹理坐标o.uv = TRANSFORM_TEX (v.texcoord, _MainTex);return o;}half4 frag (v2f i) : COLOR{// 获得地球贴图的uv x即横向在动float u = i.uv.x + -0.1*_Time;float2 x=float2(u , i.uv.y);half4 texcol = tex2D (_MainTex, x);return texcol;}ENDCG}}}

Cloud.shader

Shader "Custom/Cloud" {Properties {_MainTex ("Texture", 2D) = "white" { }}SubShader {Tags{             "Queue"="Transparent"              "RenderType"="Transparent" }Pass {             Blend SrcAlpha OneMinusSrcAlpha CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"sampler2D _MainTex;struct v2f {float4  pos : SV_POSITION;float2  uv : TEXCOORD0;};float4 _MainTex_ST;v2f vert (appdata_base v){v2f o;// 视口上的位置o.pos = mul (UNITY_MATRIX_MVP, v.vertex);// 贴图纹理坐标o.uv = TRANSFORM_TEX (v.texcoord, _MainTex);return o;}half4 frag (v2f i) : COLOR{// 获得地球贴图的uv x即横向在动float u = i.uv.x + -0.2*_Time;float2 x = float2 (u, i.uv.y);half4 texcol = tex2D (_MainTex, x);texcol = float4(1, 1, 1, 0) * (texcol.x);if (texcol.x + texcol.y + texcol.z > 0.95){texcol = half4(texcol.xyz, 0.5);}return texcol;}ENDCG}}}

ok之所以,texcol这一步,是因为给的图是多彩的,像热成像图。经过了

texcol = float4(1, 1, 1, 0) * (texcol.x);
转化成了黑白图,其中白色为云效果。

然后再判断一下,即可。


思路上是没问题的,可是当我写出大部分代码的时候,总是不出效果。



怎样在0没有云的地方透明。后来我加入了Blend SrcAlpha OneMinusSrcAlpha  就出了效果


ok。剩下的 就是百度他的作用了,这就不是我的工作了。哈哈

http://download.csdn.net/detail/lihuozhiling/8365965


0 0