Vertex Shader یک مرحله قابل برنامهریزی از خط لوله گرافیک (graphics pipeline) است که هر رأس از مدل سهبعدی را پردازش میکند. به گفته Khronos Group, 2025، شیدر رأس ویژگیهای رأسها — مختصات، نرمالها، رنگ و مختصات بافت — را دریافت کرده و آنها را طبق منطق مشخص شده تبدیل میکند. Vertex Shader برای هر رأس به طور مستقل اجرا میشود که امکان موازیسازی مؤثر محاسبات را روی هزاران هسته GPU فراهم میکند.
نکات اصلی
Vertex Shader یک مرحله قابل برنامهریزی از خط لوله گرافیک (graphics pipeline) است که هر رأس از مدل سهبعدی را به صورت جداگانه پردازش میکند. رأس (vertex) یک نقطه در فضای سهبعدی است که شامل ویژگیهایی است: مختصات xyz، نرمالها، رنگ و مختصات بافت UV.
برخلاف خط لوله ثابت (fixed-function pipeline) که در آن تبدیلها بر اساس الگوریتم از پیش تعیین شده انجام میشد، Vertex Shader به برنامهنویس کنترل کامل بر تبدیل رأسها را میدهد. این امکان پیادهسازی انیمیشن رویهای، تغییر شکل مدلها، skinning اسکلتی و هرگونه تبدیل ریاضی در سمت GPU را فراهم میکند.
خط لوله گرافیک OpenGL ES شامل دنبالهای از مراحل از دادههای ورودی تا تصویر نهایی است. Vertex Shader بعد از مرحله مونتاژ رأسها (vertex assembly) و قبل از مرحله رسترایزیشن قرار دارد. هر رأس که از CPU از طریق بافر رأس ارسال میشود، دقیقاً یک بار از Vertex Shader عبور کرده و نتیجه برای مونتاژ اولیهها به مرحله بعد منتقل میشود.
| مرحله خط لوله | کاربرد |
|---|---|
| Vertex Specification | انتقال دادههای رأس و ویژگیها از VBO |
| Vertex Shader | پردازش هر رأس، تبدیل مختصات |
| Tessellation | تقسیم اختیاری هندسه به زیراولیهها |
| Geometry Shader | تولید یا حذف اختیاری اولیهها |
| Rasterization | تبدیل اولیهها به قطعات برای پر کردن |
Vertex Shader ویژگیهای رأس را از بافر رأس (VBO) از طریق اشارهگرهای ویژگی رأس (vertex attribute pointers) که در کد CPU پیکربندی شدهاند دریافت میکند. برنامهنویس کد شیدر را به زبان 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 رأس را از فضای محلی مدل به فضای برش (clip space) تبدیل میکند، که سپس در مراحل خودکار خط لوله نرمالسازی شده و به مختصات صفحه تبدیل میشود.
برای شخصیتهای متحرک، Vertex Shader انیمیشن اسکلتی (skinning) را پیادهسازی میکند. هر رأس به چند استخوان با وزنهای مشخص متصل است. Vertex blending — مجموع وزنی تبدیلهای استخوانهای متصل — امکان تغییر شکل نرم پوست شخصیت را هنگام حرکت اسکلت فراهم میکند.
Vertex Shader میتواند هندسه را بر اساس زمان یا سایر پارامترهای uniform بدون مشارکت CPU تغییر دهد. 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 — ترسیم مکرر یک هندسه با ماتریسهای تبدیل مختلف در یک فراخوانی ترسیم (draw call).
// 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های گرافیکی مختلف منطق مشابهی دارد اما نحو و قراردادهای نامگذاری متفاوتی دارد. پیادهسازی یک شیدر رأس پایه در GLSL برای OpenGL ES 3.0 و در Metal Shading Language برای iOS و macOS را بررسی میکنیم.
#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 گرافیکی نوشته میشود: GLSL برای OpenGL ES، Metal Shading Language برای Metal API در iOS/macOS، HLSL برای Direct3D. از نظر مفهومی همه آنها عملیات یکسانی روی رأسها انجام میدهند.
پیچیدگی شیدر رأس مستقیماً بر FPS تأثیر میگذارد: دستورالعملهای بیشتر بر روی رأس = پردازش طولانیتر. بهینهسازی شامل کاهش تعداد رأسها از طریق LOD، استفاده از instancing و به حداقل رساندن پرشهای شرطی در کد شیدر است.
وظایف اصلی در بازیها: تبدیل مختصات از طریق ماتریسهای MVP، skinning شخصیتهای متحرک، تغییر شکل رویهای لباس و مو، morphing بین حالات صورت و اثرات ذرات با انیمیشن روی GPU.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید