赞
踩
感悟:
1、首先进行深度测试(是否开启)和深度检验,然后写入颜色缓冲,深度缓冲(深度缓冲要看是否开启深度写入)
2、颜色缓冲和深度写入是两个不同的东西,每次得到结果会写入颜色缓冲中
3、透明物体进行排序时,都考虑到有些情况会有循环覆盖物体遮挡的问题,但是还是没什么比较通用的解决方法(推荐的方法是分割网格),所以这就是渲染透明物体大家都谨慎的原因吧。(就像明知道有个渣男,却说忍忍吧的感觉)
总结:
透明效果可以通过两种方式实现:透明度测试、透明度混合。在实际应用中,我们大多选择透明度混合。
透明度测试:只要一个片元的透明度不满足条件,那么它会被舍弃。满足条件的会按照普通的不透明物体进行处理。
透明度混合:使用当前片元的透明度作为混合因子,与已经存储在颜色缓冲中的颜色值进行混合,得到新的颜色。但是透明度混合需要关闭深度写入,不关闭深度测试。
透明度测试代码:(使用clip函数)
- Shader "Custom/AlphaTest" {
- Properties {
- _Color ("Color Tint", Color) = (1, 1, 1, 1)
- _MainTex ("Main Tex", 2D) = "white" {}
- _Cutoff ("Alpha Cutoff", Range(0, 1)) = 0.5
- }
- SubShader {
- Tags {
- "Queue"="AlphaTest" "IgnoreProjector"="True" "RenderType"="TransparentCutout"}
-
- Pass {
- Tags { "LightMode"="ForwardBase" }
-
- CGPROGRAM
-
- #pragma vertex vert
- #pragma fragment frag
-
- #include "Lighting.cginc"
-
- fixed4 _Color;
- sampler2D _MainTex;
- float4 _MainTex_ST;
- fixed _Cutoff;
-
- struct a2v {
- float4 vertex : POSITION;
- float3 normal : NORMAL;
- float4 texcoord : TEXCOORD0;
- };
-
- struct v2f {
- float4 pos : SV_POSITION;
- float3 worldNormal : TEXCOORD0;
- float3 worldPos : TEXCOORD1;
- float2 uv : TEXCOORD2;
- };
-
- v2f vert(a2v v) {
- v2f o;
- o.pos = UnityObjectToClipPos(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 {
- fixed3 worldNormal = normalize(i.worldNormal);
- fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));
- fixed4 texColor = tex2D(_MainTex, i.uv);
- // Alpha test通过判断clip内的值若小于0对fragment进行discard
- clip (texColor.a - _Cutoff);
- fixed3 albedo = texColor.rgb * _Color.rgb;
- fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo;
- fixed3 diffuse = _LightColor0.rgb * albedo * max(0, dot(worldNormal, worldLightDir));
-
- return fixed4(ambient + diffuse, 1.0);
- }
-
- ENDCG
- }
- }
- FallBack "Transparent/Cutout/VertexLit"
- }
透明度混合代码:使用blend命令
- Shader "Custom/AlphaBlend" {
- Properties {
- _MainTex ("Main Tex", 2D) = "white" {}
- _AlphaScale ("Alpha Scale", Range(0, 1)) = 1
- }
- SubShader {
- Tags {
- "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}
-
- Pass {
- Tags { "LightMode"="ForwardBase" }
-
- ZWrite Off
- Blend SrcAlpha OneMinusSrcAlpha
-
- CGPROGRAM
-
- #pragma vertex vert
- #pragma fragment frag
-
- #include "Lighting.cginc"
-
- sampler2D _MainTex;
- float4 _MainTex_ST;
- fixed _AlphaScale;
-
- struct a2v {
- float4 vertex : POSITION;
- float3 normal : NORMAL;
- float4 texcoord : TEXCOORD0;
- };
-
- struct v2f {
- float4 pos : SV_POSITION;
- float3 worldNormal : TEXCOORD0;
- float3 worldPos : TEXCOORD1;
- float2 uv : TEXCOORD2;
- };
-
- v2f vert(a2v v) {
- v2f o;
- o.pos = UnityObjectToClipPos(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 {
- fixed3 worldNormal = normalize(i.worldNormal);
- fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));
- fixed4 texColor = tex2D(_MainTex, i.uv);
- fixed3 albedo = texColor.rgb;
- fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo;
- fixed3 diffuse = _LightColor0.rgb * albedo * max(0, dot(worldNormal, worldLightDir));
- return fixed4(ambient + diffuse, texColor.a * _AlphaScale);
- }
-
- ENDCG
- }
- }
- FallBack "Transparent/VertexLit"
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。