您当前的位置: 首页 >  Jave.Lin unity

Unity PostProcess Shader - 14 - InnerGlow - 基于后效的内轮廓效果,类似 PhotoShop 图层的内发光

Jave.Lin 发布时间:2021-10-14 15:44:35 ,浏览量:3

文章目录
  • 思路
  • Shader
  • CSharp
    • Camera PP 脚本
    • Outline Renderer 提取器
    • OutlineManager
  • 效果

之前写的一个类似Photoshop中的图层的 内发光 效果

管线:built-in 管线 unity 版本:2019.4.30f1

思路
  • 得到内轮廓边缘:只要某个像素的 kernal size 范围内的,如 5x5 的 kernal size,只要某个 pixel(x,y) 像素不是全黑,并且 kernal size 核内的 sum 值小于 kernal size 平方,都算是边缘
  • 将内轮廓边缘模糊
  • 将模糊的边缘与 _SrcTex 做像素交集才显示
Shader
// jave.lin 2021/02/25
Shader "PP/InnerGlowPP"
{
    CGINCLUDE
        #include "UnityCG.cginc"

        // pure col
        float4 vert_pure_col(float4 vertex : POSITION) : SV_POSITION
        {
            return UnityObjectToClipPos(vertex);
        }
        fixed4 frag_pure_col() : SV_Target
        {
            return 1;
        }

        // inner glow
        Sampler2D _InnerGlowOrginTex;
        float4 _InnerGlowOrginTex_TexelSize;
        F _InnerGlowKernelSize;
        F _InnerGlowSize;
        struct a2v_inner_glow
        {
            float4 vertex : POSITION;
            float2 uv : TEXCOORD0;
        };
        struct v2f_inner_glow
        {
            float4 vertex : SV_POSITION;
            float2 uv : TEXCOORD0;
        };
        v2f_inner_glow vert_inner_glow (a2v_inner_glow v) {
            v2f_inner_glow o;
            o.vertex = UnityObjectToClipPos(v.vertex);
            o.uv = v.uv;
            return o;
        }
        fixed4 frag_inner_glow(v2f_inner_glow i) : SV_Target
        {
            fixed originV = 0;
            F sum = 0;
            int start = -_InnerGlowKernelSize;
            int count = _InnerGlowKernelSize + 1;
            int delta = count - start;
            int threhold = delta * delta;

            for (int x = start; x             
关注
打赏
1688896170
查看更多评论
0.0897s