Unity3D Shader:高亮

C#代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Bloom : MonoBehaviour {
    //全屏泛光
    public Material mat;

    public int downscale;//分辨率

    public int sampleScale = 1;//高斯模糊半径

    public Color colorHold = Color.gray;//颜色阙值,提取高光点

    public Color bloomColor = Color.white;//高光颜色

    [Range(0.0f, 1.0f)]
    public float bloomFactor = 0.5f;//高光权重值

    private void OnRenderImage(RenderTexture source, RenderTexture destination)
    {
        RenderTexture temp1 = RenderTexture.GetTemporary(source.width >> downscale, source.height >> downscale, 0, source.format);
        RenderTexture temp2 = RenderTexture.GetTemporary(source.width >> downscale, source.height >> downscale, 0, source.format);

        Graphics.Blit(source, temp1);

        mat.SetVector("_colorHold", colorHold);
        Graphics.Blit(temp1, temp2, mat, 0);

        mat.SetVector("_offset", new Vector4(0, sampleScale, 0, 0));
        Graphics.Blit(temp2, temp1, mat, 1);
        mat.SetVector("_offset", new Vector4(sampleScale, 0, 0, 0));
        Graphics.Blit(temp1, temp2, mat, 1);

        mat.SetTexture("_BlurTex", temp2);
        mat.SetVector("_bloomColor", bloomColor);
        mat.SetFloat("_bloomFactor", bloomFactor);
        Graphics.Blit(source, destination, mat, 2);

        RenderTexture.ReleaseTemporary(temp1);
        RenderTexture.ReleaseTemporary(temp2);
    }
}


Shader代码:

Shader "Unlit/Test"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _BlurTex("BlurTex",2D)="white"{}
    }
    CGINCLUDE
    #include "UnityCG.cginc"
    
    struct v2f_colorHold
    {
        float4 pos:SV_POSITION;
        float2 uv:TEXCOORD0;
    };

    struct v2f_blur
    {
        float4 pos:SV_POSITION;
        float2 uv:TEXCOORD0;
        float4 uv01:TEXCOORD1;
        float4 uv23:TEXCOORD2;
        float4 uv45:TEXCOORD3;
    };

    struct v2f_bloom
    {
        float4 pos:SV_POSITION;
        float2 uv:TEXCOORD0;
    };

    sampler2D _MainTex;
    float4 _MainTex_TexelSize;
    sampler _BlurTex;
    float4 _BlurTex_TexelSize;
    float4 _offset;
    float4 _colorHold;
    float4 _bloomColor;
    float _bloomFactor;
    
    v2f_colorHold vert_colorHold(appdata_img v)
    {
        v2f_colorHold o;
        o.pos=UnityObjectToClipPos(v.vertex);
        o.uv=v.vertex.xy;
        return o;
    }
    fixed4 frag_colorHold(v2f_colorHold i):SV_Target
    {
        fixed4 col=tex2D(_MainTex,i.uv);

        return saturate(col-_colorHold);
    }
    
    v2f_blur vert_blur(appdata_img v)
    {
        v2f_blur o;
        _offset*=_MainTex_TexelSize.xyxy;
        o.pos=UnityObjectToClipPos(v.vertex);
        o.uv=v.vertex.xy;

        o.uv01=v.vertex.xyxy+_offset*float4(1,1,-1,-1);
        o.uv23=v.vertex.xyxy+_offset*float4(1,1,-1,-1)*2;
        o.uv45=v.vertex.xyxy+_offset*float4(1,1,-1,-1)*3;
        return o;
    }
    fixed4 frag_blur(v2f_blur i):SV_Target
    {
        fixed4 col=fixed4(0,0,0,0);
        col+=0.4*tex2D(_MainTex,i.uv);
        col+=0.15*tex2D(_MainTex,i.uv01.xy);
        col+=0.15*tex2D(_MainTex,i.uv01.zw);
        col+=0.10*tex2D(_MainTex,i.uv23.xy);
        col+=0.10*tex2D(_MainTex,i.uv23.zw);
        col+=0.05*tex2D(_MainTex,i.uv45.xy);
        col+=0.05*tex2D(_MainTex,i.uv45.zw);
        return col;
    }

    v2f_bloom vert_bloom(appdata_img v)
    {
        v2f_bloom o;
        o.pos=UnityObjectToClipPos(v.vertex);
        o.uv=v.vertex.xy;
        return o;
    }
    fixed4 frag_bloom(v2f_bloom i):SV_Target
    {
        fixed4 col=tex2D(_MainTex,i.uv);

        fixed4 blur=tex2D(_BlurTex,i.uv);

        fixed4 final=col+_bloomFactor*blur*_bloomColor;
        return final;
    }
    ENDCG
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100
        //提取高光点
        Pass
        {
            ZTest Off
            ZWrite Off
            Cull Off
            CGPROGRAM
            #pragma vertex vert_colorHold
            #pragma fragment frag_colorHold

            ENDCG
        }
        //高斯模糊
        Pass
        {
            ZTest Off
            ZWrite Off
            Cull Off
            CGPROGRAM
            #pragma vertex vert_blur
            #pragma fragment frag_blur

            ENDCG
        }
        //bloom混合
        Pass
        {
            ZTest Off
            ZWrite Off
            Cull Off
            CGPROGRAM
            #pragma vertex vert_bloom
            #pragma fragment frag_bloom

            ENDCG
        }
    }
}


原图:

Unity3D Shader:高亮_第1张图片

开启泛光:

Unity3D Shader:高亮_第2张图片

你可能感兴趣的:(Shader)