الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

سؤال عن ال frame buffer

بدأه persone في 5 فبراير 2010 · 4 رد · 2,538 مشاهدة · في OpenGL
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

سؤال مهم جدا

اتمنى الاجابة عليه :

الـ frame buffer

ماذا يخزن؟

واين موقعه؟

لقد قرأت موضوع: كائن الذاكرة Buffer Object درس في الأوبن جي أل

ولكن لم اجد ما اطلبه

:wacko:

#2

بسم الله الرحمن الرحيم

السلام عليكم و رحمة الله و بركاته

ذاكرة الإطار أو frame buffer تعمل على تخزين بيانات الصورة التي ستظهر على الشاشة و هذه الذاكرة هي المكان النهائي الذي ستمكث فيه البيانات قبل ظهورها على الشاشة , و بصيغة أخرى :

بيانات في ذاكرة النظام ram ----> المعالج لمعالجتها ---> ذاكرة الخادم vram أو الرسوميات ---> معالج الرسوميات ---> ذاكرة الإيطار ( المكان الأخير الذي تتمركز فيه البيانات النهائية و القابلة للعرض ) ---> الشاشة ( عن طريق القلب أو الرمش )

بالطبع هذا هو الطريق العام لكي تصل البيانات إلى شاشة غير أنه يتم المرور على بعض المراحل و التي تختلف حسب نوع البيانات ( صور , مجسم محسوب , من الشاشة إلى الشاشة ... إلخ)

أما موقعه بالطبع في ذاكرة بطاقة الرسوميات VRAM

و موضوع كائن الذاكرة هو أيظا جزء لا يتجزء من ذاكرة بطاقة الرسوميات و الإختلاف بين هذا و ذاكرة الإيطار هو أنه كائن الذاكرة وجد ليحل محل ذاكرة النظام RAM ( تفاديا لزمن نقل أو تحويل البيانات )

أتمنى لك التوفيق إن شاء الله

تخيل, هل سيكون مستقبل الأوبن جي أل مع البشرية هكذا

future.jpg
#3

كنت قد كتبت هذا الرد قبل قراءة رد الاخ 3ds max ، ولكن لا مانع من الاضافة

بالنسبة لـ Buffer Object فهي قصة أخرى ، وتقنية جديدة نوعاً ما ، ولا أعرف عنها الكثير .

ولكن سأتكلم عن Framebuffer بمفهومه المعروف في OpenGL وليس عن الأمور الجديدة نوعاً ما مثل Frame Buffer Object .

لاأعرف ان كنت تريد شرح لـ Framebuffer اللي في بالي أو تريد شيء آخر ، بكل الأحوال كنت قد كتبت عن هذا ، وقمت الان بتنقيحه ، لعله يكون هو ما تبحث عنه ، اذا كنت تريد شيء آخر يمكن توضيح الأمر ، قد أملك مقالة عنه هنا أو هناك أيضاً :D .

في OpenGLالكلاسيكية ( النسخ التي لاتدعم المظلّلات Shaders )هناك أنبوب وهمي .. يمر من خلالها الرأس الذي سترسمه vertex .. ثم يتحول هذا الرأس وبقدرة قادر الى بكسل له لون معين .. ثم يظهر على الشاشة أمامك .

كيف حدث هذا ، لنأخذ هذا المثال البسيط :

Float x = 10 , y =10;
glColor3f( 1, 0 , 0);
glBegin(GL_POINTS);
glVertex2f( x , y );
glEnd();

· هذا مثال بسيط جداً من المفترض ان يقوم برسم نقطة بلون أحمر على النافذة ، من هنا ستبدأ رحله هذا الرأس ( حتى الان ليس بيكسل بل هو رأس ، فلو كان الشكل المرسوم مثلاً فانه سيحوي على ثلاثة رؤوس .. ثم سيتم ملء المثلث بلون معين ليتحول الشكل الى مجموعة ضخمة من البكسلات التي تشكل المثلث ).

· يبدأ هذا الرأس vertex بالمرور على مجموعة من المصفوفات التي تتحكم بموقع الرأس ،ومجموعة من العمليات الأخرى التي هدفها النهائي أن تحدد موقع هذا الرأس Vertex ، وهل هو سيظهر على منطقة الرؤية في الشاشة أم لا ، أهم العمليات ( وليس كلها ) :

o المرور على مصفوفة Model-View : هذه المصفوفة تتكون من مصفوفتين مدمجتين وهما Model التي نستخدمها لنزيح أو ندوّر أو نحجّم هذا الرأس ، و View التي نستخدمها للتحكم في الكاميرا المستخدمة .

o المرور على المصفوفة Projection Matrix : التي تحدد طريقة الاسقاط المستخدمة ، هل هو اسقاط منظوري ،للتطبيقات الثلاثية البعد أم اسقاط عمودي للتطبيقات الثنائية البعد أم غير ذلك ..

o القيام بعملية قص أو قطع لأي راس يكون خارج منطقة الرسم – منفذ الرؤية –

o عملية mapping أو تحويل من احداثيات العالم الافتراضي الذييدور في فلكه هذا الرأس Vertex الى الاحداثيات الواقعية ، هنا تظهر أهمية تحديد View port بشكل مناسب .

o في خلال هذه المراحل ، يتم تجميع هذه الرؤوس لتشكل الأشكال النهائية ( مثلث – نقطة – مربع ..الخ ) .

· العمليات السابقة تختص بمعالجة كل رأس لوحده ، أي أنك أمام مسار يهتم بمعالجة الرؤوس .

· في النهاية وبعد عمليات هنا وهناك ، نأتي لمرحلة تحويل البيانات الى صورة تظهر على النافذة ، وهنا يأتي دور كل Buffer ، حيث هناك أربعة أنواع من Buffers وهي

Color Buffer : عبارة عن مصفوفة ( تخيل أنها مستطيلة الشكل أي مصفوفة ثنائية البعد) ، تحتوي على مجموعة من العناصر ، كل عنصر عبارة عن بكسل معين، مثلاً .. العنصر رقم ( 10 – 10 ) سيكون ذو لو أحمر

StencilBuffer : يستخدم لحجب مناطق معينة من أن يتم رسمها وتمرر مناطق أخرى ( تستخدم في تأثيرات معينة مثل الانعكاس ) .

Depth Buffer : وهو مثل Color Buffer ولكن كل عنصر يحوي على قيمة واحدة تمثل عمق هذاالعنصر ، هل سيظهر على النافذة أم لا؟ نستخدم هذا السطح في التطبيقات الثلاثيةالبعد .

Accumulationbuffer : غير مهم .. ويستخدم في تأثيرات معينة مثل Blur .

· الان كل تلك الأسطح Buffers تصب في مصب نهائي اسمه Framebuffer ، الذي يقرأ قيمة كل عنصر من كل Buffer ويقوم بعمليات معينة تحدد لون و امكانية ظهور هذا العنصر من عدمه .

o مثال :نقرأ العنصر الجديد القادم وموقعه ( 10 – 10 ) من ColorBuffe ونجد أنه ذو لون أحمر ، ثم نقرأ قيمة
العمق
من Depth Buffer لهذا العنصر فنجد مثلاً أنها 1 ( مثلاً ) .

o نقارن عمق هذا العنصر الجديد بالعنصر الحالي في FrameBuffer ، ولنفرض أنه لون أخضر وقيمةالعمق صفر مثلاً ..

o بناءً على المقارنة السابقة سيقرر OpenGL أن يرسم العنصر الجديد مكان العنصر القديم ( أو تم عملية مزج اذا كنت تريد ذلك ) .

السيناريو السابق مجرد مثال عام لتوضيح الفكرة . حيث لايمكن فهم Framebuffer لوحده ولا فائدة من ذلك قبل أن تعرف العمليات السابقة التي أنتجت هذا Framebuffer .

تم تعديل هذه المشاركة بواسطة الشمري في 5 فبراير 2010 في 20:23

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#4

جزاكم الله كل خير كفيتو ووفيتو

#5

كما قال الاخ 3ds max .. هو المكان في ذاكرة كرت الشاشة اللذي نضع فيه الصورة اللتي نريد عرضها على الشاشة

كان عندي موضوع كتبته قبل عدة سنوات يحاول شرح بعض من الافكار المتعلقة بالموضوع، ارجو ان يكون مفيدا /index.php?showtopic=83756

مواضيع مشابهة