মডেলগুলির জন্য অ্যানিমেটেড টেক্সচার; শেডার কীভাবে লিখব?


9

কিছু রকেট লীগ দেখছিল এবং লক্ষ্য ছিল সেখানে অ্যানিমেটেড ডেস্ক এবং চাকা ছিল।

ভাবমূর্তি

আমি উপরের চিত্রের প্রভাবগুলির অনুরূপ কিছু বাস্তবায়ন করতে চাই।

হুইল ইফেক্টটি করতে আমি কীভাবে ইউনিটি শেডার লিখতে যাব?

আমি শেডার্স সম্পর্কে বেশি কিছু জানি না, তবে আমি অ্যানিমেশন প্রভাবটি সম্পাদনের জন্য মানক Unক্য শ্যাডারটি সম্পাদনা করতে পারি?


3
শেডারগুলি অবশ্যই এখানে যাওয়ার সমাধান, এমনকি কোনও স্ক্রোলিং টেক্সচারের মতো সহজ কিছু। ইউনিটির একটি বিল্ট-ইন _Timeভেরিয়েবল রয়েছে যা আপনি আপনার টেক্সচার কোঅর্ডিনেটগুলিতে (ভার্টেক্স) শেডারে যুক্ত করতে পারেন যাতে কোনও স্ক্রোলিং এফেক্ট ময়লা সস্তা পাওয়া যায়। ষড়ভুজ প্রভাব খুব সোজা হবে। আপনি যদি কেবল একটি প্রভাব হাইলাইট করার জন্য আপনার প্রশ্নটি সম্পাদনা করেন এবং "আমি কীভাবে এটি একটি ইউনিটির শেডারে প্রয়োগ করব" জিজ্ঞাসা করলে আমরা সম্ভবত আপনাকে সহায়তা করতে পারি। শ্যাডারকে আলো / ছায়ায় প্রতিক্রিয়া জানাতে হবে কিনা তা সুনির্দিষ্ট করুন, কারণ এটি কীভাবে লেখা হবে তাতে তার প্রভাব রয়েছে।
ডিএমগ্রিগরি

তথ্যের জন্য ধন্যবাদ। আমার প্রশ্ন বদলেছে, এটা কি একটু ভাল? আমি আলো এবং ছায়া কাটা সম্পর্কে সত্যই জানি না, তাই আমি শেডার সম্পর্কে আরও ভাল ধারণা না পাওয়া পর্যন্ত আমি এখনই তা ছেড়ে দিয়েছি। আমার ধারণা আমি সেগুলি চাইব, তবে আমি কেবল স্ট্যান্ডার্ড শেডার থেকে অংশগুলি অনুলিপি করতে পারি?
জ্যাকেটপোটাতোফ্যান 0

3
আমি আজকের রাতের কিছুক্ষণ পরেই এর উত্তরে এটি প্রসারিত করব (যদিও এখনই কেউ উত্তর দিতে চাইলে আমাকে এটাকে বিনা দ্বিধায় বোধ করবেন!) - তবে আপনি সাধারণত একটি ইউনিটি শেডার লিখবেন যা আলোকে "সারফেস শেডার" হিসাবে ব্যবহার করে যখন আলোর প্রয়োজন হয় না এমন একটি সাধারণত "আনলিট শেডার" হিসাবে লেখা সহজ হয়। আমার কাছে দেখে মনে হচ্ছে whe চাকাগুলি অপরিশোধিত (প্রান্তে হালকা ছায়াছবি এসএসএওর মতো লাগে), তাই আমি ছবিটি শুরু করে আলোকপাত ছেড়ে দেব। আপনি কি স্পষ্ট করতে পারেন: আপনি কি এখানে প্রদর্শিত জ্যামিতিক প্যাটার্নটি চান, বা স্বেচ্ছাসেবী টেক্সচারগুলি বাহ্যিকভাবে স্ক্রোল করার ক্ষমতা এবং তাদের মতো রংধনু-আঁকোটা চান?
ডিএমগ্রিগরি

আপনাকে অনেক ধন্যবাদ, আমাকে শুরু করতে আপনি যা কিছু তথ্য দিতে পারেন তা দুর্দান্ত হবে। আমি সত্যিই এমন লোকদের প্রশংসা করি যারা ছায়াময় লিখতে পারে, আমি ityক্য শেডারের জন্য কয়েকটি নিবন্ধ দেখেছি এবং হ্যাঁ, খুব বিভ্রান্তিকর। আমি মনে করি কেবল টেক্সচারের মাধ্যমে স্ক্রোল করা (বা টেক্সচার ইউভিগুলি?) যথেষ্ট ভাল হবে, এবং রঙিন করার ক্ষমতা সহ।
জ্যাকেটপটাটো ফ্যান 6:44

উত্তর:


13

আমি এটি কয়েকটি স্তরে তৈরি করব যাতে আপনি দেখতে পাবেন যে এটি কীভাবে একসাথে আসে।

Create --> Shader --> Unlitপ্রকল্প উইন্ডোতে সম্পদ মেনু বা ডান ক্লিক প্রসঙ্গ মেনু নির্বাচন করে ইউনিটিতে নতুন শেডার তৈরি করে শুরু করুন।

উপরের ব্লকে আমরা _ScrollSpeedsটেক্সটটি প্রতিটি দিকে কত দ্রুত গতি নিয়ন্ত্রণ করে তা নিয়ন্ত্রণ করতে একটি পরামিতি যুক্ত করব :

Properties
{
    _MainTex ("Texture", 2D) = "white" {}
    _ScrollSpeeds ("Scroll Speeds", vector) = (-5, -20, 0, 0)
}

এটি উপাদানের পরিদর্শকটিতে "স্ক্রোল গতি" ( একটি স্ক্রিপ্টের সাথে একটি publicবা Serializedভেরিয়েবল যোগ করার অনুরূপ MonoBehaviour) সহ নতুন ইলেক্ট্রিয়েন্ট ভাসমান সম্পত্তি প্রকাশ করে

পরবর্তী আমরা এই পরিবর্তনশীলটি ভার্টেক্স শেডারটিতে টেক্সচারের স্থানাঙ্কগুলি ( o.uv) সরিয়ে নিতে ডিফল্ট শেডারে কেবল দুটি লাইন যুক্ত করে ব্যবহার করব :

sampler2D _MainTex;
float4 _MainTex_ST;
// Declare our new parameter here so it's visible to the CG shader
float4 _ScrollSpeeds;

v2f vert (appdata v)
{
    v2f o;
    o.vertex = UnityObjectToClipPos(v.vertex);
    o.uv = TRANSFORM_TEX(v.uv, _MainTex);

    // Shift the uvs over time.
    o.uv += _ScrollSpeeds * _Time.x;

    UNITY_TRANSFER_FOG(o,o.vertex);
    return o;
}

একটি চতুর্থাংশে চড় মার ( কেন্নির দ্বারা একটি মুক্ত ফ্রি জিরাফ টেক্সচার সহ ) এবং আপনি পান:

এর চারপাশে পুনরাবৃত্তি জিরাফ সহ একটি স্কোয়াড।

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

এটি কিছুটা ব্যয়বহুল, ট্রিগ এবং দৈর্ঘ্যের ক্রিয়াকলাপগুলির কারণে (যেগুলি বেসিক গণিতের তুলনায় বেশি ব্যয়বহুল) এবং যেহেতু কেবলমাত্র প্রতিবন্ধীকরণের তুলনায় টুকরোজ প্রতি টুকরোয়াল গণনা করার সময় হার্ডওয়্যারে টেক্সচারের ডেটা ভবিষ্যদ্বাণী করা এবং ক্যাশে করার পক্ষে দক্ষ নয় শীর্ষে। তবে এর মতো কিছুটা বিশেষ প্রভাবের জন্য এটি অতিরিক্ত নয়।

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

    // Shift the UVs so (0, 0) is in the middle of the quad.
    o.uv = v.uv - 0.5f;

    UNITY_TRANSFER_FOG(o,o.vertex);
    return o;
}

fixed4 frag (v2f i) : SV_Target
{
    // Convert our texture coordinates to polar form:
    float2 polar = float2(
           atan2(i.uv.y, i.uv.x)/(2.0f * 3.141592653589f), // angle
           length(i.uv)                                    // radius
        );

    // Apply texture scale
    polar *= _MainTex_ST.xy;

    // Scroll the texture over time.
    polar += _ScrollSpeeds.xy * _Time.x;

    // Sample using the polar coordinates, instead of the original uvs.
    // Here I multiply by MainTex
    fixed4 col = tex2D(_MainTex, polar);

    // apply fog
    UNITY_APPLY_FOG(i.fogCoord, col);
    return col;
}

এটি আমাদেরকে এরকম কিছু দেয় (এখানে আমি উপাদানগুলিতে টাইলিং পরামিতিগুলি বাড়িয়েছি যাতে এটি স্পষ্ট হয় - বৃত্তের চারপাশে টাইলের কেবল একটি পুনরাবৃত্তি মোড়ানো বিকৃত এবং অদ্ভুত দেখায়)

টাইলিং জিরাফগুলি কোয়াডের কেন্দ্র থেকে বাহিরের দিকে বিস্তৃত হয়

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

প্রথমে আমরা শীর্ষে নতুন টেক্সচার প্যারামিটার যুক্ত করব:

Properties
{
    _MainTex ("Texture", 2D) = "white" {}
    _TintTex("Tint Texture", 2D) = "white" {}
    _ScrollSpeeds ("Scroll Speeds", vector) = (-5.0, -20.0, 0, 0)
}

এবং এটি আমাদের সিজিপিগ্রগ্রাম ব্লকে ঘোষণা করুন যাতে সিজি শেডার এটি দেখতে পান:

sampler2D _MainTex;
float4 _MainTex_ST;

// Declare our second texture sampler and its Scale/Translate values
sampler2D _TintTex;
float4 _TintTex_ST;

float4 _ScrollSpeeds;

তারপরে উভয় টেক্সচার ব্যবহার করতে আমাদের টুকরা শেডার আপডেট করুন:

fixed4 frag(v2f i) : SV_Target
{
    float2 polar = float2(
           atan2(i.uv.y, i.uv.x) / (2.0f * 3.141592653589f), // angle
           length(i.uv)                                    // radius
        );

    // Copy the polar coordinates before we scale & shift them,
    // so we can scale & shift the tint texture independently.
    float2 tintUVs = polar * _TintTex_ST.xy;
    tintUVs += _ScrollSpeeds.zw * _Time.x;

    polar *= _MainTex_ST.xy;
    polar += _ScrollSpeeds.xy * _Time.x;

    fixed4 col = tex2D(_MainTex, polar);
    // Tint the colour by our second texture.
    col *= tex2D(_TintTex, tintUVs);

    UNITY_APPLY_FOG(i.fogCoord, col);
    return col;
}

এবং এখন আমাদের জিরাফ সত্যিই ট্রিপল:

অনেক দূরে, মানুষ ....

টেক্সচার এবং স্ক্রোলিং হারগুলির সামান্য আরও শৈল্পিক নির্বাচন সহ, এটি প্রশ্নের মধ্যে প্রদর্শিত একটির মতো একটি প্রভাব তৈরি করতে পারে।


উপরে বর্ণিত সংস্করণটি দিয়ে আপনি দুটি ছোট শিল্পকলা লক্ষ্য করতে পারেন:

  • চেনাশোনাটির কেন্দ্রের নিকটবর্তী মুখগুলি প্রসারিত / চর্মসার / পয়েন্টযুক্ত হয়ে যায়, তারপরে বাইরের দিকে যাওয়ার সাথে সাথে তারা স্কোয়াশেড / প্রশস্ত হয়।

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

    আমরা লোগারিদমিক বাঁক অনুসরণ করতে টেক্সচার নমুনার উল্লম্ব উপাদানটি পুনরায় তৈরি করে এটি ঠিক করতে পারি, সুতরাং ব্যাসার্ধের পুনরাবৃত্তিগুলি ব্যাসার্ধ বৃদ্ধির সাথে সাথে আরও পৃথক হয় এবং একসাথে কেন্দ্রের দিকে ঘনিষ্ঠ হয়। (প্রকৃতপক্ষে, এটি আমাদের ছোট এবং আরও ছোট জিরাফের এক অসীম প্রতিরোধ দেয় ...)

  • কোয়াডের মাঝের-বাম পাশে এক বা দুটি অস্পষ্ট পিক্সেলের সারি রয়েছে।

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

    সমস্যাটি এখানে, আমরা -180 থেকে 180 ডিগ্রি পর্যন্ত মেরু স্থানাঙ্কের মোড়কের কাছাকাছি অবস্থানে। সুতরাং আমরা আমাদের পুনরাবৃত্তি টেক্সচার স্পেসে খুব অনুরূপ পয়েন্টগুলি থেকে নমুনা দিচ্ছি, এমনকি যদি তাদের সংখ্যাসূচকগুলি তাদের দেখতে আরও দূরের মতো করে তোলে। সুতরাং আমরা এটির জন্য আমাদের নিজস্ব নমুনা গ্রেডিয়েন্ট ভেক্টর সরবরাহ করতে পারি।

এই সংশোধন সহ একটি সংস্করণ এখানে:

fixed4 frag(v2f i) : SV_Target
{
    float2 polar = float2(
           atan2(i.uv.y, i.uv.x) / (2.0f * 3.141592653589f), // angle
           log(dot(i.uv, i.uv)) * 0.5f                       // log-radius
        );

    // Check how much our texture sampling point changes between
    // neighbouring pixels to the sides (ddx) and above/below (ddy)
    float4 gradient = float4(ddx(polar), ddy(polar));

    // If our angle wraps around between adjacent samples,
    // discard one full rotation from its value and keep the fraction.
    gradient.xz = frac(gradient.xz + 1.5f) - 0.5f;

    // Copy the polar coordinates before we scale & shift them,
    // so we can scale & shift the tint texture independently.
    float2 tintUVs = polar * _TintTex_ST.xy;
    tintUVs += _ScrollSpeeds.zw * _Time.x;

    polar *= _MainTex_ST.xy;
    polar += _ScrollSpeeds.xy * _Time.x;

    // Sample with our custom gradients.
    fixed4 col = tex2Dgrad(_MainTex, polar, 
                           _MainTex_ST.xy * gradient.xy,
                           _MainTex_ST.xy * gradient.zw
                         );

    // Since our tint texture has its own scale,
    // its gradients also need to be scaled to match.
    col *= tex2Dgrad(_TintTex, tintUVs,
                          _TintTex_ST.xy * gradient.xy,
                          _TintTex_ST.xy * gradient.zw
                         );

    UNITY_APPLY_FOG(i.fogCoord, col);
    return col;
}

2
ছোট্ট কিছু উন্নতি করতে পারেন: ১) ভি দিকের জন্য লোগারিথমিক বক্র ব্যবহার করে টেক্সচারটি বাইরের দিকে স্ক্রোল করার সাথে সাথে তার আকারটি ধরে রাখতে সহায়তা করে (মাঝখানে কোনও বিন্দুতে সংকীর্ণ হওয়ার পরিবর্তে, আপনি কেবল ছোট অনুলিপিগুলির একটি অনন্ত শৃঙ্খলা পান এমআইপি এটি ঘর্ষণ করে) 2) আপনার নিজস্ব টেক্সচার গ্রেডিয়েন্টগুলি গণনা করা এবং tex2Dgradফিল্টারিং আর্টিক্টগুলি স্থির করে যেখানে কোণটি -pi থেকে + পাই পর্যন্ত আচ্ছাদন করে (এটি বাম দিকে ঝাপসা পিক্সেলের পাতলা রেখা)। এখানে আরও নীল রঙের সাথে স্পর্শ করা ফলাফল
ডিএমগ্রিগরি

আশ্চর্যজনক, পাশাপাশি বিরতি জন্য ধন্যবাদ। আমি মনে করি শেডার এমন কিছু যা আমি কখনই লিখতে পারব না (বিশেষত স্টাফ যেমন আপনি "পোলার" এর জন্য করেছেন, গণিতের জিনিসগুলি আমার কাছে কিছুই বোঝায় না, কারণ আমি কেবল খুব প্রাথমিক গণিতের দক্ষতা পেয়েছি)।
জ্যাকেটপটাটো ফ্যান 18

1
লোকেরা যেমন স্টাফ সাধারণত সন্ধান করা হবে। ;) আমি কেবল এটি যথেষ্ট করি যে এটি কীবোর্ডটি ঘূর্ণায়মান। বিভিন্ন গণিতের ক্রিয়াকলাপের সাথে ঘুরেফিরে চেষ্টা করুন এবং ফলাফলগুলি দেখুন - গণিতটি জ্যামিতিকভাবে কী করছে তা কল্পনা করতে আমাকে সহায়তা করার জন্য এই জাতীয় একটি সরঞ্জাম থাকার ফলে আমি কীভাবে আমার অনুশীলনটি প্রথম স্থানে পেয়েছি। (বিশেষত শেডারের সাথে নয়, তবে হোয়াইটক্যাপ নামে পরিচিত একটি পুরানো উইনঅ্যাম্প ভিজ্যুয়ালাইজার ...) শ্যাডার ম্যাথটি মারাত্মকভাবে ভুল হয়ে গেলেও এটি প্রায়শই অদ্ভুতভাবে তাকান। : ডি
DMGregory
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.