Shader: ما هو، أنواع الشادرات وكيف تعمل

المؤلف: IT Sectr نُشر: 2026-06-11 وقت القراءة: 8 دق

Shader «شادر» — هو برنامج يتم تنفيذه على وحدة معالجة الرسوميات لمعالجة البيانات الرسومية: الرؤوس، الأجزاء أو المهام الحسابية. بخلاف الكود العادي على وحدة المعالجة المركزية، يعمل الشادر بشكل متوازٍ على مئات الأنوية، معالجةً كل عنصر بشكل مستقل. وفقًا لـ Khronos Group (2025)، تستخدم الشادرات في 100% من التطبيقات ثلاثية الأبعاد الحديثة — من ألعاب المحمول إلى تأثيرات واجهة المستخدم في تطبيقات النظام. يكتب المطورون الشادرات بلغات متخصصة: GLSL، HLSL، Metal Shading Language أو SPIR-V.

النقاط الرئيسية

  • Shader — برنامج لوحدة معالجة الرسوميات يتنفذ بشكل متوازٍ على مئات الأنوية لكل عنصر من المشهد.
  • أنواع الشادرات: شادرات الرؤوس، الفراغم، الحسابية، الهندسية، التجزئة والشبكية.
  • اللغات: GLSL (OpenGL)، HLSL (DirectX)، MSL (Metal)، SPIR-V (Vulkan) — كلها تترجم إلى كود آلة لوحدة المعالجة الرسومية.
  • الشادرات في التطوير المحمول تستخدم للتأثيرات، المعالجة اللاحقة، الإضاءة والحسابات.
  • تحسين الشادرات: دقة mediump، تقليل التفرعات و ATF (الجلب المتكيف للنسيج) لوحدات معالجة الرسوميات المحمولة.

ما هو الشادر؟

الشادر — هو برنامج صغير مكتوب بلغة متخصصة ويتم تنفيذه على وحدة معالجة الرسوميات. يقوم كل شادر بمعالجة عنصر واحد من البيانات — رأسًا، فراغمًا (بكسلاً) أو عنصر عمل — بشكل مستقل عن الآخرين. يتيح التوازي في وحدة معالجة الرسوميات تشغيل آلاف نسخ الشادر في نفس الوقت.

تم إدخال المصطلح من قبل Pixar في الثمانينيات لوصف البرامج التي تتحكم في مظهر الأسطح في RenderMan. ظهرت الشادرات المتعددة للوقت الحقيقي مع NVIDIA GeForce 3 (2001) — أول بطاقة رسوميات بخط أنابيب قابل للبرمجة. قبل الشادرات، كانت الرسوميات تُكون من خلال معلمات ثابتة: اللون، النسيج، وضع المزج.

وفقًا لـ Unity Technologies (2025)، فإن متوسط لعبة الهاتف المحمول يستخدم 50–200 شادرًا. كل شادر له متغيرات لمنصات مختلفة ومستويات جودة وتكوينات إضاءة. يمكن أن يصل عدد المتغيرات إلى 10 000 للمشروع الواحد.

تنقسم معمارية الشادر إلى بيانات إدخال (السمات، متغيرات uniform، الأنسجة)، كود البرنامج و بيانات إخراج (اللون، الموقع). تُعيّن متغيرات uniform من وحدة المعالجة المركزية قبل تنفيذ الشادر وتظل ثابتة لجميع عناصر الإطار. السمات هي بيانات لكل عنصر (إحداثيات الرأس، المتجه، إحداثيات UV).

نموذج تنفيذ SIMT

SIMT (تعليمة واحدة، عدة خيوط) — نموذج تنفيذ الشادرات على وحدة معالجة الرسوميات. يتم تحميل التعليمة مرة واحدة وتُنفّذ بواسطة مئات الخيوط على بيانات مختلفة. على سبيل المثال، يُطلق Fragment Shader لـ 1000 بكسل 1000 خيط بنفس الكود، ولكن كل خيط يستلم إحداثيات UV الخاصة به والسمات المقيسة.

نتيجة مهمة لـ SIMT: التفرعات في الشادرات مكلفة. إذا كان داخل كتلة if نصف الخيوط تسلك مسارًا واحدًا والنصف الآخر مسارًا آخر، تُنفّذ وحدة المعالجة الرسومية كلتا الفرعين بالتسلسل لجميع الخيوط. ينخفض الأداء إلى 50%. تجنب التفرعات الديناميكية في الشادرات أو قلّلها من خلال الحساب المسبق على وحدة المعالجة المركزية.

أنواع الشادرات

وحدات معالجة الرسوميات الحديثة تدعم عدة أنواع من الشادرات، كل نوع لمرحلته خاصة في خط الأنابيب الرسومي أو الحسابي. دعنا نستعرض الأنواع الرئيسية: شادرات الرؤوس، الفراغم، الحسابية وشادرات الشبكة الحديثة.

نوع الشادرمرحلة خط الأنابيبيعالجاللغة
Vertex Shaderالرؤوسكل رأسGLSL, HLSL
Fragment Shaderالفراغمكل بكسلGLSL, HLSL
Compute Shaderحسابيبيانات عشوائيةGLSL, HLSL
Geometry ShaderهندسيالأولياتGLSL, HLSL
Tessellation ShaderالتجزئةالرقعGLSL, HLSL
Mesh Shaderخط أنابيب الشبكةTask + MeshHLSL, MSL

Vertex Shader

Vertex Shader يعالج كل رأس من هندسة الشكل: يحوّل الإحداثيات، يحسب الإضاءة، ينقل البيانات إلى شادر الفراغم. هذه مرحلة إجبارية في خط الأنابيب الرسومي — بدونها، لن تصل الرؤوس إلى الشاشة. يتم تنفيذ Vertex Shader لكل رأس في كل إطار.

Fragment Shader

Fragment Shader (أو Pixel Shader) — المرحلة الأكثر استهلاكًا للموارد. يحسب اللون النهائي لكل فراغم باستخدام الأنسجة والإضاءة والمادة. يتم تنفيذ Fragment Shader لكل بكسل مغطى بالهندسة، مع مراعاة جميع الأنسجة والتأثيرات المتراكبة. إن تحسين هذا الشادر يعطي أكبر زيادة في الأداء.

Compute Shader

Compute Shader — شادر عام للحسابات العشوائية على وحدة معالجة الرسوميات. بخلاف شادرات الرسوميات، ليس مرتبطًا بالهندسة أو البكسلات. يعمل Compute Shader مع بافرات بيانات عشوائية من خلال مجموعات عمل. يستخدم للفيزياء، محاكاة الجسيمات، التأثيرات اللاحقة واستنتاج الشبكات العصبية.

Mesh Shader

Mesh Shader — أحدث أنواع الشادرات، ظهر مع NVIDIA Turing (2018) و Metal 3. يستبدل Mesh Shader شادرات الرؤوس والهندسة والتجزئة بخط أنابيب شبكي واحد. يعمل بالتعاون مع Task Shader: يقرر Task Shader ما مجموعات الشبكة التي ستعرض، ويقوم Mesh Shader بتوليد الهندسة فوريًا.

لغات كتابة الشادرات

تُكتب الشادرات بلغات متخصصة تترجم إلى كود آلة لوحدة معالجة الرسوميات. يعتمد اختيار اللغة على المنصة وواجهة البرمجة. دعنا نستعرض اللغات الرئيسية: GLSL، HLSL، Metal Shading Language والتنسيق الوسيط SPIR-V.

GLSL (OpenGL Shading Language)

GLSL — لغة الشادرات لـ OpenGL، OpenGL ES و WebGL. يستند تركيبه على C مع إضافة أنواع متجهات (vec2، vec4، mat4) ودوال مضمنة (texture، normalize، reflect). GLSL ES هي النسخة للأجهزة المحمولة بدقة محدودة (lowp، mediump، highp). وفقًا لـ Khronos (2025)، تظل GLSL أكثر لغات الشادرات انتشارًا بفضل دعمها المتعدد المنصات.

glsl
#version 300 es
precision mediump float;
in vec2 v_texCoord;
uniform sampler2D u_texture;
out vec4 fragColor;

void main() {
    fragColor = texture(u_texture, v_texCoord);
}

شادر فراغمي بسيط يقرأ اللون من نسيج عبر إحداثيات UV. precision mediump توجه وحدة المعالجة الرسومية لاستخدام نصف الدقة للأعداد العائمة — يسرّع التنفيذ على الأجهزة المحمولة بنسبة 25–40%.

HLSL (High-Level Shader Language)

HLSL — لغة الشادرات من Microsoft لـ DirectX. تركيبها أقرب إلى C++ مع دعم للفئات والهياكل والقوالب. تستخدم HLSL في تطبيقات Windows ومن خلال Shader Model 6.7+ تدعم Ray Tracing و Mesh Shaders و Sampler Feedback. للتطوير المحمول، لا تستخدم HLSL مباشرة ولكن تترجم إلى SPIR-V لـ Vulkan.

Metal Shading Language

MSL (Metal Shading Language) — لغة الشادرات من Apple المبنية على C++14. بخلاف GLSL و HLSL، تترجم MSL مع التطبيق، مما يلغي الترجمة الفورية JIT على الجهاز. تدعم MSL المؤشرات والقوالب ومكتبة C++ القياسية. تستخدم على جميع أجهزة Apple: iPhone، iPad، Mac، Apple TV.

cpp
#include <metal_stdlib>
using namespace metal;
struct VertexOut {
    float4 position [[position]];
    float2 texCoord;
};

fragment float4
myFragment(VertexOut in [[stage_in]],
            texture2d<float> tex [[texture(0)]]) {
    constexpr sampler s = sampler(filter::linear);
    return tex.sample(s, in.texCoord);
}

تستخدم MSL السمات [[position]]، [[stage_in]] و [[texture(N)]] لربط الموارد. يقوم مجمع Apple بتوليد كود محسّن لوحدة المعالجة الرسومية الحالية، مراعيًا عدد المسجلات والذاكرة المخفية.

SPIR-V

SPIR-V — تنسيق ثنائي وسيط للشادرات، وهو المعيار لـ Vulkan. تُكتب الشادرات بـ GLSL أو HLSL، ثم تترجم إلى SPIR-V وتحمّل في تطبيق Vulkan. SPIR-V ليس مرتبطًا بلغة محددة — يوجد مترجمات من Rust، Python، OpenCL C إلى SPIR-V.

الشادرات في التطوير المحمول

الشادرات على المنصات المحمولة لها قيود مقارنة بأجهزة الكمبيوتر المكتبي: عدد أقل من المسجلات، دقة محدودة وعدم دعم بعض التعليمات. دعنا نتعرف على خصائص الشادرات على Android (Vulkan/OpenGL ES) و iOS (Metal).

الشادرات على Android

Android يستخدم GLSL ES لـ OpenGL و SPIR-V لـ Vulkan. OpenGL ES 3.2 يدعم الشادرات بدقة mediump افتراضيًا. Vulkan يتطلب ترجمة صريحة من GLSL إلى SPIR-V عبر glslangValidator. على Android، تحمّل الشادرات من موارد نصية أو من ملفات SPIR-V مجمعة.

Qualcomm Adreno GPU تحسّن الشادرات على مستوى برنامج التشغيل. التوصيات: استخدم mediump لللون و UV، highp فقط للمواقع؛ تجنب عينات النسيج في شادرات الرؤوس؛ جمّع الحسابات في متجهات (vec4 بدلاً من 4x float). وفقًا لـ Qualcomm (2025)، هذه التحسينات تعطي تحسنًا بنسبة 30–50%.

الشادرات على iOS

iOS يستخدم حصريًا Metal Shading Language. تترجم الشادرات إلى كود آلة مع التطبيق عبر Xcode. يوفر Metal مصحح الشادرات و التقاط GPU لتحليل أداء الشادرات. وحدة معالجة الرسوميات لـ Apple (TBDR) لها تحسينات محددة: اختبار الفراغم المبكر، أهداف التجسيم دون ذاكرة والمزج القابل للبرمجة.

وفقًا لـ Apple WWDC 2024، من الضروري لشادرات iOS استخدام half بدلاً من float، الحد من ضغط المسجلات (حد أقصى 64 مسجلاً) وتجنب عينات النسيج التابعة. يجب أن تكون شادرات iOS مدمجة — الحجم الأمثل هو 50–100 تعليمة ALU.

الشادرات في Unity و Unreal Engine

توفر محركات الألعاب Unity و Unreal Engine محررات شادرات مرئية (Shader Graph، Material Editor) ولغات مجردة (ShaderLab، USF). يكتب المطور الشادرات بلغة عالية المستوى، ويقوم المحرك بترجمتها للمنصة المستهدفة. يستخدم Unity HLSL كلغة وسيطة، ويستخدم Unreal USF (تنسيق الشادر لـ Unreal).

تحسين الشادرات

تحسين الشادرات — مرحلة رئيسية في تطوير الرسوميات للأجهزة المحمولة. يمكن لشادر مكتوب بشكل سيئ أن يخفض FPS من 60 إلى 20. دعنا نستعرض القواعد والتقنيات الرئيسية للتحسين.

دقة الحساب

استخدم أدنى دقة كافية: lowp لللون و UV، mediump للمتجهات والإضاءة، highp فقط للمواقع والمصفوفات. وفقًا لـ ARM (2025)، عمليات mediump أسرع بمرتين من highp على GPU Mali. في GLSL ES، يتم تحديد ذلك من خلال مؤهّلات الدقة.

تقليل عينات النسيج

عينات النسيج — أغلى عملية في الشادر (10–30 دورة مقابل 1–2 لتعليمة ALU). قلّل عدد العينات: ادمج الأنسجة في أطلس، خزّن البيانات في مصفوفات uniform بدلاً من الأنسجة، خزّن نتائج البكسلات المجاورة من خلال تعليمات المشتقة.

تجنب التفرعات

التفرعات الديناميكية (if مع متغير uniform) تقلّل أداء خط أنابيب SIMT. استبدل التفرعات بدوال رياضية: mix()، step()، smoothstep() و clamp(). تتنفّذ هذه الدوال في 1–2 تعليمة، بينما يمكن أن تُكلّف التفرعة 8–16 تعليمة بسبب اختلاف الخيوط.

glsl
// Bad: dynamic branching in shader
if (u_enableLight) {
    color *= computeLighting(normal);
}

// Good: mathematical branch replacement
color *= mix(1.0, computeLighting(normal),
              float(u_enableLight));

تقوم mix() بإجراء استقرار خطي بين قيمتين. عندما u_enableLight=0، تعود 1.0 — لا يتغير اللون. عندما u_enableLight=1، تعود نتيجة الإضاءة. لا وجود للتفرعات — جميع الخيوط تُنفّذ نفس الكود.

أمثلة شادرات

دعنا نستعرض أمثلة عملية للشادرات في التطوير المحمول — من التظليل البسيط إلى التوليد الإجرائي للنسيج. يوضّح كل مثال تقنية محددة.

تظليل Phong (Vertex Shader)

نموذج Phong — نموذج إضاءة كلاسيكي بمكوّنات منتشرة ومرآة. يحسب Vertex Shader الإضاءة لكل رأس، ويقوم Fragment Shader فقط بتقدير النتيجة (تظليل Gouraud). مناسب للأجهزة المحمولة بسبب تكلفته المنخفضة.

glsl
#version 300 es
layout(location = 0) in vec4 a_position;
layout(location = 1) in vec3 a_normal;
uniform mat4 u_mvp;
uniform mat4 u_modelView;
out vec3 v_color;

void main() {
    vec3 normal = normalize(mat3(u_modelView) * a_normal);
    vec3 lightDir = normalize(vec3(0.0, 1.0, 1.0));
    float diff = max(dot(normal, lightDir), 0.0);
    v_color = vec3(0.8, 0.2, 0.2) * (0.3 + diff * 0.7);
    gl_Position = u_mvp * a_position;
}

يحسب الشادر الإضاءة المنتشرة: الضرب النقطي للمتجه واتجاه الضوء. يتم مزج النتيجة مع مكوّني المحيط (0.3) والمنتشر (0.7). يُنفّذ 10–15 تعليمة ALU لكل رأس — مقبول لـ 100 000 مضلع عند 60 FPS على وحدة معالجة رسوميات محمولة.

نسيج إجرائي (Fragment Shader)

الأنسجة الإجرائية تتولّد في Fragment Shader دون تحميل من ملف. يوفر ذلك ذاكرة الفيديو ويبسّط الرسوم المتحركة. مثال — رقعة شطرنج بحجم خلية قابل للتعديل. فقط عدة تعليمات ALU — حمل أدنى على وحدة المعالجة الرسومية.

glsl
#version 300 es
precision mediump float;
in vec2 v_uv;
uniform float u_cells;
out vec4 fragColor;

void main() {
    vec2 cell = floor(v_uv * u_cells);
    float isWhite = mod(cell.x + cell.y, 2.0);
    fragColor = mix(vec4(0.1, 0.1, 0.1, 1.0),
                     vec4(0.9, 0.9, 0.9, 1.0),
                     isWhite);
}

8 تعليمات ALU — شادر مثالي للأجهزة المحمولة. u_cells تحدّد عدد الخلايا في كل محور. floor و mod هما عمليات رخيصة، تُنفّذ في دورة واحدة على جميع وحدات معالجة الرسوميات المحمولة.

الأسئلة الشائعة

ما الفرق بين الشادر وبرنامج C++ العادي؟

الشادر يتنفّذ على وحدة معالجة الرسوميات في وضع SIMT — تعليمة واحدة لمئات الخيوط. برنامج C++ العادي ​​يتنفّذ على وحدة المعالجة المركزية في وضع MIMD. لا يملك الشادر وصولًا إلى نظام الملفات أو الإدخال/الإخراج أو الذاكرة الديناميكية. يتلقّى البيانات من خلال البافرات والأنسجة ويعيد موقعًا أو لونًا.

أي لغة شادرات أتعلم للتطوير المحمول؟

GLSL — لـ OpenGL ES و WebGL، متعدد المنصات. Metal Shading Language — لـ iOS. HLSL — أساس Unity و Unreal Engine. ابدأ بـ GLSL — فهم الأساسيات ينتقل إلى أي لغة شادرات.

لماذا تبطؤ الشادرات على الأجهزة المحمولة؟

الأسباب الرئيسية: الدقة العالية (highp بدلاً من mediump)، عينات نسيج مفرطة، التفرعات الديناميكية وتجاوز حد المسجلات. استخدم RenderDoc أو Xcode GPU Frame Debugger لتحليل الشادرات.

ما هو compute shader ولماذا نحتاجه؟

Compute Shader — شادر للحسابات العشوائية على وحدة معالجة الرسوميات: فيزياء الجسيمات، معالجة الصور، محاكاة الأقمشة. بخلاف Fragment Shader، ليس مرتبطًا بالبكسلات ويمكنه الكتابة في بافرات عشوائية.

هل يمكن كتابة الشادرات بدون معرفة لغات البرمجة؟

نعم، من خلال المحررات المرئية: Shader Graph في Unity، Material Editor في Unreal Engine أو Metal Shader Converter. هي تولّد كود الشادر استنادًا إلى مخطط عقدي. للتحسين العميق ستحتاج إلى فهم لغة الشادرات.

الخلاصة

  • Shader — برنامج متوازٍ لوحدة معالجة الرسوميات يعالج الرؤوس والفراغم أو البيانات العشوائية بشكل كتلي.
  • أنواع الشادرات: Vertex، Fragment، Compute، Geometry، Tessellation و Mesh — كل نوع مسؤول عن مرحلته في خط الأنابيب.
  • اللغات: GLSL (OpenGL)، HLSL (DirectX)، MSL (Metal)، SPIR-V (Vulkan) — تترجم إلى كود آلة لوحدة المعالجة الرسومية.
  • خصائص الأجهزة المحمولة: دقة mediump، أدنى عينات النسيج، دون تفرعات ديناميكية.
  • التحسين: mix() بدلاً من if، دقة half، ATF، دمج الأنسجة في أطلس والحساب المسبق على وحدة المعالجة المركزية.
  • التطبيقات: إضاءة Phong، أنسجة إجرائية، تأثيرات لاحقة، فيزياء الجسيمات وتأثيرات واجهة المستخدم.
  • الأدوات: RenderDoc، Xcode GPU Debugger، Qualcomm Adreno Profiler و Mali Offline Compiler لتحليل الشادرات.

سنقوم بتطوير تطبيق جوال جاهز

تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.

مناقشة المشروع

اقرأ أيضًا