本系列主要參考《Unity Shaders and Effects Cookbook》一书(感谢原书作者),同一时候会加上一点个人理解或拓展。
这里是本书全部的插图。这里是本书所需的代码和资源(当然你也能够从官网下载)。
========================================== 切割线 ==========================================
从这篇開始是一个全新的章节:透明效果(Transparency)。之前在制作LOGO闪光效果的时候就一直调不出来背景透明。就是那个时候决定要学一下Shader的基础知识,不求成为多么厉害的大神。仅仅望对渲染的内部原理有些许了解~
開始正文。
在我们学习怎样编写透明的Surface Shader的開始,我们须要理解应该包括哪些代码使得我们能够开启透明效果。
Unity再一次大方地为我们提供了一些内置參数,我们能够通过包括这些參数来高速得到透明效果。
这是通过在Shader的#pragma声明中加入alpha參数来实现的。这句话告诉Unity我们想要在Shader中使用透明度。但当我们在创建透明Shaders时,须要细致考虑一些事情。那就是代码中元素的绘制顺序。这篇文章将会讲述一些基本问题,来得到一个非常easy的透明物体。
在以下的章节中,将会解说其它有关透明度的问题。
和曾经一样,我们须要创建一个新的场景。
Properties { _MainTex ("Base (RGB)", 2D) = "white" {} _TransVal ("Transparency Value", Range(0,1)) = 0.5 }
Tags { "Queue"="Transparent" }
CGPROGRAM #pragma surface surf Lambert alpha
void surf (Input IN, inout SurfaceOutput o) { half4 c = tex2D (_MainTex, IN.uv_MainTex); o.Albedo = c.rgb; o.Alpha = c.b * _TransVal; }
Shader "Custom/SimpleAlpha" { Properties { _MainTex ("Base (RGB)", 2D) = "white" {} _TransVal ("Transparency Value", Range(0,1)) = 0.5 } SubShader { Tags { "RenderType"="Opaque" "Queue"="Transparent"} LOD 200 CGPROGRAM #pragma surface surf Lambert alpha sampler2D _MainTex; float _TransVal; struct Input { float2 uv_MainTex; }; void surf (Input IN, inout SurfaceOutput o) { half4 c = tex2D (_MainTex, IN.uv_MainTex); o.Albedo = c.rgb; o.Alpha = c.b * _TransVal; } ENDCG } FallBack "Diffuse" }
这类Shader依赖三个元素:正确设置Shader渲染队列,#pragma声明中的alpha參数,以及在SurfaceOutput结构体中的Alpha值。
比如,当我们使用例如以下语句控制透明度:
o.Alpha = c.r * _TransVal
在以下的章节中,我们将開始怎样在实时渲染中使用alpha通道或者半透明的Shader。
【Unity Shaders】Transparency —— 使用alpha通道创建透明效果
原文:http://www.cnblogs.com/liguangsunls/p/7353378.html