统一材质如何模拟玻璃效果

  介绍

这篇文章主要为大家展示了统一材质如何模拟玻璃效果,内容简而易懂,希望大家可以学习一下,学习完之后肯定会有收获的,下面让小编带大家一起来看看吧。

材质,玻璃Refraction"{
  {属性
  _MainTex(“主要Tex", 2 d)=皐hite"{}
  _BumpMap(“正常Map", 2 d)=癰ump"{}
  _Cubemap(“环境Cubemap",立方体)=癬Skybox"{}
  _Distortion (“Distortion"范围(0,100))=10
  _RefractAmount(“折射Amount"、范围(0.0,1.0))=1.0
  }
  SubShader {//1 .队列设置成透明的可以保证渲染该物体的时候,其他所有不透明的物体都已经被渲染到屏幕上了//这样GrabPass保存屏幕图像的时候才能完整//2 .渲染类型设置为不透明是为了使用着色器替换的时候,物体可以在被需要时正确的渲染
  标记{“Queue"=癟ransparent"“RenderType"=癘paque"}//抓取屏幕图像并保存到纹理_RefractionTex中
  GrabPass {“_RefractionTex"}
  
  通过{
  CGPROGRAM
  
  # pragma顶点绿色
  # pragma片段的破片
  
  # include“UnityCG.cginc"
  
  sampler2D _MainTex;
  float4 _MainTex_ST;
  sampler2D _BumpMap;
  float4 _BumpMap_ST;
  samplerCUBE _Cubemap;
  浮动_Distortion;
  固定_RefractAmount;
  sampler2D _RefractionTex;//可以得到系统保存的纹素的尺寸大小1/256,1/512//对屏幕图像坐标采样进行偏移的时候需要使用该变量
  float4 _RefractionTex_TexelSize;
  
  struct a2v {
  float4顶点:位置;
  float3正常:正常;
  float4切:切;
  float2 texcoord: TEXCOORD0;
  };
  
  struct v2f {
  float4 pos: SV_POSITION;
  float4 scrPos: TEXCOORD0;
  float4紫外线:TEXCOORD1;
  float4 TtoW0: TEXCOORD2;
  float4 TtoW1: TEXCOORD3;
  float4 TtoW2: TEXCOORD4;
  };
  
  v2f绿色(a2v v) {
  v2f o;
  o。pos=mul (UNITY_MATRIX_MVP v.vertex);//得到对应被抓取的屏幕图像的采样坐标
  o。scrPos=ComputeGrabScreenPos (o.pos);//原图和法线贴图公用同一套紫外线坐标,进行纹理偏移缩放设置
  o.uv。xy=TRANSFORM_TEX (v。texcoord _MainTex);
  o.uv。zw=TRANSFORM_TEX (v。texcoord _BumpMap);//世界方向
  float3 worldPos=mul (unity_ObjectToWorld v.vertex) .xyz;//法线世界方向
  fixed3 worldNormal=UnityObjectToWorldNormal (v.normal);//切线世界方向
  fixed3 worldTangent=UnityObjectToWorldDir (v.tangent.xyz);//世界副切线方向
  fixed3 worldBinormal=交叉(worldNormal worldTangent) * v.tangent.w;//定义:切线空间到世界空间的变换矩阵//所有的TBN都从切线空间转换到了世界空间
  o。TtoW0=float4 (worldTangent。x, worldBinormal。x, worldNormal。x, worldPos.x);
  o。TtoW1=float4 (worldTangent。y, worldBinormal。y, worldNormal。y, worldPos.y);
  o。TtoW2=float4 (worldTangent。z, worldBinormal。z, worldNormal。z, worldPos.z);
  
  返回啊;
  }
  
  fixed4碎片弹(v2f我):SV_Target {//世界空间
  float3 worldPos=float3 (i.TtoW0。w, i.TtoW1。w, i.TtoW2.w);//世界空间下的观察方向
  fixed3 worldViewDir=正常化(UnityWorldSpaceViewDir (worldPos));//对法线贴图进行采样,并使用UnpackNormal解压* 2 - 1,但实际上法线贴图在切线空间下//所以需要将肿块从切线空间转换到世界空间
  fixed3撞=UnpackNormal (tex2D (_BumpMap i.uv.zw));//对采样坐标进行偏移
  float2抵消=肿块。xy * _Distortion * _RefractionTex_TexelSize.xy;
  i.scrPos。xy=* i.scrPos抵消。z + i.scrPos.xy;//对屏幕纹理进行采样
  fixed3 refrCol=tex2D (_RefractionTex i.scrPos.xy/i.scrPos.w) .rgb;//将肿块从切线空间转换到世界空间//TtoW0的xyz: T的X、B的X, N的X//用点积得到一个常量
  撞=(half3(点(i.TtoW0正常化。xyz,肿块),点(i.TtoW1。xyz,肿块),点(i.TtoW2。xyz,肿块)));//用法线贴图求反射方向
  fixed3 reflDir=反映(-worldViewDir、凹凸);//主纹理采样
  fixed4 texColor=tex2D (_MainTex i.uv.xy);//对_Cubemap进行纹理采样,使用反射方向
  fixed3 reflCol=texCUBE (_Cubemap reflDir)。rgb * texColor.rgb;//反射颜色+折射颜色
  fixed3 finalColor=reflCol * (1 - _RefractAmount) + refrCol * _RefractAmount;
  
  返回fixed4 (finalColor, 1);
  }
  
  ENDCG
  }
  }
  
  回退“Diffuse"
  }

以上就是关于统一材质如何模拟玻璃效果的内容,如果你们有学习到知识或者技能,可以把它分享出去让更多的人看的到。

统一材质如何模拟玻璃效果