Unity3D shader(15)——材质(玻璃)
来源:互联网 发布:手机usb共享电脑网络 编辑:程序博客网 时间:2024/04/29 04:58
如有更多问题,请qq254033230咨询。
有了前面的基础,就可以随意用Unity Fragement Shader来实现自己想要的效果。
这里就主要以玻璃为例。
首先实现玻璃的透明的特性;
里面的Tags { "Queue" = "Transparent" }是为了实现透明的效果。Blend SrcAlpha OneMinusSrcAlpha为了显示透明的物体不改变后面的物体的显示效果。最后,颜色是一个思维数组,透明度是颜色的最后一个元素,所以用col[3]来表示透明度。_AlphaVal控制透明度。如果想实现彩色玻璃的效果,只需要改变_MainTint和_AlphaVal的值。
Shader "Custom/FragmentShader" {properties{ _MainTint("Main Color", Color) = (1, 1, 1, 1) _AlphaVal("Alpha", Range(0, 1)) = 0.1}SubShader { Tags { "Queue" = "Transparent" }PASS{Blend SrcAlpha OneMinusSrcAlphaCGPROGRAM#pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" #include "Lighting.cginc" float4 _MainTint; float _AlphaVal; struct v2f{ float4 pos:POSITION; float4 col:texcoord0; }; v2f vert(appdata_base v){ v2f o; o.pos=UnityObjectToClipPos(v.vertex); return o; } float4 frag(v2f IN):COLOR{ float4 col; col=_LightColor0*_MainTint; col[3]*=_AlphaVal; return col; }ENDCG}}FallBack "Diffuse"}
如果想玻璃效果更逼真,带上漫反射的光,加上环境光,以及自身的颜色的组合。
Shader "Custom/FragmentShader" {properties{ _MainTint("Main Color", Color) = (1, 1, 1, 1) _AlphaVal("Alpha", Range(0, 1)) = 0.1}SubShader { Tags { "Queue" = "Transparent" }PASS{Blend SrcAlpha OneMinusSrcAlphaCGPROGRAM#pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" #include "Lighting.cginc" float4 _MainTint; float _AlphaVal; struct v2f{ float4 pos:POSITION; float3 normal1:texcoord1; float4 vertex1:texcoord2; float4 col:texcoord0; }; v2f vert(appdata_base v){ v2f o; o.pos=UnityObjectToClipPos(v.vertex); o.normal1=v.normal; o.vertex1=v.vertex; return o; } float4 frag(v2f IN):COLOR{ float4 col= UNITY_LIGHTMODEL_AMBIENT; float3 N=UnityObjectToWorldNormal(IN.normal1); float3 L=normalize(WorldSpaceLightDir(IN.vertex1)); float diffuseScale=saturate(dot(N,L)); col+=_LightColor0*diffuseScale+_MainTint; col[3]*=_AlphaVal; return col; }ENDCG}}FallBack "Diffuse"}
如果想呈现周围景色,那么需要加上立方体贴图。用上立方体贴图,造成反射的假象。
Shader "Custom/FragmentShader" {properties{ _MainTint("Main Color", Color) = (1, 1, 1, 1) _AlphaVal("Alpha", Range(0, 1)) = 0.1 _CubeMap("CubeMap",CUBE)=""{}}SubShader { Tags { "Queue" = "Transparent" }PASS{Blend SrcAlpha OneMinusSrcAlphaCGPROGRAM#pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" #include "Lighting.cginc" samplerCUBE _CubeMap; float4 _MainTint; float _AlphaVal; struct v2f{ float4 pos:POSITION; float3 normal1:texcoord1; float4 vertex1:texcoord2; float3 R:texcoord3; float4 col:texcoord0; }; v2f vert(appdata_base v){ v2f o; o.pos=UnityObjectToClipPos(v.vertex); o.normal1=v.normal; o.vertex1=v.vertex; return o; } float4 frag(v2f IN):COLOR{ float4 col= UNITY_LIGHTMODEL_AMBIENT; float3 N=UnityObjectToWorldNormal(IN.normal1); float3 L=normalize(WorldSpaceLightDir(IN.vertex1)); float diffuseScale=saturate(dot(N,L)); col+=_LightColor0*diffuseScale+_MainTint; float3 N2=normalize(mul(IN.normal1,(float3x3)_World2Object)); float3 V= -WorldSpaceViewDir(IN.vertex1); col+=texCUBE(_CubeMap,reflect(V,N2)); col[3]*=_AlphaVal; return col; }ENDCG}}FallBack "Diffuse"}
阅读全文
0 0
- Unity3D shader(15)——材质(玻璃)
- unity3d 玻璃shader
- Unity3D 玻璃 Shader
- Unity3d Shader(三) Pass(Blending)带贴图的透明玻璃等
- Unity3D中简单地应用玻璃材质
- unity3d设置材质的shader
- Unity3D shader(3)——surface shader(二)
- Unity3D shader(1)——fixed shader
- Unity3D shader(5)——vertex shader(一)
- Unity3D Shader(8)——Vertex Shader(漫反射)
- Unity3D shader(20)——布料
- Unity3D笔记第二十一天——游戏特效处理,贴图材质与Shader
- 【猫猫的Unity Shader之旅】之玻璃材质
- 【猫猫的Unity Shader之旅】之玻璃材质
- Material Capture(材质捕捉) shader 学习
- Unity Shader 之 不锈钢(各向异性材质)
- Unity3D -- 图形 -- Shader 与材质的关系
- Unity3D -- 图形 -- Shader 与材质的关系
- Maven配置JDK版本
- 建立排序二叉树并中序遍历
- 【Docker】将RancherOS安装到硬盘
- RMAN基本命令集
- 竖式问题
- Unity3D shader(15)——材质(玻璃)
- HDU2896——病毒侵袭(AC自动机)
- 401. Binary Watch
- R语言 : 层次聚类分析
- 变分自编码器VAE(上)
- android 微信支付返回XML格式数据的解析方法
- effective C++ 条款十二解读
- 使用opencv2变换图片大小
- linux中的firewalld服务