Offscreen Rendering (آف اسکرین رینڈرنگ) — 3D منظر کو اسکرین پر نہیں، بلکہ ٹیکسچر بفر (FBO — Framebuffer Object) میں رینڈر کرنے کی تکنیک ہے، جسے بعد میں ٹیکسچر کے طور پر استعمال کیا جا سکتا ہے۔ Apple Metal Documentation, 2025 کے مطابق، آف اسکرین رینڈرنگ شیڈو، ریفلیکشن، پوسٹ ایفیکٹس اور گرافکس کی پری پروسیسنگ کے لیے استعمال ہوتی ہے۔ Offscreen Rendering پیچیدہ منظر کو معیار کھونے کے بغیر پاسز (passes) میں تقسیم کرنے کی اجازت دیتی ہے۔
اہم نکات
Offscreen Rendering گرافیکل مواد کو مرکزی فریم بفر (جو اسکرین پر دکھایا جاتا ہے) کے بجائے ویڈیو میموری میں ایک انٹرمیڈیٹ بفر میں رینڈر کرنے کا طریقہ ہے۔ آف اسکرین رینڈرنگ کا نتیجہ ٹیکسچر یا 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 | HDR تصاویر کے لیے ٹون میپنگ |
| Depth Prepass | 1 | ڈیپتھ بفر کو پہلے سے بھرنا |
ایک بنیادی تکنیک جس میں رینڈرنگ کا نتیجہ بعد میں استعمال کے لیے ٹیکسچر میں محفوظ کیا جاتا ہے۔ 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 اضافی GPU پاسز شامل کرتی ہے، جس سے مجموعی حسابی بوجھ اور بجلی کی کھپت بڑھ جاتی ہے۔ موبائل ڈیولپمنٹ میں یہ خاص طور پر اہم ہے: ہر FBO کی تبدیلی کے لیے پائپ لائن فلش اور اضافی وقت درکار ہوتا ہے۔
موبائل آلات کے لیے سفارش: اگر نتیجہ پڑھنے کی ضرورت نہیں ہے تو ٹیکسچر کے بجائے renderbuffer استعمال کریں (صرف ڈیپتھ پاس)؛ آف اسکرین ٹیکسچر کے لیے کم از کم ضروری ریزولوشن منتخب کریں؛ جہاں ممکن ہو MRT (Multiple Render Targets) کے ذریعے پاسز کو ضم کریں۔
Offscreen Rendering مختلف پلیٹ فارمز پر ان کے اپنے API کے ذریعے لاگو کیا جاتا ہے۔ 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 ٹوننگ۔ ہر اثر کے لیے آف اسکرین ٹیکسچر میں علیحدہ پاس درکار ہے۔
ہاں، ہر آف اسکرین پاس GPU کے کام کی مقدار کو دوگنا کر دیتا ہے، کیونکہ منظر دوبارہ رینڈر ہوتا ہے۔ اصلاح میں آف اسکرین ٹیکسچر ریزولوشن کم کرنا، renderbuffer استعمال کرنا، اور MRT (Multiple Render Targets) کے ذریعے پاسز کو ضم کرنا شامل ہے۔
FBO (Framebuffer Object) ایک کنٹینر ہے جس میں ٹیکسچر یا renderbuffer منسلک ہوتے ہیں۔ Texture رینڈرنگ کے نتائج پڑھنے کی اجازت دیتا ہے (شیڈو میپنگ، پوسٹ ایفیکٹس کے لیے ضروری)۔ Renderbuffer تیز تر ہے، لیکن اس کا مواد ٹیکسچر کے طور پر استعمال نہیں کیا جا سکتا۔
تمام جدید گرافکس API: OpenGL ES (FBO کے ذریعے)، Apple Metal (MTLRenderPassDescriptor کے ذریعے)، Vulkan (VkFramebuffer کے ذریعے)، Direct3D (Render Target View کے ذریعے)۔ تصوراتی طور پر طریقہ کار ایک ہی ہے — اسکرین کے بجائے ٹیکسچر میں رینڈرنگ۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں