التخزين المؤقت Z

بيانات المخزن المؤقت Z

مخزن العمق (Z-buffer ) ، هو نوع من مخازن البيانات المستخدمة في رسومات الحاسوب لتخزين معلومات العمق للأجزاء. تمثل القيم المخزنة المسافة إلى الكاميرا، حيث يمثل الصفر أقرب نقطة. يمكن عكس نظام الترميز بحيث يكون الرقم الأعلى هو القيمة الأقرب إلى الكاميرا.

في مسار معالجة الرسومات ثلاثية الأبعاد ، عند إسقاط كائن على الشاشة، تتم مقارنة عمق (قيمة z) الجزء المُنشأ في صورة الشاشة المُسقطة بالقيمة المخزنة مسبقًا في المخزن المؤقت ( اختبار العمق )، ويتم استبداله إذا كانت القيمة الجديدة أقرب. يعمل هذا بالتزامن مع مُرَسِّم الصور النقطية ، الذي يحسب قيم الألوان. يتم حفظ الجزء الناتج من مُرَسِّم الصور النقطية إذا لم يتداخل مع جزء آخر.

تقنية التخزين المؤقت Z هي تقنية تُستخدم في جميع أجهزة الكمبيوتر المحمولة والهواتف الذكية الحديثة تقريبًا لإنشاء رسومات ثلاثية الأبعاد . ويُستخدم هذا النوع من التقنية بشكل أساسي في ألعاب الفيديو ، التي تتطلب معالجة سريعة ودقيقة للمشاهد ثلاثية الأبعاد.

الاستخدام

الانسداد

يُعد تحديد ما يجب عرضه على الشاشة وما يجب حذفه عملية متعددة الخطوات تستخدم تقنيات متنوعة . ويُعتبر استخدام مخزن العمق (z-buffer) الخطوة الأخيرة في هذه العملية.

في كل مرة يُعرض فيها كائن في مخزن الإطارات ، يُستخدم مخزن العمق (Z-buffer) لمقارنة قيم العمق (z) للأجزاء مع قيمة العمق الموجودة فيه (أي، التحقق من الأقرب). إذا كانت قيمة العمق الجديدة أقرب من القيمة القديمة، يُكتب الجزء في مخزن الإطارات، وتُكتب هذه القيمة الجديدة الأقرب في مخزن العمق. أما إذا كانت قيمة العمق أبعد من القيمة الموجودة في مخزن العمق، فيُحذف الجزء. تُكرر هذه العملية لجميع الكائنات والأسطح في المشهد (غالبًا بالتوازي ). في النهاية، يسمح مخزن العمق بإعادة إنتاج صحيحة لإدراك العمق المعتاد : فالكائن القريب يُخفي الكائن الأبعد. يُسمى هذا "الاستبعاد من العمق" .

تؤثر دقة مخزن العمق (Z-buffer) بشكل كبير على جودة المشهد: فمخزن العمق التقليدي ذو 16 بت قد يُسبب تشوهات ( تُسمى " تداخل العمق " أو "الدمج ") عندما يكون جسمان متقاربين جدًا. أما مخزن العمق الحديث ذو 24 بت أو 32 بت فيُقدم أداءً أفضل بكثير، مع أن المشكلة لا يُمكن حلها تمامًا دون خوارزميات إضافية. ونادرًا ما يُستخدم مخزن العمق ذو 8 بت نظرًا لانخفاض دقته.

رسم خرائط الظل

تسمح بيانات المخزن المؤقت Z التي يتم الحصول عليها من عرض سطح من وجهة نظر الضوء بإنشاء الظلال بواسطة تقنية رسم خرائط الظلال . [ 1 ]

تاريخ

وُصفت تقنية التخزين المؤقت Z لأول مرة عام 1974 من قِبل فولفغانغ شتراسر في أطروحته للدكتوراه حول الخوارزميات السريعة لعرض الأجسام المحجوبة. [ 2 ] يُعدّ خوارزمية الرسام حلاً مشابهاً لتحديد المضلعات المتداخلة ، وهي قادرة على التعامل مع عناصر المشهد غير الشفافة، ولكن على حساب الكفاءة وظهور نتائج غير دقيقة.

تُستخدم تقنية التخزين المؤقت للعمق (Z-buffers) غالبًا في مكونات الأجهزة داخل بطاقات الرسومات الاستهلاكية . كما تُستخدم هذه التقنية (كبرمجيات بدلاً من مكونات الأجهزة) لإنتاج المؤثرات الخاصة المُولّدة بالحاسوب للأفلام.

التطورات

حتى مع دقة منخفضة بما يكفي، قد تظهر مشاكل في الجودة عندما لا تتوزع دقة قيم المسافة في مخزن العمق (z-buffer) بالتساوي على المسافات. فالقيم الأقرب تكون أكثر دقة (وبالتالي يمكنها عرض الأجسام الأقرب بشكل أفضل) من القيم الأبعد. وهذا أمر مرغوب فيه عمومًا، ولكنه قد يتسبب أحيانًا في ظهور تشوهات كلما ابتعدت الأجسام. ويُطلق على أحد أنواع تخزين العمق (z-buffering) الذي ينتج عنه دقة موزعة بشكل أكثر توازنًا اسم تخزين المسافة ( w-buffering ) (انظر أدناه ).

في بداية مشهد جديد، يجب مسح المخزن المؤقت z إلى قيمة محددة، عادة 1.0، لأن هذه القيمة هي الحد الأعلى (على مقياس من 0 إلى 1) للعمق، مما يعني أنه لا يوجد كائن موجود عند هذه النقطة من خلال مخروط الرؤية .

يُنسب اختراع مفهوم المخزن المؤقت Z في أغلب الأحيان إلى إدوين كاتمول ، على الرغم من أن فولفغانغ شتراسر وصف هذه الفكرة في أطروحته للدكتوراه عام 1974 قبل أشهر من اختراع كاتمول. [ أ ]

في بطاقات الرسومات الحديثة لأجهزة الكمبيوتر الشخصية (1999-2005)، تستخدم إدارة مخزن العمق (z-buffer) جزءًا كبيرًا من عرض نطاق الذاكرة المتاح . وقد تم استخدام طرق مختلفة لتقليل تكلفة أداء تخزين العمق، مثل الضغط بدون فقدان البيانات (حيث أن موارد الكمبيوتر اللازمة للضغط/فك الضغط أرخص من عرض النطاق) ومسح العمق فائق السرعة للأجهزة، مما يجعل حيلة "إطار واحد موجب، إطار واحد سالب" (التي تتخطى مسح ما بين الإطارات تمامًا باستخدام أرقام موقعة للتحقق من العمق بذكاء) غير ضرورية.

قررت بعض الألعاب، ولا سيما العديد من الألعاب في المراحل الأخيرة من عمر جهاز نينتندو 64 ، إما تقليل استخدام التخزين المؤقت للعمق (على سبيل المثال، عرض الخلفية أولاً بدون تخزين مؤقت للعمق واستخدامه فقط لعناصر المقدمة) أو حذفه تمامًا، وذلك لتقليل متطلبات عرض النطاق الترددي للذاكرة ومتطلبات الذاكرة على التوالي. تُعدّ Super Smash Bros. و F-Zero X من ألعاب نينتندو 64 التي قللت من استخدام التخزين المؤقت للعمق لزيادة معدلات الإطارات . كما قللت العديد من ألعاب Factor 5 من استخدام التخزين المؤقت للعمق أو حذفته تمامًا. على جهاز نينتندو 64، يمكن أن يستهلك التخزين المؤقت للعمق ما يصل إلى أربعة أضعاف عرض النطاق الترددي مقارنةً بعدم استخدامه. [ 3 ]

دعمت لعبة Mechwarrior 2 على الكمبيوتر الشخصي دقة تصل إلى 800  ×  600 [ 4 ] على بطاقة 3dfx Voodoo الأصلية بسعة 4 ميجابايت بسبب عدم استخدام التخزين المؤقت z.

إزالة الزو

في مجال الرندر ، تُعرف تقنية "الحذف المبكر" (Z-culling) بأنها إزالة البكسلات في وقت مبكر بناءً على العمق، وهي طريقة تُحسّن الأداء عندما يكون رندر الأسطح المخفية مكلفًا. وهي نتيجة مباشرة لتقنية "التخزين المؤقت للعمق" (Z-buffering)، حيث تتم مقارنة عمق كل بكسل مُحتمل بعمق الشكل الهندسي الموجود الذي قد يكون مخفيًا خلفه.

عند استخدام مخزن العمق (Z-buffer)، يمكن حذف البكسل بمجرد معرفة عمقه، مما يتيح تخطي عملية الإضاءة والتركيب بالكامل للبكسل الذي لن يكون مرئيًا على أي حال. كما أن تظليل البكسلات الذي يستغرق وقتًا طويلاً لن يُنفذ عادةً للبكسلات المحذوفة. هذا يجعل حذف البكسلات من مخزن العمق خيارًا جيدًا لتحسين الأداء في الحالات التي تكون فيها معدلات التعبئة أو الإضاءة أو التركيب أو تظليل البكسلات هي العوامل الرئيسية التي تُعيق الأداء .

بينما يسمح التخزين المؤقت للعمق (Z-buffering) بعدم ترتيب الأشكال الهندسية، فإن ترتيب المضلعات حسب زيادة العمق (باستخدام خوارزمية الرسم العكسي ) يسمح بعرض كل بكسل على الشاشة مرات أقل. قد يُحسّن هذا الأداء في المشاهد ذات معدل التعبئة المحدود والتي تحتوي على كميات كبيرة من التداخل، ولكن إذا لم يُدمج مع التخزين المؤقت للعمق، فإنه يُعاني من مشاكل خطيرة مثل:

  • المضلعات التي تحجب بعضها البعض في دورة (على سبيل المثال، المثلث أ يحجب ب، ب يحجب ج، ج يحجب أ)
  • عدم وجود أي نقطة "أقرب" متعارف عليها على المثلث (أي بغض النظر عما إذا كان المرء يصنف المثلثات حسب مركزها أو أقرب نقطة أو أبعد نقطة، يمكن للمرء دائمًا أن يجد مثلثين A و B بحيث يكون A "أقرب" ولكن في الواقع يجب رسم B أولاً).

لذا، لا يمكن استخدام خوارزمية الرسام العكسي كبديل لتقنية إزالة العناصر غير المرغوب فيها (دون إعادة هندسة معقدة)، إلا كتحسين لها. على سبيل المثال، قد يتمثل التحسين في الحفاظ على ترتيب المضلعات وفقًا لموقعها على المحورين السيني والصادي وعمقها على المحور العيني لتوفير حدود، وذلك بهدف تحديد ما إذا كان هناك احتمال لتداخل بين مضلعين.

الرياضيات

غالبًا ما يتم تحديد نطاق قيم العمق في مساحة الكاميرا المراد عرضها بينقريب{\displaystyle {\textit {قريب}}}وبعيد{\displaystyle {\textit {بعيد}}}قيمةz{\displaystyle z}.

بعد تغيير المنظور ، تصبح القيمة الجديدة لـz{\displaystyle z}، أوz{\displaystyle z'}، ويتم تعريفها من خلال:

z=بعيد+قريببعيد-قريب+1z(-2بعيدقريببعيد-قريب){\displaystyle z'={\frac {{\textit {far}}+{\textit {near}}}{{\textit {far}}-{\textit {near}}}}+{\frac {1}{z}}\left({\frac {-2\cdot {\textit {far}}\cdot {\textit {near}}}{{\textit {far}}-{\textit {near}}}}\right)}

بعد الإسقاط المتعامد ، تصبح القيمة الجديدة لـz{\displaystyle z}، أوz{\displaystyle z'}، ويتم تعريفها من خلال:

z=2z-قريببعيد-قريب-1{\displaystyle z'=2\cdot {\frac {{z}-{\textit {near}}}{{\textit {far}}-{\textit {near}}}}-1}

أينz{\displaystyle z}هي القيمة القديمة لـz{\displaystyle z}في مساحة الكاميرا، ويطلق عليه أحيانًاw{\displaystyle w}أوw{\displaystyle w'}.

القيم الناتجة لـz{\displaystyle z'}يتم توحيد القيم بين -1 و1، حيثقريب{\displaystyle {\textit {قريب}}}الطائرة عند -1 ووأر{\displaystyle {\mathit {far}}}المستوى عند 1. القيم خارج هذا النطاق تتوافق مع النقاط التي ليست في مخروط الرؤية ، ولا ينبغي عرضها.

تمثيل النقطة الثابتة

عادةً، تُخزَّن هذه القيم في مخزن العمق (z-buffer) الخاص بمُسرِّع الرسومات في الأجهزة بتنسيق النقطة الثابتة . في البداية، تُحوَّل إلى نطاق أكثر شيوعًا وهو [0، 1] عن طريق استبدال التحويل المناسب.z2=12(z1+1){\displaystyle z'_{2}={\frac {1}{2}}\left(z'_{1}+1\right)}في الصيغة السابقة:

z=بعيد+قريب2(بعيد-قريب)+12+1z(-بعيدقريببعيد-قريب){\displaystyle z'={\frac {{\textit {far}}+{\textit {near}}}{2\cdot \left({\textit {far}}-{\textit {near}}\right)}}+{\frac {1}{2}}+{\frac {1}{z}}\left({\frac {-{\textit {far}}\cdot {\textit {near}}}{{\textit {far}}-{\textit {near}}}}\right)}

التبسيط:

z=بعيد(بعيد-قريب)+1z(-بعيدقريببعيد-قريب){\displaystyle z'={\frac {\textit {far}}{\left({\textit {far}}-{\textit {near}}\right)}}+{\frac {1}{z}}\left({\frac {-{\textit {far}}\cdot {\textit {near}}}{{\textit {far}}-{\textit {near}}}}\right)}

ثانيًا، يتم ضرب الصيغة المذكورة أعلاه فيS=2د-1{\displaystyle S=2^{d}-1}حيث d هو عمق المخزن المؤقت z (عادة 16 أو 24 أو 32 بت) وتقريب النتيجة إلى عدد صحيح: [ 5 ]

z=و(z)=(2د-1)(بعيد(بعيد-قريب)+1z(-بعيدقريببعيد-قريب)){\displaystyle z'=f(z)=\left\lfloor \left(2^{d}-1\right)\cdot \left({\frac {\textit {far}}{\left({\textit {far}}-{\textit {near}}\right)}}+{\frac {1}{z}}\left({\frac {-{\textit {far}}\cdot {\textit {near}}}{{\textit {far}}-{\textit {near}}}}\right)\right)\right\rfloor }

يمكن عكس هذه الصيغة واستنتاجها لحساب دقة المخزن المؤقت Z (الدقة المذكورة سابقًا). عكس الصيغة أعلاهو(z){\displaystyle f(z)\,}:

z=-بعيدقريبzS(بعيد-قريب)-بعيد=-Sبعيدقريبz(بعيد-قريب)-بعيدS{\displaystyle z={\frac {-{\textit {far}}\cdot {\textit {near}}}{{\frac {z'}{S}}\left({\textit {far}}-{\textit {near}}\right)-{\textit {far}}}}={\frac {-S\cdot {\textit {far}}\cdot {\textit {near}}}{z'\left({\textit {far}}-{\textit {near}}\right)-{\textit {far}}\cdot S}}}

أينS=2د-1{\displaystyle S=2^{d}-1}

تُعرَّف دقة مخزن العمق (Z-buffer) في فضاء الكاميرا بأنها القيمة التزايدية الناتجة عن أصغر تغيير في العدد الصحيح المخزن في مخزن العمق، وهو +1 أو -1. وبالتالي، يمكن حساب هذه الدقة من مشتقةz{\displaystyle z}كدالة لـz{\displaystyle z'}:

دzدz=-1-1Sبعيدقريب(z(بعيد-قريب)-بعيدS)2(بعيد-قريب){\displaystyle {\frac {dz}{dz'}}={\frac {-1\cdot -1\cdot S\cdot {\textit {far}}\cdot {\textit {near}}}{\left(z'\left({\textit {far}}-{\textit {near}}\right)-{\textit {far}}\cdot S\right)^{2}}}\cdot \left({\textit {far}}-{\textit {near}}\right)}

بالتعبير عن ذلك من منظور مساحة الكاميرا، عن طريق الاستبدالz{\displaystyle z'}بناءً على ما سبقو(z){\displaystyle f(z)\,}:

دzدz=-1-1Sبعيدقريب(بعيد-قريب)(S(-بعيدقريبz+بعيد)-بعيدS)2=(بعيد-قريب)z2Sبعيدقريب=z2Sقريب-z2Sبعيدz2Sقريب{\displaystyle {\begin{aligned}{\frac {dz}{dz'}}&={\frac {-1\cdot -1\cdot S\cdot {\textit {far}}\cdot {\textit {near}}\cdot \left({\textit {far}}-{\textit {near}}\right)}{\left(S\cdot \left({\frac {-{\textit {far}}\cdot {\textit {near}}}{z}}+{\textit {far}}\right)-{\textit {far}}\cdot S\right)^{2}}}\\&={\frac {\left({\textit {far}}-{\textit {near}}\right)\cdot z^{2}}{S\cdot {\textit {far}}\cdot {\textit {near}}}}\\&={\frac {z^{2}}{S\cdot {\textit {near}}}}-{\frac {z^{2}}{S\cdot {\textit {far}}}}\approx {\frac {z^{2}}{S\cdot {\textit {near}}}}\end{aligned}}}

وهذا يدل على أن قيمz{\displaystyle z'}تتجمع بكثافة أكبر بالقرب منقريب{\displaystyle {\textit {near}}}الطائرة، وبشكل أقل كثافة كلما ابتعدت، مما ينتج عنه دقة أفضل بالقرب من الكاميرا. الأصغرنهـأر{\displaystyle near}بمعنى آخر، كلما قلت الدقة، كان ذلك أفضل.نهـأر{\displaystyle near}يُعدّ وضع المستوى على مسافة قريبة جدًا سببًا شائعًا لظهور تشوهات غير مرغوب فيها في عرض الأجسام البعيدة. [ 6 ]

لتطبيق مخزن العمق (z-buffer)، يجب أن تكون قيمz{\displaystyle z'}يتم استيفاء هذه القيم بشكل خطي عبر مساحة الشاشة بين رؤوس المضلع الحالي ، ويتم تخزين هذه القيم الوسيطة بشكل عام في المخزن المؤقت z بتنسيق النقطة الثابتة .

مخزن مؤقت W

لتنفيذ مخزن مؤقت w، [ 7 ] القيم القديمة لـz{\displaystyle z}في مساحة الكاميرا، أوw{\displaystyle w}تُخزَّن هذه القيم في المخزن المؤقت، وعادةً ما تكون بصيغة الفاصلة العائمة . مع ذلك، لا يمكن استكمال هذه القيم خطيًا عبر مساحة الشاشة من الرؤوس، بل يجب عادةً عكسها ، ثم استكمالها، ثم عكسها مرة أخرى. القيم الناتجة هيw{\displaystyle w}، على عكسz{\displaystyle z'}، موزعة بالتساوي بينقريب{\displaystyle {\textit {near}}}وبعيد{\displaystyle {\textit {far}}}توجد تطبيقات لـ w-buffer تتجنب الانعكاسات تمامًا.

يعتمد ما إذا كان استخدام المخزن المؤقت z أو المخزن المؤقت w يؤدي إلى صورة أفضل على التطبيق.

الخوارزميات

يوضح الكود الزائف التالي عملية التخزين المؤقت z:

// أولاً وقبل كل شيء، قم بتهيئة عمق كل بكسل. d(i, j) = لانهائي // أقصى طول // قم بتهيئة قيمة اللون لكل بكسل إلى لون الخلفية c(i, j) = لون الخلفية // لكل مضلع، قم بالخطوات التالية: لكل بكسل في إسقاط المضلع {     // إيجاد عمق المضلع، أي z     // عند (x, y) المقابلة للبكسل (i, j)        إذا كان (z < d(i, j))     {         d(i, j) = z;         c(i, j) = اللون؛     } } 

انظر أيضاً

مراجع

  1. أكينين-مولر، توماس؛ هاينز، إريك؛ هوفمان، ناتي (2018-08-06). العرض في الوقت الحقيقي، الطبعة الرابعة . مطبعة سي آر سي. رقم ISBN 978-1-351-81615-1.
  2. ^ ستراسر ، وولفجانج (26 أبريل 1974). "Zukünftige Arbeiten". Schnelle Kurven- und Flächendarstellung auf grafischen Sichtgeräten [ منحنى سريع وعرض سطحي على أجهزة العرض الرسومية ] (PDF) (باللغة الألمانية). برلين. 6-1.{{cite book}}: CS1 maint: موقع الناشر مفقود ( رابط )
  3. كيف قمت بتطبيق تقنية MegaTextures على جهاز نينتندو 64 حقيقي ، تم الاطلاع عليه بتاريخ 2024-01-04
  4. مقارنة تسريع الرسومات ثلاثية الأبعاد، الحلقة 11: ميك واريور 2 - 3DFX / PowerVR / S3 Virge / ATI Rage / Matrox Mys ، تم الاطلاع عليها بتاريخ 4 يناير 2024
  5. منظمة OpenGL. "OpenGL / الأسئلة الشائعة 2 - دقة مخزن العمق" . تم الاطلاع عليه بتاريخ 26-12-2017 .
  6. غريغوري ماسال. "مخزن العمق - التفاصيل الدقيقة" . مؤرشف من الأصل في 15 أكتوبر 2008. تم الاسترجاع في 3 أغسطس 2008 .
  7. ستيف بيكر. "تعلم حب مخزن البيانات Z الخاص بك" . تم الاسترجاع في 2018-01-03 .

ملحوظات

  1. ^ انظر Wolfgang K. Giloi ، JL Encarnação، W. Straßer. “مدرسة جيلوي لرسومات الكمبيوتر”. رسومات الحاسوب 35 4: 12-16.