আমি কীভাবে পর্দায় প্রাকৃতিক বৃষ্টি ফোঁটা করতে পারি?


11

আমি বৃষ্টি প্রভাব ড্রপ করতে চেষ্টা করছি metaballs shadertoy মধ্যে একটা সূত্র পাই screen.I এবং লেজ কিন্তু আমি বুঝতে পারে না কিভাবে বাস্তবায়িত:

https://www.shadertoy.com/view/ltffzl

দুর্ভাগ্যক্রমে এর অনেক গণিতের গণনা আছে এবং আমি এটি একতাতে ব্যবহার করতে পারি না কারণ এটি একটি ল্যাগ তৈরি করে ob

এখানে চিত্র বর্ণনা লিখুন

আমার ধারণাটি একটি টেক্সচার এবং ট্রেলার উপস্থাপককে ড্রপিংয়ের জন্য ব্যবহার করছে তবে কীভাবে আমি ধাতবগুলি প্রভাব ফেলতে পারি? এখানে চিত্র বর্ণনা লিখুন


হালনাগাদ

আমি এই নিবন্ধটি দ্বারা মেটাবলগুলি প্রয়োগ করতে পারি

https://github.com/smkplus/RainFX/tree/master

তবে ট্রেইল সম্পর্কে আমার ধারণা নেই

উত্তর:


11

আমি মনে করি যে আপনি "জল যেদিকে একটি মানচিত্র গণনা করুন" সেই মানচিত্রটি থেকে "+" একটি সাধারণ ভেক্টর তৈরি করুন এবং এটি একটি ব্যাকগ্রাউন্ড টেক্সচার লুক অফসেট করতে ব্যবহার করুন "হিসাবে আপনি এই প্রভাবটির কথা ভাবেন think

আপনার উদাহরণ শেডারটোয় যা করে তা ভেঙে, ডিফগিংটি কোথায় ঘটে তা দেখানোর জন্য এটি একটি "ট্রেইল" গণনা করে:

এখানে চিত্র বর্ণনা লিখুন

বৃত্তাকার বৃষ্টিপাতের স্বাভাবিকের গণনা করে,

এখানে চিত্র বর্ণনা লিখুন

এবং জাল প্রতিসরণ একটি টেক্সচার লুক অফসেট করতে যে সাধারণ মানচিত্র ব্যবহার করে।

আপনি যদি একটি শেডারে পোস্ট প্রসেসিংয়ের মাধ্যমে ট্রেইলগুলি করতে চান তবে কিছু বীজগণিত ব্যবহার করে শ্যাডারে আপনাকে "ট্রেইল" আকৃতিটি তৈরি করা উচিত। উদাহরণস্বরূপ, নিম্নলিখিত ফাংশনে, আমি একটি "দোলা দিয়ে পথ" এবং মাথা এবং লেজে একটি টেপার পেতে ওভারলাইড করেছি

float trailDrop(vec2 uv, vec2 id, float t) { 
    // wobbly path
    float wobble = 0.5 + 0.5 
        * cos(120.0 * uv.y) 
        * sin(50.0 * uv.y);
    float v = 1.0 - 10.0 * abs(uv.x - 0.5 + 0.2 * wobble);
    // head
    v *= clamp(30.0 * uv.y, 0.0, 1.0);
    v *= clamp( uv.y + 7.0 * t - 0.6, 0.0, 1.0);
    // tail
    v *= clamp(1.0 - uv.y - pow(t, 2.0), 0.0, 1.0);
    return clamp(v * 10.0, 0.0, 1.0);
}

এখানে শেডারটোয় মোটামুটি পোকা রয়েছে - https://www.shadertoy.com/view/XlBfz1 একটি সেট তৈরি করে দেখায়। ডেরিভেটিভস রেজোলিউশনের কারণে এটি ছোট রেজোলিউশনে দানাদার দেখাচ্ছে তবে আপনি যদি এটি পূর্ণ স্ক্রিন করেন তবে আরও ভাল দেখানো উচিত।

সম্পাদনা করুন: ওভারলাইড বৃষ্টিপাতের সাথে একটি উদাহরণ যুক্ত করা হয়েছে

এখানে চিত্র বর্ণনা লিখুন

পাঠকের কাছে অনুশীলন হিসাবে বাম:

1) ছোট বৃত্তাকার ড্রপ যোগ করুন। অনুপ্রেরণার জন্য, দেখুনStaticDrops আপনার আসল শেডারটোয় উদাহরণে ফাংশনটি ।

2) উচ্চ মানের সাধারণ গণনা যুক্ত করুন। হিসাবে#define CHEAP_NORMALS আপনার মূল shadertoy উদাহরণে বিকল্প বোঝা যায়, builtin dFdx কম বিশ্বস্ততা পড়তা এবং আপনি ম্যানুয়ালি (ফাংশন 3 বার গণক খরচে) ডেরাইভেটিভস গণক আরো ভাল ফলাফল পেতে পারেন।

3) কলামগুলির মধ্যে ফাঁকা স্থানটিকে এলোমেলো করে। আপনি এক্সগুলি uv.x - 0.5 + 0.2 * wobbleঅক্ষরে একটি র্যান্ডম অফসেট যুক্ত করতে কলামগুলি প্রশস্ত করতে পারেন এবং তারপরে বিটটি সংশোধন করতে পারেন। আপনি সম্ভবত একবারে মূল উদাহরণটি থেকে কোনও পৃষ্ঠা বের করতে এবং কম অভিন্ন চেহারা পেতে একে অপরের উপরের স্ট্রিমের কয়েকটি আকারের কয়েকটি স্তর রেখে দিতে চাইবেন।



@ ডিএমজি গ্রেগরী মেটাবলের মন্তব্য অপসারণ
জিমি

লেজ নিজেই একটি বাফারের মাধ্যমে, বিবর্ণ হয়ে (ওল্ডভ্যালু *।
সৈয়দ মুর্তেজা কমালি

এই shadertoy.com/view/4dy3zR এর মত কিছু আমি শোরগোল করার চেষ্টা করেছি কিন্তু আমি পারিনি
Seided Morteza Kamali

7

আপনি নীচের পদক্ষেপগুলি অনুসরণ করে এই প্রভাবটি তৈরি করতে পারেন:

কণা

কণা

RenderTextuer

আপনি রেন্ডার টেক্সচার ব্যবহার করে ফলাফল সংরক্ষণ করতে পারেন। এটি শেডারটোয় গুণমানের উদাহরণ:

https://www.shadertoy.com/view/ltccRl

আইজিগো কুইলিজ: শেদার্টোয় প্রতি "বাফার" এর জন্য একাধিক পাস ব্যবহার করেন। নামটি ইঙ্গিত হিসাবে, এটি পাস করে ফলাফলগুলি একটি বাফারে সংরক্ষণ করে। একটি বাফার কেবল একটি টেক্সচার। Ityক্য আপনাকে টেক্সচারগুলিকেও রেন্ডার করতে দেয়।

রেন্ডার টেক্সচারে রেন্ডারিং কণায় একটি ক্যামেরা তৈরি করেছি:

কুঠার

RenderTexture

GrabPassing

আপনি বিকৃতি প্রয়োগের জন্য পাস দখল করতে পারেন

আমি এই পোস্টে এটি ব্যাখ্যা:

আমি কীভাবে কোয়ান্টাম ব্রেকের বিকৃতি কণা প্রভাব প্রতিলিপি করতে পারি?

দাগ

লাইফটাইমের ওপরে রঙে আলফা ব্যবহার করে আমাদের সহজ ঝাপসা

alphaovertime

gradiant

আরও ভাল ফলাফল পেতে সাধারণ ঝাপসা ব্যবহার করা আরও ভাল তবে আমরা কীভাবে অস্পষ্টতা অর্জন করব?

কনভলিউশন ম্যাট্রিক্স

চিত্র প্রক্রিয়াকরণে, একটি কার্নেল, কনভলিউশন ম্যাট্রিক্স বা মাস্ক একটি ছোট ম্যাট্রিক্স। এটি অস্পষ্ট, তীক্ষ্ণকরণ, এম্বসিং, প্রান্ত সনাক্তকরণ এবং আরও অনেক কিছুতে ব্যবহৃত হয়। এটি কার্নেল এবং একটি চিত্রের মধ্যে একটি সমঝোতা করে সম্পন্ন হয়।

আরও তথ্যের জন্য, দয়া করে এই লিঙ্কটি অনুসরণ করুন

শাঁস

 Shader "Smkgames/Convolution"
    {
        Properties
        {
            _MainTex ("Texture", 2D) = "white" {}
            [Enum(kerEdgeDetectionA,1,kerEdgeDetectionB,2,kerEdgeDetectionC,3,kerSharpen,4,kerBoxBlur,5)]
            _Kernel("Kernel", Float) = 1
        }
        SubShader
        {
            // No culling or depth
            Cull Off ZWrite Off ZTest Always

            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;
                };

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

                sampler2D _MainTex;
                float4 _MainTex_TexelSize;

                float3x3 GetData(int channel, sampler2D tex, float2 uv, float4 size)
                {
                    float3x3 mat;
                    for (int y=-1; y<2; y++)
                    {  
                        for(int x=-1; x<2; x++)
                        {      
                            mat[x+1][y+1]=tex2D(tex, uv + float2(x*size.x, y*size.y))[channel];
                        }              
                    }
                    return mat;
                }
                float3x3 GetMean(float3x3 matr, float3x3 matg, float3x3 matb)
                {
                    float3x3 mat;
                    for (int y=0; y<3; y++)
                    {  
                        for(int x=0; x<3; x++)
                        {
                            mat[x][y] = (matr[x][y] + matg[x][y] + matb[x][y]) / 3.0;
                        }
                    }
                    return mat;
                }

                float Convolve(float3x3 kernel, float3x3 pixels, float denom, float offset)
                {
                    float res = 0.0;
                    for (int y=0; y<3; y++)
                    {  
                        for(int x=0; x<3; x++)
                        {
                            res += kernel[2-x][2-y]*pixels[x][y];
                        }
                    }

                    return  res;
                }

                float _Kernel;

                fixed4 frag (v2f i) : SV_Target
                {


                    float3x3 kerEdgeDetectionA = float3x3 (    0.0,  0,  -1.0,
                                                        1.0,  0,  -1.0,
                                                        0.0,  1.0,  0.0);

                   float3x3 kerEdgeDetectionB = float3x3 (0.0,  1.0,  0.0,
                                                 1.0, -4.0,  1.0,
                                                 0.0,  1.0, 0.0);

                   float3x3 kerEdgeDetectionC = float3x3 (-1.0, -1.0, -1.0,
                                                    -1.0,  8.0, -1.0,
                                                    -1.0, -1.0, -1.0);

                   float3x3 kerSharpen = float3x3 (0.0, -1.0, 0.0,
                                                    -1.0, 5.0, -1.0,
                                                    0.0, -1.0, 0.0);



                    float3x3 kerBoxBlur = (1.0/9.0)*float3x3 (    1.0,  1.0,  1.0,
                                                        1.0,  1.0,  1.0,
                                                        1.0,  1.0,  1.0);




                    float3x3 kernelSelection;
                if(_Kernel == 1){
                kernelSelection = kerEdgeDetectionA;
                }else if(_Kernel == 2){
                kernelSelection = kerEdgeDetectionB;    
                }else if(_Kernel == 3){
                kernelSelection = kerEdgeDetectionC;
                }else if(_Kernel == 4){
                kernelSelection = kerSharpen;   
                }else if(_Kernel == 5){
                kernelSelection = kerBoxBlur;
                }

                float3x3 matr = GetData(0, _MainTex, i.uv, _MainTex_TexelSize);
                float3x3 matg = GetData(1, _MainTex, i.uv, _MainTex_TexelSize);
                float3x3 matb = GetData(2, _MainTex, i.uv, _MainTex_TexelSize);
                float3x3 mata = GetMean(matr, matg, matb);


                // kernel
               float4 gl_FragColor = float4(Convolve(kernelSelection,matr,1.0,0.0),
                                            Convolve(kernelSelection,matg,1.0,0.0),
                                            Convolve(kernelSelection,matb,1.0,0.0),
                                            1.0);

                return gl_FragColor;
            }
            ENDCG
        }
    }
}

Boxblur

একটি বক্স ব্লার (একটি বক্স লিনিয়ার ফিল্টার হিসাবে পরিচিত) একটি স্থানিক ডোমেন লিনিয়ার ফিল্টার যা ফলাফল চিত্রের প্রতিটি পিক্সেলের ইনপুট চিত্রের প্রতিবেশী পিক্সেলের গড় মানের সমান হয়। এটি লো-পাস ("ঝাপসা") ফিল্টারটির একটি ফর্ম। একটি 3 বাই 3 বক্স ব্লার ম্যাট্রিক্স হিসাবে লেখা যেতে পারে written

https://en.wikipedia.org/wiki/Box_blur

1_oos3y1ztoewgsubpdnbvea

Shader "Smkgames/Simple Box Blur"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
    }
    SubShader
    {
        Blend SrcAlpha OneMinusSrcAlpha


        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;
            };

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

            sampler2D _MainTex;
            float4 _MainTex_TexelSize;

            float4 box(sampler2D tex, float2 uv, float4 size)
            {
                float4 c = tex2D(tex, uv + float2(-size.x, size.y)) + tex2D(tex, uv + float2(0, size.y)) + tex2D(tex, uv + float2(size.x, size.y)) +
                            tex2D(tex, uv + float2(-size.x, 0)) + tex2D(tex, uv + float2(0, 0)) + tex2D(tex, uv + float2(size.x, 0)) +
                            tex2D(tex, uv + float2(-size.x, -size.y)) + tex2D(tex, uv + float2(0, -size.y)) + tex2D(tex, uv + float2(size.x, -size.y));

                return c / 9;
            }

            float4 frag (v2f i) : SV_Target
            {
                float4 col = box(_MainTex, i.uv, _MainTex_TexelSize);
                return col;
            }
            ENDCG
        }
    }
}

blurbox

পুনরাবৃত্তি

আপনি পূর্ববর্তী ফ্রেম সংরক্ষণ করতে রেন্ডারটেকচার ব্যবহার করতে পারেন so সুতরাং আপনি পূর্ববর্তী ফ্রেমটি ধরে ফেলতে পারেন তবে অস্পষ্ট। এটি পুনরাবৃত্তি করে আপনি অস্পষ্টতা অর্জন করেন।

0fe28c6167db2132d4bb8677fc1b2050 - Leandro-erlich-আর্জেন্টিনা

সাধারণ

float4 distortion = tex2D(_MainTex,i.uv);
float3 distortionNormal = UnpackNormal(distortion);

record_2019_03_03_21_35_45_417

উপসংহার

ফাইনাল শেডার:

Shader "Smkgames/BrokenGlass3D"
{
    Properties{
        _MainTex("MainTex",2D) = "white"{}
        _NormalIntensity("NormalIntensity",Float) = 1
        _Alpha("Alpha",Float) = 1
    }
    SubShader
    {
Tags {"Queue"="Transparent" "RenderType"="Transparent"}
Blend SrcAlpha OneMinusSrcAlpha 


        GrabPass
        {
            "_GrabTexture"
        }

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
                float2 grabPos : TEXCOORD1;
                float3 normal :NORMAL;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 grabPos : TEXCOORD1;
                half3 worldNormal :TEXCOORD2;
                float4 vertex : SV_POSITION;

            };
            sampler2D _MainTex;
            float _Intensity,_Alpha;

            v2f vert (appdata v)
            {
                v2f o;
                o.uv = v.uv;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.grabPos = ComputeGrabScreenPos(o.vertex);
                o.worldNormal = UnityObjectToWorldNormal(v.normal);
                return o;
            }

            sampler2D _GrabTexture;
            float _NormalIntensity;

            fixed4 frag (v2f i) : SV_Target
            {
                float4 distortion = tex2D(_MainTex,i.uv);
                float3 distortionNormal = UnpackNormal(distortion);
                distortionNormal.xy *= _NormalIntensity;
                normalize(distortionNormal);
                fixed4 col = tex2Dproj(_GrabTexture, i.grabPos+float4(distortionNormal.rgb,0));
                return col;
            }
            ENDCG
        }
    }
}

লাইফটাইমের উপর রঙিন আলফা ব্যবহার না করে:

record_2019_03_03_21_48_36_273

লাইফটাইমের ওপরে রঙে আলফা ব্যবহার করে:

record_2019_03_03_21_48_19_786

উত্স উপলব্ধ:

https://github.com/smkplus/RainDrop

আরো আছে!

এছাড়াও আপনি রিপলস তৈরি করতে পারেন

record_2019_03_04_22_10_25_457

উপকারী সংজুক

https://80.lv/articles/breakdown-animated-raindrop-material-in-ue4/

https://seblagarde.wordpress.com/2013/01/03/water-drop-2b-dynamic-rain-and-its-effects/


1

এই বছর আগে আসলে সম্পর্কে একটি প্রশ্ন ছিল , কিন্তু এটি মোটেও ইউনিটির সাথে সম্পর্কিত নয় (দুর্ভাগ্যক্রমে)। আপনি যদি লিঙ্কযুক্ত উপস্থাপনাটির 57 টি স্লাইডটি দেখেন তবে তারা গ্রিড ভিত্তিক পদ্ধতির উল্লেখ করে।

একটা ব্যাপার কিছুটা সাথে সম্পর্কিত পদার্থবিদ্যা দঃপূঃ প্রশ্ন আপনি আকর্ষণীয় হতে পারে। লিঙ্কযুক্ত প্রশ্নে ড্রপল্ট.পিডিএফ- এর লিঙ্কটি নষ্ট হয়েছে, তবে এটি এখনও ওয়েব্যাক মেশিনে রয়েছে। এটি কয়েক ধরণের ভূপৃষ্ঠের প্রবাহিত জলের গণিতের মধ্যে চলে যায়। ফোঁটাগুলি পূর্বের বৃষ্টিপাতগুলি আগে ব্যবহৃত পাথগুলিতে ভ্রমণ করতে পছন্দ করে, উদাহরণস্বরূপ (p926 দেখুন)।

আপনি সম্ভবত প্রতিটি "রেইনড্রপ" এর মাথা এবং লেজগুলি কেবল মডেল করতে পারেন এবং এটি কিছুটা জিগ এবং জিগ করার অনুমতি দিয়েছিলেন। যখন দুটি দীর্ঘায়িত বৃষ্টিপাতের সংঘর্ষ হয়, আমি মনে করি আপনি এগুলি একটি বৃহত এবং দ্রুতগতিতে চলমান বৃষ্টিপাতের সাথে সংযুক্ত করতে পারেন। জলের পরিমাণ একই থাকে। এটি কেবল মাধ্যাকর্ষণ শক্তি, কাচের সাথে আনুগত্য এবং একাত্মতার বাহিনী দ্বারা সরানো এবং আকারযুক্ত।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.