আমি এটি কয়েকটি স্তরে তৈরি করব যাতে আপনি দেখতে পাবেন যে এটি কীভাবে একসাথে আসে।
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;
}
_Time
ভেরিয়েবল রয়েছে যা আপনি আপনার টেক্সচার কোঅর্ডিনেটগুলিতে (ভার্টেক্স) শেডারে যুক্ত করতে পারেন যাতে কোনও স্ক্রোলিং এফেক্ট ময়লা সস্তা পাওয়া যায়। ষড়ভুজ প্রভাব খুব সোজা হবে। আপনি যদি কেবল একটি প্রভাব হাইলাইট করার জন্য আপনার প্রশ্নটি সম্পাদনা করেন এবং "আমি কীভাবে এটি একটি ইউনিটির শেডারে প্রয়োগ করব" জিজ্ঞাসা করলে আমরা সম্ভবত আপনাকে সহায়তা করতে পারি। শ্যাডারকে আলো / ছায়ায় প্রতিক্রিয়া জানাতে হবে কিনা তা সুনির্দিষ্ট করুন, কারণ এটি কীভাবে লেখা হবে তাতে তার প্রভাব রয়েছে।