Shader의 66번째 파트를 직접 만들어서 할 때가 거의 없어요.

12695 단어 Unityshadertech

쉐더를 할 시간이 얼마 안 남았어요.


하마터면 Shader를 할 뻔했다.쉐더를 할 시간이 많지 않을 것 같아서요.
100부까지 열심히 하겠습니다.10년이 걸려도 돼요.
100편의 글을 배웠다면 초보자라도 이해할 수 있을 것 같아요.
이렇게 하는 거야.
※ 초보자는 필기 레벨로 기록
기술 보도로는 도움이 안 될 것 같습니다.

미리 준비하다


아래 참조
Shader 파트 1Unite 2017 애니메이션을 볼 때가 많지 않아요. (기초지식~종이 스크레이퍼로 색깔 바꾸기)

데모


색상 곱하기 후효과와 흑백 후효과를 시도했다.

구조


On RenderImage라는 Unity 활동을 활용합니다.
On RenderImage는 카메라의 렌더링이 완료될 때 호출됩니다.
카메라 렌더링 결과의 픽셀의 경우 On RenderImage에 Shader 효과를 적용하여 사후 효과를 적용할 수 있습니다.
【참조 링크】: MonoBehaviour.OnRenderImage(RenderTexture,RenderTexture)

C#샘플


using UnityEngine;

/// <summary>
/// 自作ポストエフェクトを適用する
/// ImageEffectAllowedInSceneViewというアトリビュートを使うことでシーンビューにも反映される
/// </summary>
[ExecuteInEditMode, ImageEffectAllowedInSceneView]
public class CustomColorPostEffect : MonoBehaviour
{
    [SerializeField] private Material colorEffectMaterial;
    
    private enum UsePass
    {
        UsePass1,
        UsePass2
    }

    [SerializeField] private UsePass usePass;  
    
    private void OnRenderImage(RenderTexture src, RenderTexture dest)
    {
        Graphics.Blit(src, dest, colorEffectMaterial,(int)usePass);
    }
}
OnRenderImage(RenderTexture src, RenderTexture dest)의 두 매개변수는 모두 RenderTexture입니다.src는 Source이고 dest는 Destination이라는 뜻입니다.
각각 src=받은 렌더링 결과의 이미지,dest=대상의 이미지를 복사합니다.
On RenderImage 내에서 GraphicsBlit을 사용하여 받은 렌더링 결과의 이미지에 소재 효과를 적용하고 복사된 대상 이미지(최종 렌더링 결과)에 반영합니다.
네 번째 매개변수에 색인을 지정하여 Shader 경로를 선택할 수 있습니다.
【참조 링크】: Graphics.Blit

Shader 샘플


Shader "Custom/SimplePostEffect"
{
    Properties
    {
        //_MainTexを定義しておけば勝手に描画結果が入ってくるらしい
        _MainTex ("Texture", 2D) = "white" {}
        //カラー
        _EffectColor("EffectColor",Color) = (0,0,0,0)
    }
    SubShader
    {
        //パスを跨いで利用できる変数や関数をひとまとめにしておく
        CGINCLUDE
        #pragma vertex vert
        #pragma fragment frag

        #include "UnityCG.cginc"

        struct appdata
        {
            float4 vertex : POSITION;
            float2 uv : TEXCOORD0;
        };

        struct v2f
        {
            float4 vertex : SV_POSITION;
            float2 uv : TEXCOORD0;
        };

        sampler2D _MainTex;

        v2f vert(appdata v)
        {
            v2f o;
            o.vertex = UnityObjectToClipPos(v.vertex);
            o.uv = v.uv;
            return o;
        }
        ENDCG

        //色を変更するポストエフェクト
        Pass
        {
            CGPROGRAM
            float4 _EffectColor;

            float4 frag(v2f i) : SV_Target
            {
                //描画結果をサンプリング
                float4 renderingColor = tex2D(_MainTex, i.uv);
                return renderingColor * _EffectColor;
            }
            ENDCG
        }

        //モノクロになるポストエフェクト
        Pass
        {
            CGPROGRAM

            float4 frag(v2f i) : SV_Target
            {
                //描画結果をサンプリング
                float4 renderingColor = tex2D(_MainTex, i.uv);
                float monochrome = 0.3 * renderingColor.r + 0.6 * renderingColor.g + 0.1 * renderingColor.b;
                float4 monochromeColor = float4(monochrome.xxx, 1);
                return monochromeColor;
            }
            ENDCG
        }
    }
}
_MainTex를 정의하면 효과가 적용되기 전의 이미지를 얻을 수 있습니다.
그리고 이 이미지를 샘플링하여 부스러기 기계 안에서 가공하여 완성한 후의 효과.
효과를 전환하기 위해 두 개의 경로를 준비하세요.

데모 2


셰더를 바꾸면 다양한 표현을 할 수 있다.
예를 들어 소음과 지력을 가진 홀로그램의 표현을 적용했다면 다음과 같다.

【참조 링크】: 핸들 홀로그램 때문에 쉐더 할 부분 39
단색 처리도 합치면 아래의 느낌.

참조 링크


유닛에 후행진을 그려보고 싶어요.
[Unity 면도기 입문] Unity 후효과로 단색 화면 만들기

좋은 웹페이지 즐겨찾기