Post Processing Stack과 컨투어 셰이더를 함께 사용하여 컨투어를 빛냅니다.

12041 단어 ShaderUnity
Post Processing Stack과 윤곽 셰이더를 함께 사용하여 윤곽을 밝게합니다.



먼저 카메라에 연결할 윤곽 셰이더와 스크립트를 준비합니다.

셰이더의 Color 지정을 HDR로 하려면[HDR] Attribute를 붙여,
스크립트 측의 Inspector에서 HDR Color를 변경하려면[ColorUsage(true, true, 0f, 5f, 0.2f, 2f)]와 같이 ColorUsageAttribute를 지정합니다.

ScreenDepth.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace MyDepthDemo{
    [ExecuteInEditMode]
    public class ScreenDepth : MonoBehaviour {
        [SerializeField] Material m_DepthRenderMat;
        void OnRenderImage(RenderTexture src, RenderTexture dest)
        {
            Graphics.Blit (src, dest,m_DepthRenderMat);
        }
    }
}

ScreenEdgeEmitShader.shader
Shader "Custom/ScreenEdgeEmitShader" {
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        [HDR] _Color ("Emission Color", Color) = (0,0,0)
        _EdgeWidth ("Edge Width", Range(0, 10)) = 1
        _Sensitivity ("Depth Sensitivity", Range(0, 10)) = 1
    }
    CGINCLUDE
    #include "UnityCG.cginc"
    sampler2D _MainTex;
    sampler2D_float _CameraDepthTexture;
    float4 _Color;
    float _EdgeWidth;
    float _Sensitivity;

    struct v2f {
        float2 uv : TEXCOORD0;
    };

    float edgeCheck(float2 i_uv){
        float2 txSize = 1/_ScreenParams.xy*_EdgeWidth;
        float2 base_uv = i_uv - txSize*0.5;
        float2 uv0 = base_uv;
        float2 uv1 = base_uv + txSize.xy;
        float2 uv2 = base_uv + float2(txSize.x, 0);
        float2 uv3 = base_uv + float2(0, txSize.y);

        // Convert to linear depth values.
        float z0 = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv0));
        float z1 = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv1));
        float z2 = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv2));
        float z3 = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv3));

        // Roberts cross operator
        float zg1 = z1 - z0;
        float zg2 = z3 - z2;
        return saturate(sqrt(zg1 * zg1 + zg2 * zg2)*_Sensitivity);
    }

    fixed4 frag (v2f i, UNITY_VPOS_TYPE screenPos : VPOS) : SV_Target
    {
        float z0 = edgeCheck(screenPos.xy/(_ScreenParams.xy));
        fixed4 c = tex2D (_MainTex, i.uv);
        c.rgb += z0*_Color.rgb;
        return c;
    }
    ENDCG

    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100
        ZTest Always Cull Off ZWrite Off
        Pass
        {
            CGPROGRAM
            #pragma vertex vert_img
            #pragma fragment frag
            #pragma target 3.0
            ENDCG
        }
    }
}

위의 셰이더가 적용된 머티리얼을 만들고 스크립트와 함께 카메라에 연결합니다.



카메라의 AllowHDR을 선택하고 연결할 위치는 PostProsessingBehaviour보다 높아야 합니다.

엣지가 나오는 것은 모두 빛나 버리므로 (Unlit나 반투명은 빛나지 않습니다) 사용소는 어려울 것 같습니다만, 카메라의 방향에 맞추어 Color를 변화시켜 주면 에모인 씬에 사용할 수 있을지도?

비슷한 방식으로 전체 화면이 아닌 모형에 모서리를 내는 방법은 여기입니다.

좋은 웹페이지 즐겨찾기