Shader의 27번째 부분을 파동 방정식과 Custom Render Texture로 파문을 그릴 때가 많지 않아요.

15180 단어 Unityshadertech

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


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

미리 준비하다


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

데모


Inspector를 조금 조작해야 해요. 확인했어요.

CustomRenderTexture


Custom의 RenderTexture가 가능한 것 같습니다.
일단 RenderTexture가 뭐였죠?그래서 찾아봤는데
다음과 같은 기술이 있다.
【인용원】: Render Texture
A Render Texture is a type of Texture that Unity creates and updates at run time.
용도가 여러 가지가 있는 것 같아요.
카메라의 그림 결과를 부 모니터에 상영합니다
비디오를 스크린으로 붙여넣을 수 있습니다.
Custom RenderTexture로 돌아가기
그 RenderTexture를 확장할 수 있습니다.
Texture 그리기 작업은 Shader에서 확장 가능
복잡한 계산 처리를 거친 Texture를 사용할 수 있습니다.
【참조 링크】: Custom RenderTexture를 사용하여 물결 모양 만들기

Shader 샘플


먼저 Custom RenderTexture에 사용된 Shader입니다.
Shader "Custom/CustomRenderRipple"
{
    Properties
    {
        _S2("PhaseVelocity^2", Range(0.0, 0.5)) = 0.2
        _Attenuation("Attenuation", Range(0.0, 1.0)) = 0.999
        _DeltaUV("Delta UV", Float) = 0.1
    }

    SubShader
    {
        Pass
        {
            CGPROGRAM
            #pragma vertex CustomRenderTextureVertexShader //専用の定義済みvertexシェーダ関数
            #pragma fragment frag

            #include "UnityCustomRenderTexture.cginc" //専用のcgincファイル

            half _S2;
            half _Attenuation;
            float _DeltaUV;
            sampler2D _MainTex;

            float4 frag(v2f_customrendertexture i) : SV_Target
            {
                float2 uv = i.globalTexcoord;

                // 1pxあたりの単位を計算する
                float du = 1.0 / _CustomRenderTextureWidth;
                float dv = 1.0 / _CustomRenderTextureHeight;
                float2 duv = float2(du, dv) * _DeltaUV;

                // 現在の位置のテクセルをフェッチ
                float2 c = tex2D(_SelfTexture2D, uv);

                //波動方程式
                //h(t + 1) = 2h + c(h(x + 1) + h(x - 1) + h(y + 1) + h(y - 1) - 4h) - h(t - 1)
                //今回、h(t + 1)は次のフレームでの波の高さを表す
                //R,Gをそれぞれ高さとして使用
                float k = (2.0 * c.r) - c.g; //2h - h(t - 1) を先に計算
                float p = (k + _S2 * ( //_S2は係数 位相の変化する速度
                    tex2D(_SelfTexture2D, uv + duv.x).r +
                    tex2D(_SelfTexture2D, uv - duv.x).r +
                    tex2D(_SelfTexture2D, uv + duv.y).r +
                    tex2D(_SelfTexture2D, uv - duv.y).r - 4.0 * c.r)
                ) * _Attenuation; //減衰係数

                // 現在の状態をテクスチャのR成分に、ひとつ前の(過去の)状態をG成分に書き込む。
                return float4(p, c.r, 0, 0);
            }
            ENDCG
        }
    }
}
위대한 다음 참고 링크의 전체 내용
Custom RenderTexture용 cginc를 준비했습니다.
이를 사용하여 RenderTexture를 확장할 수 있습니다.
상세한 설정도 아래 링크에 상세하게 기재되어 있으니 놓치지 마세요.
【참조 링크】: Custom RenderTexture를 사용하여 물결 모양 만들기
파동 방정식에 관해서는 다음 영상을 만 번 정도 보면 이해할 수 있을 것 같다.
나는 5000번 보고 이해한 상태로 계속 전진하기로 했다.

Custom RenderTexture를 소재로 하는 Texture


방금 제작된 커스텀 렌더텍처를 소재로 한 텍스터.
단지 종이 파쇄 블레이드를 텍스처로 처리하기 때문에 매우 간단하다.

Shader 샘플


Shader "Custom/RippleSimulation"
{
    Properties
    {
        _CustomRendererTex("Custom Renderer Texture", 2D) = "gray" {}
    }

    SubShader
    {
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"

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

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

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

            fixed4 frag(v2f i) : SV_Target
            {
                //カスタムレンダーテクスチャーのピクセル情報を使用
                return tex2D(_CustomRendererTex, i.uv);
            }
            ENDCG
        }
    }
}
이후 위 Shader가 적용된 재료를 Plane으로 설정하면 된다.

참조 링크


수면을 만들어 봤어요.
CustomRenderTexture
Unity 2017.1 기능을 사용한 Custom RenderTexture
WaveShooter

좋은 웹페이지 즐겨찾기