这个教程涵盖了各种各样的关于透明纹理贴图的共用,i.e.RGBA 纹理贴图包含了一个A(alpha)部分 是纹理的不透明的值。
它联合了shader的代码关于“Textured sphere”部分的概念,介绍了 “cutaways”和”Transparency”。
如果你没有读过这篇教程,这将会是一个很好的机会来阅读。
让我们开始说明丢弃片段的”cutaways”部分。按照这些步骤描述的在”Texture Spheres”部分,并把图像分配给材质球的左边根据以下shader :
Shader "Cg texturing with alpha discard" { Properties { _MainTex ("RGBA Texture Image", 2D) = "white" {} _Cutoff ("Alpha Cutoff", Float) = 0.5 } SubShader { Pass { Cull Off // since the front is partially transparent, // we shouldn't cull the back CGPROGRAM #pragma vertex vert #pragma fragment frag uniform sampler2D _MainTex; uniform float _Cutoff; struct vertexInput { float4 vertex : POSITION; float4 texcoord : TEXCOORD0; }; struct vertexOutput { float4 pos : SV_POSITION; float4 tex : TEXCOORD0; }; vertexOutput vert(vertexInput input) { vertexOutput output; output.tex = input.texcoord; output.pos = mul(UNITY_MATRIX_MVP, input.vertex); return output; } float4 frag(vertexOutput input) : COLOR { float4 textureColor = tex2D(_MainTex, input.tex.xy); if (textureColor.a < _Cutoff) // alpha value less than user-specified threshold? { discard; // yes: discard this fragment } return textureColor; } ENDCG } } // The definition of a fallback shader should be commented out // during development: // Fallback "Unlit/Transparent Cutout" }
片段着色器读取RGBA贴图并与用户指定的范围值大小比较alpha值。如果 alpha值比范围值小,就丢弃着色片段使之透明。注意: 这项指令在某些平台上是非常缓慢的,特别是在移动设备上。因此,混合(blending)通常更有效。
“Transparency”部分描述了怎样用alpha混合去渲染半透明的物体。在这段代码中用RGBA贴图:
Shader "Cg texturing with alpha blending" { Properties { _MainTex ("RGBA Texture Image", 2D) = "white" {} } SubShader { Tags {"Queue" = "Transparent"} Pass { Cull Front // first render the back faces ZWrite Off // don't write to depth buffer // in order not to occlude other objects Blend SrcAlpha OneMinusSrcAlpha // blend based on the fragment's alpha value CGPROGRAM #pragma vertex vert #pragma fragment frag uniform sampler2D _MainTex; uniform float _Cutoff; struct vertexInput { float4 vertex : POSITION; float4 texcoord : TEXCOORD0; }; struct vertexOutput { float4 pos : SV_POSITION; float4 tex : TEXCOORD0; }; vertexOutput vert(vertexInput input) { vertexOutput output; output.tex = input.texcoord; output.pos = mul(UNITY_MATRIX_MVP, input.vertex); return output; } float4 frag(vertexOutput input) : COLOR { return tex2D(_MainTex, input.tex.xy); } ENDCG } Pass { Cull Back // now render the front faces ZWrite Off // don't write to depth buffer // in order not to occlude other objects Blend SrcAlpha OneMinusSrcAlpha // blend based on the fragment's alpha value CGPROGRAM #pragma vertex vert #pragma fragment frag uniform sampler2D _MainTex; uniform float _Cutoff; struct vertexInput { float4 vertex : POSITION; float4 texcoord : TEXCOORD0; }; struct vertexOutput { float4 pos : SV_POSITION; float4 tex : TEXCOORD0; }; vertexOutput vert(vertexInput input) { vertexOutput output; output.tex = input.texcoord; output.pos = mul(UNITY_MATRIX_MVP, input.vertex); return output; } float4 frag(vertexOutput input) : COLOR { return tex2D(_MainTex, input.tex.xy); } ENDCG } } // The definition of a fallback shader should be commented out // during development: // Fallback "Unlit/Transparent" }
未完待续。。。。
by-----wolf96
unity3d 内部Transparent (透明)shader 代码
原文地址:http://blog.csdn.net/wolf96/article/details/40421769