您的位置:首页 > 移动开发 > Unity3D

UnityShader入门精要学习笔记(十一):透明效果-下部分

2017-07-08 18:47 1001 查看
一.混合命令

(1)基本定义

源颜色——Src:片元着色器产生的颜色值

目标颜色——Dst:从颜色缓冲区取到的颜色值

(2)混合因子



上面的命令都是RGB通道的混合因子和A通道的混合因子都是一样的,如果希望使用不同的参数来混合Alpha通道,就可以利用:

Blend SrcFactor DstFactor,SrcFactorA DstFactorA


例:

Blend SrcAlpha OnMinusSrcAlpha,One Zero


(3)混合操作





二.双面渲染的透明度效果

前面的学习的例子中,我们无法看清正方体内部以及其背面的形状,这是因为默认情况下渲染引擎剔除了物体的背面(相对于摄像机方向)的渲染图元,而仅仅渲染了物体的正面。

使用Cull命令来控制剔除哪个面的渲染图元。

Cull Back | Front | Off

代码实践:

// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'

Shader "Custom/Edu/AlphaBlendBothSide" {
Properties {
_Color ("Color", Color) = (1,1,1,1)
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_AlphaScale("AlphaScale",Range(0,1)) = 0.5

}
SubShader {
Tags{"Queue" = "Transparent" "RenderType" = "Transparent" "IgnoreProjector" = "true"}
//进行深度写入之后背面渲染的图元将会被替换掉
//      Pass
//      {
//          Zwrite On
//          ColorMask 0
//      }
//第一个Pass只渲染背面,第二个Pass之渲染正面,注意这个顺序很重要!!!!
Pass
{
Tags{"LightMode" = "ForwardBase"}
ZWrite Off
Cull Front
Blend SrcAlpha OneMinusSrcAlpha
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
#include "Lighting.cginc"

fixed4 _Color;
sampler2D _MainTex;
float4 _MainTex_ST;
float _AlphaScale;

struct a2v
{
float4 vertex:POSITION;
float3 normal:NORMAL;
float4 texcoord:TEXCOORD0;
};

struct v2f
{
float4 pos:SV_POSITION;
float3 worldPos:TEXCOORD0;
float3 worldNormal:TEXCOORD1;
float2 uv:TEXCOORD2;
};

v2f vert(a2v v)
{
v2f o;
o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
o.worldNormal = UnityObjectToWorldNormal(v.normal);
o.worldPos = mul(unity_ObjectToWorld,v.vertex).xyz;
o.uv = TRANSFORM_TEX(v.texcoord,_MainTex);
return o;
}

fixed4 frag(v2f i):SV_Target
{
float3 worldLightDir = normalize( UnityWorldSpaceLightDir(i.worldPos) );

float3 worldNormal = normalize( i.worldNormal );

fixed4 texColor = tex2D(_MainTex,i.uv);

fixed3 albedo = texColor.rgb * _Color.rgb;

fixed3 diffuse = _LightColor0.rgb * albedo * saturate(dot(worldNormal,worldLightDir));

fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo;

return fixed4(ambient + diffuse, texColor.a * _AlphaScale);
}

ENDCG
}

Pass
{
Tags{"LightMode" = "ForwardBase"}
ZWrite Off
Cull Back
Blend SrcAlpha OneMinusSrcAlpha
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
#include "Lighting.cginc"

fixed4 _Color;
sampler2D _MainTex;
float4 _MainTex_ST;
float _AlphaScale;

struct a2v
{
float4 vertex:POSITION;
float3 normal:NORMAL;
float4 texcoord:TEXCOORD0;
};

struct v2f
{
float4 pos:SV_POSITION;
float3 worldPos:TEXCOORD0;
float3 worldNormal:TEXCOORD1;
float2 uv:TEXCOORD2;
};

v2f vert(a2v v)
{
v2f o;
o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
o.worldNormal = UnityObjectToWorldNormal(v.normal);
o.worldPos = mul(unity_ObjectToWorld,v.vertex).xyz;
o.uv = TRANSFORM_TEX(v.texcoord,_MainTex);
return o;
}

fixed4 frag(v2f i):SV_Target
{
float3 worldLightDir = normalize( UnityWorldSpaceLightDir(i.worldPos) );

float3 worldNormal = normalize( i.worldNormal );

fixed4 texColor = tex2D(_MainTex,i.uv);

fixed3 albedo = texColor.rgb * _Color.rgb;

fixed3 diffuse = _LightColor0.rgb * albedo * saturate(dot(worldNormal,worldLightDir));

fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo;

return fixed4(ambient + diffuse, texColor.a * _AlphaScale);
}

ENDCG
}
}
//注意原来的FallBack我用的是Diffuse,那样的话会投射阴影
//下面这个FallBack不会自动投射阴影
FallBack "Transparent/VertexLit"
}


效果图:



4000
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: