Offscreen Rendering (العرض خارج الشاشة) هو تقنية لعرض مشهد ثلاثي الأبعاد ليس على الشاشة، بل في مخزن نسيج (FBO — Framebuffer Object)، والذي يمكن استخدامه لاحقاً كنسيج. وفقاً Apple Metal Documentation, 2025، يُستخدم العرض خارج الشاشة لإنشاء الظلال والانعكاسات والتأثيرات اللاحقة والمعالجة المسبقة للرسومات. Offscreen Rendering يسمح بتقسيم المشهد المعقد إلى تمريرات (passes) دون فقدان الجودة.
النقاط الرئيسية
Offscreen Rendering هو طريقة لعرض المحتوى الرسومي في مخزن مؤقت وسيط في ذاكرة الفيديو بدلاً من المخزن الرئيسي (framebuffer) الذي يُعرض على الشاشة. يتم حفظ نتيجة العرض خارج الشاشة في نسيج أو renderbuffer.
الهدف الرئيسي من العرض خارج الشاشة هو العرض متعدد التمريرات (multi-pass rendering). يتم تقسيم المشهد المعقد إلى عدة تمريرات: أولاً يُعرض المشهد في نسيج (offscreen)، ثم يُستخدم هذا النسيج كمدخل للتمريرة التالية، وهكذا حتى الحصول على الصورة النهائية. هذا النهج يتيح تحقيق تأثيرات مستحيلة في تمريرة واحدة.
الآلية الرئيسية للعرض خارج الشاشة في OpenGL ES هي Framebuffer Object (FBO). FBO هو حاوية يمكن إرفاق صور النسيج أو كائنات renderbuffer بها. بعد ربط FBO، يتم توجيه جميع أوامر العرض اللاحقة إلى النسيج المرفق، وليس إلى الشاشة.
Offscreen Rendering يتم تنفيذه عن طريق إنشاء كائن framebuffer منفصل، وإرفاق نسيج أو renderbuffer به، وتبديل سياق العرض إلى هذا FBO، وتنفيذ أوامر الرسم. بعد اكتمال التمريرة، يتم إعادة السياق إلى framebuffer الرئيسي.
تتكون العملية من ثلاث خطوات: إنشاء FBO وإرفاق نسيج — عرض المشهد في النسيج خارج الشاشة — استخدام النسيج الناتج في التمريرة التالية. GL_COLOR_ATTACHMENT0 يحدد أي نسيج لوني سيتم العرض عليه.
// إنشاء FBO للعرض خارج الشاشة (OpenGL ES 3.0)
GLuint fbo, offscreenTex;
glGenFramebuffers(1, &fbo);
glGenTextures(1, &offscreenTex);
glBindTexture(GL_TEXTURE_2D, offscreenTex);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
width, height, 0,
GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
glFramebufferTexture2D(GL_FRAMEBUFFER),
GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
offscreenTex, 0);
Offscreen Rendering يُستخدم لمجموعة واسعة من التأثيرات الرسومية. كل تقنية تتطلب تمريرة أو أكثر خارج الشاشة وتكويناً محدداً لـ FBO.
| التقنية | عدد التمريرات | الغرض |
|---|---|---|
| Shadow Mapping | 2+ | توليد خريطة الظلال من مصدر الضوء |
| Reflection Mapping | 1-2 | عرض الانعكاسات في خريطة مكعبة |
| Bloom Effect | 3-5 | توهج المناطق الساطعة من الصورة |
| HDR Rendering | 2 | تعديل النغمات (tone mapping) لصور HDR |
| Depth Prepass | 1 | ملء مسبق لمخزن العمق (depth buffer) |
تقنية أساسية يتم فيها حفظ نتيجة العرض في نسيج لاستخدامه لاحقاً. Render-to-Texture يُستخدم لإنشاء الخرائط المصغرة، وقوام الكائنات الديناميكية، والمعاينة المسبقة للمواد المعقدة.
التأثيرات المعقدة (HDR، bloom، depth of field) تتطلب عدة تمريرات متسلسلة. كل تمريرة تعرض المشهد في نسيج خارج الشاشة، وتطبق مرشحاً، وتمرر النتيجة إلى التمريرة التالية. هذا النهج يسمح بتراكم التأثيرات دون فقدان جودة الصورة النهائية.
Shadow Mapping هو مثال كلاسيكي لاستخدام العرض خارج الشاشة. يتم إنشاء الظل في تمريرتين: أولاً يُعرض المشهد من منظور مصدر الضوء في نسيج عمق (offscreen)، ثم أثناء العرض الرئيسي تتم مقارنة كل جزء (fragment) بخريطة العمق هذه لتحديد ما إذا كان في الظل.
التمريرة الأولى: يتم وضع الكاميرا في موضع مصدر الضوء، ويُعرض المشهد في مخزن خارج الشاشة، مسجلاً العمق فقط في النسيج. التمريرة الثانية: العرض الرئيسي مع فحص كل جزء — إذا كان عمقه أكبر من القيمة في خريطة العمق، فإن الجزء يكون مظللاً.
// Fragment Shader لتخطيط الظلال
in vec4 vShadowCoord;
uniform sampler2D uShadowMap;
float calcShadow(vec4 coord) {
vec3 uvw = coord.xyz / coord.w;
float depth = texture(uShadowMap, uvw.xy).r;
return (uvw.z > depth + 0.005) ? 0.3 : 1.0;
}
Offscreen Rendering يضيف تمريرات إضافية لوحدة معالجة الرسومات، مما يزيد من الحمل الحسابي الإجمالي واستهلاك الطاقة. في تطوير التطبيقات المحمولة، هذا أمر بالغ الأهمية: كل تبديل لـ FBO يتطلب تفريغاً للخط الأنابيب (pipeline flush) ووقتاً إضافياً.
للأجهزة المحمولة، يُوصى بما يلي: استخدام renderbuffer بدلاً من النسيج إذا لم تكن هناك حاجة لقراءة النتيجة (تمريرة عمق فقط)؛ اختيار الحد الأدنى من الدقة اللازمة للقوام خارج الشاشة؛ دمج التمريرات حيثما أمكن باستخدام MRT (Multiple Render Targets).
Offscreen Rendering على منصات مختلفة يتم تنفيذه عبر واجهات برمجة التطبيقات الخاصة بها. دعنا نستعرض أمثلة لـ OpenGL ES و Apple Metal.
// إعداد FBO وعرض المشهد في نسيج
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
glViewport(0, 0, texWidth, texHeight);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glUseProgram(offscreenProgram);
glBindVertexArray(sceneVAO);
glDrawElements(GL_TRIANGLES, indexCount, GL_UNSIGNED_SHORT, 0);
// العودة إلى framebuffer الافتراضي
glBindFramebuffer(GL_FRAMEBUFFER, 0);
// Metal: تمريرة عرض خارج الشاشة إلى نسيج
MTLRenderPassDescriptor passDesc = [MTLRenderPassDescriptor renderPassDescriptor];
passDesc.colorAttachments[0].texture = offscreenTexture;
passDesc.colorAttachments[0].loadAction = MTLLoadActionClear;
passDesc.colorAttachments[0].clearColor =
MTLClearColorMake(0.0, 0.0, 0.0, 0.0);
id<MTLCommandBuffer> cmdBuffer = [commandQueue commandBuffer];
id<MTLRenderCommandEncoder> enc =
[cmdBuffer renderCommandEncoderWithDescriptor:passDesc];
[enc drawIndexedPrimitives:MTLPrimitiveTypeTriangle
indexCount:indexCount
indexType:MTLIndexTypeUInt16
indexBuffer:indexBuffer
indexBufferOffset:0];
[enc endEncoding];
الأسئلة الشائعة
Offscreen Rendering هو عندما تُرسَم الرسومات ليس على الشاشة، بل في مخزن غير مرئي (نسيج). يُستخدم هذا المخزن لاحقاً كنسيج لتأثيرات أخرى. تخيل أنك ترسم على ورقة شفافة ثم تضعها فوق الصورة النهائية.
العرض خارج الشاشة يتيح إنشاء تأثيرات مستحيلة في تمريرة واحدة: الظلال (العرض من منظور الضوء)، الانعكاسات، التمويه، التوهج (bloom) وتعديل نغمات HDR. كل تأثير يتطلب تمريرة منفصلة إلى نسيج خارج الشاشة.
نعم، كل تمريرة خارج الشاشة تضاعف كمية عمل وحدة معالجة الرسومات، لأن المشهد يُعرض مرة أخرى. يشمل التحسين تقليل دقة القوام خارج الشاشة، واستخدام renderbuffer، ودمج التمريرات عبر MRT (Multiple Render Targets).
FBO (Framebuffer Object) هو حاوية يتم إرفاق القوام أو renderbuffers بها. Texture يسمح بقراءة نتائج العرض (ضروري لـ shadow mapping والتأثيرات اللاحقة). Renderbuffer أسرع، لكن محتواه لا يمكن استخدامه كنسيج.
جميع واجهات برمجة التطبيقات الرسومية الحديثة: OpenGL ES (عبر FBO)، Apple Metal (عبر MTLRenderPassDescriptor)، Vulkan (عبر VkFramebuffer)، Direct3D (عبر Render Target View). من الناحية المفاهيمية، الآلية هي نفسها — العرض في نسيج بدلاً من الشاشة.
الملخص
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.