美文网首页Android开发Android开发经验谈Android技术知识
简单的分析下Unity Shader·屏幕抖音效果

简单的分析下Unity Shader·屏幕抖音效果

作者: 不正经的创作者 | 来源:发表于2020-05-29 17:19 被阅读0次

    Unity Shader·屏幕抖音效果

    前言

    最近在做一个新的MMD(用Unity来实现),其中用到了一些好看的渲染技术在这里分享一下。

    视频链接

    https://www.bilibili.com/video/av86302041

    效果截图

    Shader

      Shader "Douyin"
      {
          Properties 
          {
              _MainTex("MainTex", 2D) = "white" {}
              scale("scale", float) = 1
          }
          SubShader
          {
              Pass
              {
                  CGPROGRAM
                  #pragma vertex vert
                  #pragma fragment frag
                  #include "UnityCG.cginc"
                  struct a2v
                 {
                      float4 vertex : POSITION;
                      float2 uv : TEXCOORD0;
                      };
                
                  struct v2f
                  {
                      float2 uv : TEXCOORD0;
                      float4 vertex : SV_POSITION;
                  };
                  sampler2D _MainTex;
                  float scale;
                
                  v2f vert (a2v v)
                  {
                      v2f o;
                      o.vertex = UnityObjectToClipPos(v.vertex);
                      o.uv = v.uv;
                      return o;
                  }
                  //为了达到最佳效果,将所有计算都写在了片段着色器内。
                  fixed4 frag (v2f i) : SV_Target
                  {
                      float2 textureCoordinate = i.uv;
                      float2 newTextureCoordinate = float2((scale - 1.0) *0.5 + 
      textureCoordinate.x / scale ,(scale - 1.0) *0.5 + textureCoordinate.y /scale);
                      fixed4 textureColor = tex2D(_MainTex, newTextureCoordinate);
                      fixed4 shiftColor1 = tex2D(_MainTex, 
      newTextureCoordinate+float2(-0.05 * (scale - 1.0), - 0.05 *(scale - 1.0)));
                     fixed4 shiftColor2 = tex2D(_MainTex, newTextureCoordinate+float2(-0.1 
      * (scale - 1.0), - 0.1 *(scale - 1.0)));
                      fixed3 blendFirstColor = fixed3(textureColor.r , textureColor.g, 
      shiftColor1.b);
                      fixed3 blend3DColor = fixed3(shiftColor2.r, blendFirstColor.g, 
      blendFirstColor.b);
                      return fixed4(blend3DColor, textureColor.a);
                  }
                  ENDCG
              }
          }
      }
    

    C#脚本

      using System;
      using System.Collections;
      using System.Collections.Generic;
      using UnityEngine;
    
      public class DouYin : PostEffectsBase
      {
          public Shader DouYinShader;
          private RenderTexture RTex;
    
          private Material douyintMaterial = null;
          public Material material
          {
              get
              {
                  douyintMaterial = CheckShaderAndCreateMaterial(DouYinShader, 
       douyintMaterial);
                  return douyintMaterial;
               }
          }
          public float scale = 1.0f;
    
          private void OnRenderImage(RenderTexture source, RenderTexture 
       destination)
          {
              if (material != null)
              {
                  material.SetTexture("_MainTex", RTex);
                  material.SetFloat("scale", scale);
                  Graphics.Blit(source, destination, material);
                  material.SetFloat("_EdgeOnly", 1);
                  Graphics.Blit(source, RTex, material);
              }
              else
              {
                  Graphics.Blit(source, destination);
              }
          }
      }
    

    相关文章

      网友评论

        本文标题:简单的分析下Unity Shader·屏幕抖音效果

        本文链接:https://www.haomeiwen.com/subject/tolfzhtx.html