主角遮挡渲染轮廓线方案

来源:互联网 发布:ubuntu snmpwalk 安装 编辑:程序博客网 时间:2024/05/21 10:25

1.在前向渲染中,直接使用下面Shader就可以实现。

2.在延迟渲染中,由于光源是后边计算的,所以不能直接使用该shader,直接使用会导致像素颜色参与光照等计算显示不对,方案有如下:

一.使用Graphics.DrawMeshNow()去实时渲染主角轮廓线,提前设置好材质的pass,该方案遇到一个问题 渲染无法实时根据主角动画变化。

二.使用动态shader替换,还是会出现1的现象。

三.使用camera.RenderWithShader在屏幕后处理阶段实时重新渲染轮廓线.首先把主角shader替换 只给subshader增加一个tag标记,然后RenderWithShader的时候过滤该tag。最后因为是屏幕后处理和其他场景颜色混合 所以下边的shader用不了。需要两个pass第一个用来stencil 标记ztest leqal的。然后第二个pass过滤第一个的标记部分再用ztest greater ,不然直接一个pass 会渲染很多东西。另外第二个pass需要 blend one one 因为主角etc alpha是0  颜色输出 直接输出一个固定值就行了 不需要另外计算。如果其他角色挡住玩家也不需要透视,那么其他玩家也需要进行pass0的模板测试。

camera.clearFlags=CameraFlags.Nothing;
camera.SetTargetBuffers(rt.colorBuffer,rt.depthBuffer)//设置当前相机的渲染目标RenderTarget//和camera.targetTexture类似。
camera.RenderWithShader(shader,"RenderType")



-------------------------------

Shader "PengLu/OccTransVF"     {        Properties         {             _MainTex ("Base (RGB)", 2D) = "white" {}            _RimColor("RimColor",Color) = (0,1,1,1)          _RimPower ("Rim Power", Range(0.1,8.0)) = 1.0      }                SubShader         {                      LOD 300            Tags { "Queue" = "Geometry+500" "RenderType"="Opaque" }           Pass          {              Blend SrcAlpha One              ZWrite off              Lighting off                ztest greater                CGPROGRAM              #pragma vertex vert              #pragma fragment frag              #include "UnityCG.cginc"                float4 _RimColor;              float _RimPower;                            struct appdata_t {                  float4 vertex : POSITION;                  float2 texcoord : TEXCOORD0;                  float4 color:COLOR;                  float4 normal:NORMAL;              };                struct v2f {                  float4  pos : SV_POSITION;                  float4  color:COLOR;              } ;              v2f vert (appdata_t v)              {                  v2f o;                  o.pos = mul(UNITY_MATRIX_MVP,v.vertex);                  float3 viewDir = normalize(ObjSpaceViewDir(v.vertex));                  float rim = 1 - saturate(dot(viewDir,v.normal ));                  o.color = _RimColor*pow(rim,_RimPower);                  return o;              }              float4 frag (v2f i) : COLOR              {                  return i.color;               }              ENDCG          }          pass            {                ZWrite on              ZTest less                 CGPROGRAM                #pragma vertex vert                #pragma fragment frag                sampler2D _MainTex;                float4 _MainTex_ST;                              struct appdata {                    float4 vertex : POSITION;                    float2 texcoord : TEXCOORD0;                };                              struct v2f  {                    float4 pos : POSITION;                    float2 uv : TEXCOORD0;                };                              v2f vert (appdata v)               {                    v2f o;                    o.pos = mul(UNITY_MATRIX_MVP,v.vertex);                    o.uv = v.texcoord;                    return o;                }                              float4 frag (v2f i) : COLOR                {                    float4 texCol = tex2D(_MainTex, i.uv);                    return texCol;                }                ENDCG            }        }       FallBack "Diffuse"   }    


}

原创粉丝点击