Vertex Shader: چیست، وظایف و اصل کار

نویسنده: IT Sectr منتشر شده: 2026-06-11 زمان مطالعه: 10 دقیقه

Vertex Shader یک مرحله قابل برنامه‌ریزی از خط لوله گرافیک (graphics pipeline) است که هر رأس از مدل سه‌بعدی را پردازش می‌کند. به گفته Khronos Group, 2025، شیدر رأس ویژگی‌های رأس‌ها — مختصات، نرمال‌ها، رنگ و مختصات بافت — را دریافت کرده و آنها را طبق منطق مشخص شده تبدیل می‌کند. Vertex Shader برای هر رأس به طور مستقل اجرا می‌شود که امکان موازی‌سازی مؤثر محاسبات را روی هزاران هسته GPU فراهم می‌کند.

نکات اصلی

  • Vertex Shader — مرحله قابل برنامه‌ریزی GPU که هر رأس مدل 3D را مستقل از دیگران پردازش می‌کند.
  • تبدیل مختصات از فضای شیء به فضای صفحه — وظیفه اصلی شیدر رأس.
  • OpenGL ES 3.0 و Metal Shading Language APIهای استانداردی برای نوشتن شیدرهای رأس ارائه می‌دهند.
  • عملکرد Vertex Shader به تعداد رأس‌ها و پیچیدگی کد شیدر بستگی دارد.
  • Skinning و morphing رأس‌ها — وظایف معمولی که در شیدر رأس روی GPU پیاده‌سازی می‌شوند.

Vertex Shader چیست؟

Vertex Shader یک مرحله قابل برنامه‌ریزی از خط لوله گرافیک (graphics pipeline) است که هر رأس از مدل سه‌بعدی را به صورت جداگانه پردازش می‌کند. رأس (vertex) یک نقطه در فضای سه‌بعدی است که شامل ویژگی‌هایی است: مختصات xyz، نرمال‌ها، رنگ و مختصات بافت UV.

برخلاف خط لوله ثابت (fixed-function pipeline) که در آن تبدیل‌ها بر اساس الگوریتم از پیش تعیین شده انجام می‌شد، Vertex Shader به برنامه‌نویس کنترل کامل بر تبدیل رأس‌ها را می‌دهد. این امکان پیاده‌سازی انیمیشن رویه‌ای، تغییر شکل مدل‌ها، skinning اسکلتی و هرگونه تبدیل ریاضی در سمت GPU را فراهم می‌کند.

جایگاه Vertex Shader در خط لوله گرافیک

خط لوله گرافیک OpenGL ES شامل دنباله‌ای از مراحل از داده‌های ورودی تا تصویر نهایی است. Vertex Shader بعد از مرحله مونتاژ رأس‌ها (vertex assembly) و قبل از مرحله رسترایزیشن قرار دارد. هر رأس که از CPU از طریق بافر رأس ارسال می‌شود، دقیقاً یک بار از Vertex Shader عبور کرده و نتیجه برای مونتاژ اولیه‌ها به مرحله بعد منتقل می‌شود.

مرحله خط لولهکاربرد
Vertex Specificationانتقال داده‌های رأس و ویژگی‌ها از VBO
Vertex Shaderپردازش هر رأس، تبدیل مختصات
Tessellationتقسیم اختیاری هندسه به زیراولیه‌ها
Geometry Shaderتولید یا حذف اختیاری اولیه‌ها
Rasterizationتبدیل اولیه‌ها به قطعات برای پر کردن

Vertex Shader چگونه کار می‌کند؟

Vertex Shader ویژگی‌های رأس را از بافر رأس (VBO) از طریق اشاره‌گرهای ویژگی رأس (vertex attribute pointers) که در کد CPU پیکربندی شده‌اند دریافت می‌کند. برنامه‌نویس کد شیدر را به زبان GLSL (OpenGL Shading Language) یا زبان مشابه می‌نویسد که توسط درایور GPU به دستورالعمل‌های ماشین برای تراشه خاص کامپایل می‌شود.

فرآیند پردازش رأس

برای هر رأس، Vertex Shader به ترتیب سه عملیات را انجام می‌دهد: خواندن ویژگی‌های ورودی — اعمال تبدیل‌های تعریف شده توسط برنامه‌نویس — نوشتن نتایج در متغیرهای خروجی. حداقل خروجی اجباری — موقعیت رأس در فضای برش (gl_Position). تمام داده‌های خروجی دیگر (رنگ، نرمال‌ها، مختصات بافت) درون‌یابی شده و به مرحله بعد — Fragment Shader — منتقل می‌شوند.

glsl
#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

Vertex Shader طیف وسیعی از وظایف خط لوله گرافیک مرتبط با تبدیل هندسه را حل می‌کند. هر وظیفه از طریق عملیات ریاضی بر روی بردارها و ماتریس‌ها اجرا می‌شود که به صورت موازی برای هزاران رأس به طور همزمان انجام می‌شود.

تبدیل مختصات از طریق MVP

وظیفه پایه و رایج‌ترین — ضرب مختصات رأس در ماتریس‌های model، view و projection (MVP). ماتریس MVP رأس را از فضای محلی مدل به فضای برش (clip space) تبدیل می‌کند، که سپس در مراحل خودکار خط لوله نرمال‌سازی شده و به مختصات صفحه تبدیل می‌شود.

انیمیشن اسکلتی (Skinning)

برای شخصیت‌های متحرک، Vertex Shader انیمیشن اسکلتی (skinning) را پیاده‌سازی می‌کند. هر رأس به چند استخوان با وزن‌های مشخص متصل است. Vertex blending — مجموع وزنی تبدیل‌های استخوان‌های متصل — امکان تغییر شکل نرم پوست شخصیت را هنگام حرکت اسکلت فراهم می‌کند.

تغییر شکل رویه‌ای هندسه

Vertex Shader می‌تواند هندسه را بر اساس زمان یا سایر پارامترهای uniform بدون مشارکت CPU تغییر دهد. Wave deformation، جابجایی‌های نویز بر اساس نویز پرلین و اثرات موج روی آب — همه این اثرات در شیدر رأس بدون بارگذاری مجدد هندسه از حافظه RAM پیاده‌سازی می‌شوند.

Vertex Shader در مقابل Fragment Shader: تفاوت‌ها

اگرچه هر دو نوع شیدر مراحل قابل برنامه‌ریزی خط لوله گرافیک هستند، Vertex Shader و Fragment Shader وظایف اساساً متفاوتی را حل کرده و در مراحل مختلف پردازش تصویر کار می‌کنند.

ویژگیVertex ShaderFragment Shader
داده‌های ورودیویژگی‌های رأس از VBOداده‌های درون‌یابی شده از VS
تعداد فراخوانیتعداد رأس‌هاتعداد قطعات
وظیفه اصلیتبدیل هندسهمحاسبه رنگ پیکسل
بار محاسباتیپیچیدگی هندسهرزولوشن صفحه
دسترسی به بافت‌هامحدود (از طریق texture lookup)دسترسی کامل

تفاوت کلیدی — تعداد فراخوانی. Vertex Shader برای هر رأس یک بار فراخوانی می‌شود، در حالی که Fragment Shader برای هر قطعه (پیکسل). در یک صحنه با رزولوشن بالا، تعداد فراخوانی‌های Fragment Shader هزاران بار از تعداد فراخوانی‌های Vertex Shader بیشتر است که بهینه‌سازی شیدرهای پیکسل را حیاتی‌تر می‌کند.

عملکرد و بهینه‌سازی Vertex Shader

عملکرد Vertex Shader برای برنامه‌های زمان‌واقعی حیاتی است، به ویژه در توسعه موبایل با مصرف انرژی محدود. عوامل اصلی عملکرد — تعداد رأس‌ها، پیچیدگی کد شیدر و پهنای باند حافظه GPU.

عوامل مؤثر بر عملکرد

  • Vertex count — تعداد رأس‌های ارسال شده به GPU در هر فریم. مدل‌های با میلیون‌ها پلی‌گون بار بالایی بر شیدر رأس ایجاد می‌کنند.
  • Shader complexity — تعداد دستورالعمل‌ها در شیدر. حلقه‌های تو در تو و پرش‌های شرطی (divergence) عملکرد موازی بلوک‌های SIMD را کاهش می‌دهند.
  • Bandwidth — سرعت خواندن داده‌های رأس از حافظه ویدئو. فرمت ویژگی‌ها (float32، float16، عدد صحیح نرمال‌شده) مستقیماً بر پهنای باند تأثیر می‌گذارد.

روش‌های بهینه‌سازی شیدرهای رأس

برای کاهش بار Vertex Shader رویکردهای زیر اعمال می‌شوند. Level of Detail (LOD) — تغییر به نسخه‌های ساده‌شده مدل‌ها هنگام دور شدن دوربین از شیء. Instancing — ترسیم مکرر یک هندسه با ماتریس‌های تبدیل مختلف در یک فراخوانی ترسیم (draw call).

glsl
// 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

Vertex Shader در APIهای گرافیکی مختلف منطق مشابهی دارد اما نحو و قراردادهای نام‌گذاری متفاوتی دارد. پیاده‌سازی یک شیدر رأس پایه در GLSL برای OpenGL ES 3.0 و در Metal Shading Language برای iOS و macOS را بررسی می‌کنیم.

نمونه در GLSL برای OpenGL ES 3.0

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

نمونه در Metal Shading Language

cpp
#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 به زبان ساده چیست؟

Vertex Shader برنامه‌ای روی GPU است که هر رأس مدل 3D را پردازش کرده و مختصات آن را به مختصات صفحه تبدیل می‌کند. مدل را به عنوان شبکه‌ای از نقاط تصور کنید؛ شیدر رأس این نقاط را طبق قوانین ریاضی مشخص شده جابجا می‌کند.

Vertex Shader چه تفاوتی با Fragment Shader دارد؟

Vertex Shader رأس‌ها را پردازش کرده و مسئول هندسه است، در حالی که Fragment Shader رنگ هر پیکسل را تعیین می‌کند. اولی برای هر رأس (هزاران) فراخوانی می‌شود، دومی برای هر پیکسل (میلیون‌ها).

Vertex Shader به چه زبان‌هایی نوشته می‌شود؟

Vertex Shader به زبان متناسب با API گرافیکی نوشته می‌شود: GLSL برای OpenGL ES، Metal Shading Language برای Metal API در iOS/macOS، HLSL برای Direct3D. از نظر مفهومی همه آنها عملیات یکسانی روی رأس‌ها انجام می‌دهند.

Vertex Shader چگونه بر عملکرد تأثیر می‌گذارد؟

پیچیدگی شیدر رأس مستقیماً بر FPS تأثیر می‌گذارد: دستورالعمل‌های بیشتر بر روی رأس = پردازش طولانی‌تر. بهینه‌سازی شامل کاهش تعداد رأس‌ها از طریق LOD، استفاده از instancing و به حداقل رساندن پرش‌های شرطی در کد شیدر است.

Vertex Shader چه وظایفی را در بازی‌ها حل می‌کند؟

وظایف اصلی در بازی‌ها: تبدیل مختصات از طریق ماتریس‌های MVP، skinning شخصیت‌های متحرک، تغییر شکل رویه‌ای لباس و مو، morphing بین حالات صورت و اثرات ذرات با انیمیشن روی GPU.

خلاصه

  • Vertex Shader — مرحله قابل برنامه‌ریزی خط لوله گرافیک که هر رأس مدل 3D را مستقل پردازش می‌کند.
  • وظیفه اصلی — تبدیل مختصات رأس‌ها از فضای محلی به فضای صفحه از طریق ماتریس‌های MVP.
  • Vertex Shader به صورت موازی روی هسته‌های متعدد GPU اجرا می‌شود و عملکرد بالایی با میلیون‌ها رأس فراهم می‌کند.
  • Skinning، morphing و انیمیشن رویه‌ای در شیدر رأس بدون مشارکت CPU پیاده‌سازی می‌شوند.
  • تعداد فراخوانی Vertex Shader برابر با تعداد رأس‌ها است — بسیار کمتر از فراخوانی‌های Fragment Shader.
  • بهینه‌سازی شامل مدل‌های LOD، instancing و به حداقل رساندن انشعابات در کد شیدر است.
  • GLSL و Metal Shading Language — زبان‌های اصلی برای شیدرهای رأس در توسعه موبایل.

ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد

IT Sectr از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه

همچنین بخوانید