Vertex Shader হল গ্রাফিক্স পাইপলাইনের একটি প্রোগ্রামেবল পর্যায় যা একটি 3D মডেলের প্রতিটি ভার্টেক্সকে স্বাধীনভাবে প্রক্রিয়া করে। Khronos Group, 2025 অনুসারে, ভার্টেক্স শেডার ইনপুট হিসেবে ভার্টেক্স অ্যাট্রিবিউট গ্রহণ করে — স্থানাঙ্ক, নর্মাল, রঙ এবং টেক্সচার স্থানাঙ্ক — এবং নির্ধারিত লজিক অনুযায়ী সেগুলো রূপান্তর করে। Vertex Shader প্রতিটি ভার্টেক্সের জন্য স্বাধীনভাবে নির্বাহিত হয়, যা GPU-এর হাজার হাজার কোর jুড়ে গণনাগুলোকে দক্ষতার সাথে সমান্তরাল করতে দেয়।
মুখ্য বিষয়
Vertex Shader হল গ্রাফিক্স পাইপলাইনের একটি প্রোগ্রামেবল পর্যায় যা একটি 3D মডেলের প্রতিটি ভার্টেক্সকে পৃথকভাবে প্রক্রিয়া করে। ভার্টেক্স হল ত্রিমাত্রিক স্থানের একটি বিন্দু যাতে অ্যাট্রিবিউট থাকে: xyz স্থানাঙ্ক, নর্মাল, রঙ এবং UV টেক্সচার স্থানাঙ্ক।
ফিক্সড-ফাংশন পাইপলাইনের বিপরীতে, যেখানে রূপান্তরগুলি একটি কঠোর অ্যালগরিদম অনুযায়ী সম্পাদিত হতো, Vertex Shader ডেভেলপারকে ভার্টেক্স রূপান্তরের উপর সম্পূর্ণ নিয়ন্ত্রণ দেয়। এটি GPU-র পক্ষে প্রোসিজারাল অ্যানিমেশন, মডেল বিকৃতি, কঙ্কাল স্কিনিং এবং যেকোনো গাণিতিক রূপান্তর বাস্তবায়নের অনুমতি দেয়।
OpenGL ES গ্রাফিক্স পাইপলাইনে ইনপুট ডেটা থেকে চূড়ান্ত চিত্র পর্যন্ত পর্যায়গুলির একটি ক্রম অন্তর্ভুক্ত। Vertex Shader ভার্টেক্স অ্যাসেম্বলি পর্যায়ের পরে এবং রাস্টারাইজেশন পর্যায়ের আগে অবস্থিত। CPU থেকে ভার্টেক্স বাফারের মাধ্যমে পাঠানো প্রতিটি ভার্টেক্স Vertex Shader-এর মধ্য দিয়ে ঠিক একবার যায় এবং ফলাফলটি প্রিমিটিভ অ্যাসেম্বলির জন্য পরবর্তী পর্যায়ে পাঠানো হয়।
| পাইপলাইন পর্যায় | উদ্দেশ্য |
|---|---|
| Vertex Specification | VBO থেকে ভার্টেক্স ডেটা এবং অ্যাট্রিবিউট স্থানান্তর |
| Vertex Shader | প্রতিটি ভার্টেক্স প্রক্রিয়াকরণ, স্থানাঙ্ক রূপান্তর |
| Tessellation | উপ-প্রিমিটিভে জ্যামিতির ঐচ্ছিক উপবিভাজন |
| Geometry Shader | প্রিমিটিভের ঐচ্ছিক তৈরি বা অপসারণ |
| Rasterization | ভরাটের জন্য প্রিমিটিভকে ফ্র্যাগমেন্টে রূপান্তর |
Vertex Shader CPU কোডে কনফিগার করা ভার্টেক্স অ্যাট্রিবিউট পয়েন্টারের মাধ্যমে ভার্টেক্স বাফার (VBO) থেকে ভার্টেক্স অ্যাট্রিবিউট গ্রহণ করে। ডেভেলপার GLSL (OpenGL Shading Language) বা সমতুল্য ভাষায় শেডার কোড লেখে, যা GPU ড্রাইভার নির্দিষ্ট চিপের জন্য মেশিন নির্দেশে কম্পাইল করে।
প্রতিটি ভার্টেক্সের জন্য, Vertex Shader ক্রমিকভাবে তিনটি অপারেশন করে: ইনপুট অ্যাট্রিবিউট পড়া — ডেভেলপার দ্বারা নির্ধারিত রূপান্তর প্রয়োগ — আউটপুট ভেরিয়েবলে ফলাফল লেখা। ন্যূনতম প্রয়োজনীয় আউটপুট হল ক্লিপ স্পেসে ভার্টেক্স অবস্থান (gl_Position)। অন্যান্য সমস্ত আউটপুট ডেটা (রঙ, নর্মাল, টেক্সচার স্থানাঙ্ক) ইন্টারপোলেট হয় এবং পরবর্তী পর্যায়ে — Fragment Shader-এ পাঠানো হয়।
#version 300 es
in vec3 aPosition;
in vec2 aTexCoord;
uniform mat4 uMVP;
out vec2 vTexCoord;
void main() {
gl_Position = uMVP * vec4(aPosition, 1.0);
vTexCoord = aTexCoord;
}
Vertex Shader জ্যামিতি রূপান্তর সম্পর্কিত গ্রাফিক্স পাইপলাইন কাজের একটি বিস্তৃত পরিসর সমাধান করে। প্রতিটি কাজ ভেক্টর এবং ম্যাট্রিক্সের উপর গাণিতিক ক্রিয়াকলাপের মাধ্যমে বাস্তবায়িত হয়, যা হাজার হাজার ভার্টেক্সের জন্য সমান্তরালভাবে নির্বাহিত হয়।
মৌলিক এবং সবচেয়ে সাধারণ কাজ হল ভার্টেক্স স্থানাঙ্ককে model, view এবং projection (MVP) ম্যাট্রিক্স দ্বারা গুণ করা। MVP ম্যাট্রিক্স ভার্টেক্সকে স্থানীয় মডেল স্পেস থেকে ক্লিপ স্পেসে রূপান্তর করে, যা পরে পাইপলাইনের স্বয়ংক্রিয় পর্যায়ে স্বাভাবিকীকৃত এবং স্ক্রিন স্থানাঙ্কে রূপান্তরিত হয়।
অ্যানিমেটেড চরিত্রের জন্য, Vertex Shader কঙ্কাল অ্যানিমেশন (skinning) বাস্তবায়ন করে। প্রতিটি ভার্টেক্স নির্দিষ্ট ওজন সহ একাধিক হাড়ের সাথে আবদ্ধ থাকে। Vertex blending — আবদ্ধ হাড় থেকে রূপান্তরের ওজনযুক্ত সমষ্টি — কঙ্কাল নড়াচড়া করলে চরিত্রের ত্বককে মসৃণভাবে বিকৃত করতে দেয়।
Vertex Shader CPU-র অংশগ্রহণ ছাড়াই সময় বা অন্যান্য uniform প্যারামিটারের উপর ভিত্তি করে জ্যামিতি পরিবর্তন করতে পারে। Wave deformation, পার্লিন নয়েজ স্থানান্তর এবং জলের ঢেউ প্রভাব — এই সমস্ত প্রভাব RAM থেকে জ্যামিতি পুনরায় লোড না করেই ভার্টেক্স শেডারে বাস্তবায়িত হয়।
যদিও উভয় প্রকার শেডারই গ্রাফিক্স পাইপলাইনের প্রোগ্রামেবল পর্যায়, Vertex Shader এবং Fragment Shader মৌলিকভাবে ভিন্ন কাজ সমাধান করে এবং চিত্র প্রক্রিয়াকরণের বিভিন্ন পর্যায়ে কাজ করে।
| বৈশিষ্ট্য | Vertex Shader | Fragment Shader |
|---|---|---|
| ইনপুট ডেটা | VBO থেকে ভার্টেক্স অ্যাট্রিবিউট | VS থেকে ইন্টারপোলেটেড ডেটা |
| কলের সংখ্যা | ভার্টেক্সের সংখ্যা | ফ্র্যাগমেন্টের সংখ্যা |
| প্রধান কাজ | জ্যামিতি রূপান্তর | পিক্সেল রঙ গণনা |
| গণনামূলক ভার | জ্যামিতি জটিলতা | স্ক্রিন রেজোলিউশন |
| টেক্সচার অ্যাক্সেস | সীমিত (texture lookup-এর মাধ্যমে) | সম্পূর্ণ অ্যাক্সেস |
মূল পার্থক্য হল কল ফ্রিকোয়েন্সি। Vertex Shader প্রতি ভার্টেক্সে একবার কল করা হয়, যেখানে Fragment Shader প্রতিটি ফ্র্যাগমেন্টের (পিক্সেল) জন্য কল করা হয়। উচ্চ-রেজোলিউশন দৃশ্যে, Fragment Shader কলের সংখ্যা Vertex Shader কলের চেয়ে হাজার গুণ বেশি, যা পিক্সেল শেডার অপ্টিমাইজেশনকে আরও গুরুত্বপূর্ণ করে তোলে।
Vertex Shader-এর কর্মক্ষমতা রিয়েল-টাইম অ্যাপ্লিকেশনের জন্য অত্যন্ত গুরুত্বপূর্ণ, বিশেষ করে সীমিত বিদ্যুৎ খরচ সহ মোবাইল ডেভেলপমেন্টে। প্রধান কর্মক্ষমতা বিষয়গুলি হল ভার্টেক্সের সংখ্যা, শেডার কোডের জটিলতা এবং GPU মেমরি ব্যান্ডউইথ।
Vertex Shader-এর উপর চাপ কমানোর জন্য নিম্নলিখিত পদ্ধতিগুলি ব্যবহার করা হয়। Level of Detail (LOD) — ক্যামেরা বস্তু থেকে দূরে সরে গেলে মডেলের সরলীকৃত সংস্করণে সুইচ করা। Instancing — একটি ড্র কলের মধ্যে বিভিন্ন রূপান্তর ম্যাট্রিক্স সহ একই জ্যামিতি একাধিকবার অঙ্কন করা।
// instancing সমর্থন সহ Vertex Shader
in vec3 aPosition;
in mat4 aInstanceMatrix;
uniform mat4 uViewProjection;
void main() {
vec4 worldPos = aInstanceMatrix * vec4(aPosition, 1.0);
gl_Position = uViewProjection * worldPos;
}
Vertex Shader বিভিন্ন গ্রাফিক্স API-তে একই রকম লজিক রাখে, কিন্তু ভিন্ন সিনট্যাক্স এবং নামকরণের নিয়ম রাখে। আসুন OpenGL ES 3.0-এর জন্য GLSL-এ এবং iOS ও macOS-এর জন্য Metal Shading Language-এ মৌলিক ভার্টেক্স শেডারের বাস্তবায়ন দেখি।
#version 300 es
in vec4 position;
in vec3 normal;
in vec2 texcoord;
uniform mat4 modelViewMatrix;
uniform mat4 projectionMatrix;
uniform mat3 normalMatrix;
out vec3 vNormal;
out vec2 vTexCoord;
out vec3 vPosition;
void main() {
vec4 mvPosition = modelViewMatrix * position;
vPosition = mvPosition.xyz;
vNormal = normalMatrix * normal;
vTexCoord = texcoord;
gl_Position = projectionMatrix * mvPosition;
}
#include <metal_stdlib>
using namespace metal;
struct VertexIn {
float3 position [[attribute(0)]];
float3 normal [[attribute(1)]];
};
struct VertexOut {
float4 position [[position]];
float3 worldNormal;
};
vertex VertexOut
vertexMain(VertexIn in [[stage_in]],
constant float4x4& mvp [[buffer(1)]]) {
VertexOut out;
out.position = mvp * float4(in.position, 1.0);
out.worldNormal = in.normal;
return out;
}
সচরাচর জিজ্ঞাসিত প্রশ্ন
Vertex Shader হল GPU-তে একটি প্রোগ্রাম যা একটি 3D মডেলের প্রতিটি ভার্টেক্স প্রক্রিয়া করে এবং এর স্থানাঙ্ককে স্ক্রিন স্থানাঙ্ক এ রূপান্তর করে। মডেলটিকে বিন্দুর জাল হিসেবে কল্পনা করুন; ভার্টেক্স শেডার নির্ধারিত গাণিতিক নিয়ম অনুযায়ী এই বিন্দুগুলিকে স্থানান্তরিত করে।
Vertex Shader ভার্টেক্স প্রক্রিয়া করে এবং জ্যামিতির জন্য দায়ী, যেখানে Fragment Shader প্রতিটি পিক্সেলের রঙ নির্ধারণ করে। প্রথমটি প্রতি ভার্টেক্সে (হাজার হাজার) কল করা হয়, দ্বিতীয়টি প্রতি পিক্সেলে (লক্ষ লক্ষ)।
Vertex Shader গ্রাফিক্স API-র অনুরূপ ভাষায় লেখা হয়: OpenGL ES-এর জন্য GLSL, iOS/macOS-এ Metal API-র জন্য Metal Shading Language, Direct3D-এর জন্য HLSL। ধারণাগতভাবে, এগুলি সবই ভার্টেক্সের উপর একই ক্রিয়াকলাপ সম্পাদন করে।
ভার্টেক্স শেডারের জটিলতা সরাসরি FPS-কে প্রভাবিত করে: প্রতি ভার্টেক্সে বেশি নির্দেশ = বেশি প্রক্রিয়াকরণ সময়। অপ্টিমাইজেশন LOD-এর মাধ্যমে ভার্টেক্সের সংখ্যা হ্রাস, instancing ব্যবহার এবং শেডার কোডে শর্তসাপেক্ষ শাখা হ্রাস অন্তর্ভুক্ত করে।
প্রধান গেমিং কাজ: MVP ম্যাট্রিক্সের মাধ্যমে স্থানাঙ্ক রূপান্তর, অ্যানিমেটেড চরিত্রের skinning, পোশাক এবং চুলের প্রোসিজারাল বিকৃতি, মুখের অভিব্যক্তির মধ্যে মরফিং এবং GPU অ্যানিমেশন সহ কণা প্রভাব।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন