رسم الظل


إن رسم الظلال أو إسقاط الظلال هي عملية يتم من خلالها إضافة الظلال إلى رسومات الكمبيوتر ثلاثية الأبعاد . وقد قدم لانس ويليامز هذا المفهوم في عام 1978، في ورقة بحثية بعنوان "إلقاء ظلال منحنية على الأسطح المنحنية". [1] ومنذ ذلك الحين، تم استخدامه في المشاهد التي تم تقديمها مسبقًا وفي الوقت الفعلي في العديد من ألعاب الأجهزة المنزلية وأجهزة الكمبيوتر.
يتم إنشاء الظلال عن طريق اختبار ما إذا كانت البكسل مرئية من مصدر الضوء، عن طريق مقارنة البكسل بمخزن z [2] أو صورة عمق لعرض مصدر الضوء، المخزنة في شكل نسيج .
مبدأ الظل وخريطة الظل
إذا نظرت من مصدر ضوء، فستظهر جميع الأشياء التي يمكنك رؤيتها في الضوء. ومع ذلك، فإن أي شيء خلف هذه الأشياء سيكون في الظل. هذا هو المبدأ الأساسي المستخدم لإنشاء خريطة الظل. يتم عرض رؤية الضوء، وتخزين عمق كل سطح يراه (خريطة الظل). بعد ذلك، يتم عرض المشهد العادي بمقارنة عمق كل نقطة مرسومة (كما لو كانت مرئية بواسطة الضوء، وليس العين) بخريطة العمق هذه.
هذه التقنية أقل دقة من أحجام الظلال ، ولكن خريطة الظلال يمكن أن تكون بديلاً أسرع اعتمادًا على مقدار وقت التعبئة المطلوب لأي من التقنيتين في تطبيق معين وبالتالي قد تكون أكثر ملاءمة للتطبيقات في الوقت الفعلي. بالإضافة إلى ذلك، لا تتطلب خرائط الظلال استخدام مخزن مؤقت إضافي ويمكن تعديلها لإنتاج ظلال ذات حافة ناعمة. ومع ذلك، على عكس أحجام الظلال، فإن دقة خريطة الظلال محدودة بدقتها.
نظرة عامة على الخوارزمية
تتضمن عملية عرض مشهد مظلل خطوتين رئيسيتين للرسم. الأولى تنتج خريطة الظلال نفسها، والثانية تطبقها على المشهد. واعتمادًا على التنفيذ (وعدد الأضواء)، قد يتطلب هذا الأمر مرورتين أو أكثر للرسم.
إنشاء خريطة الظل


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

لاختبار نقطة مقابل خريطة العمق، يجب تحويل موضعها في إحداثيات المشهد إلى الموضع المكافئ كما يراه الضوء. ويتم ذلك عن طريق ضرب المصفوفة . يتم تحديد موقع الكائن على الشاشة من خلال تحويل الإحداثيات المعتاد ، ولكن يجب إنشاء مجموعة ثانية من الإحداثيات لتحديد موقع الكائن في مساحة الضوء.
المصفوفة المستخدمة لتحويل إحداثيات العالم إلى إحداثيات عرض الضوء هي نفس المصفوفة المستخدمة لعرض خريطة الظل في الخطوة الأولى (في OpenGL، هذا هو نتاج مصفوفات عرض النموذج والإسقاط). سيؤدي هذا إلى إنتاج مجموعة من الإحداثيات المتجانسة التي تحتاج إلى تقسيم منظور ( انظر الإسقاط ثلاثي الأبعاد ) لتصبح إحداثيات جهاز طبيعية ، حيث يقع كل مكون ( x أو y أو z ) بين -1 و1 (إذا كان مرئيًا من عرض الضوء). تتطلب العديد من التطبيقات (مثل OpenGL و Direct3D ) ضربًا إضافيًا للمقياس ومصفوفة التحيز لتعيين قيم -1 إلى 1 إلى 0 إلى 1، وهي إحداثيات أكثر شيوعًا للبحث عن خريطة العمق (خريطة الملمس). يمكن إجراء هذا التدرج قبل تقسيم المنظور، ويمكن طيه بسهولة في حساب التحويل السابق عن طريق ضرب هذه المصفوفة بما يلي:
إذا تم ذلك باستخدام shader أو أي ملحق آخر للأجهزة الرسومية، يتم تطبيق هذا التحويل عادةً على مستوى الرأس، ويتم استيفاء القيمة الناتجة بين الرؤوس الأخرى وتمريرها إلى مستوى الجزء.
اختبار خريطة العمق

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

يمكن رسم المشهد بالظلال بعدة طرق مختلفة. إذا كانت هناك برامج تظليل قابلة للبرمجة ، فيمكن إجراء اختبار خريطة العمق بواسطة برنامج تظليل مجزأ يرسم الكائن ببساطة في الظل أو مضاءً حسب النتيجة، ويرسم المشهد في تمريرة واحدة (بعد تمريرة أولية سابقة لتوليد خريطة الظل).
إذا لم تكن برامج التظليل متاحة، فيجب عادةً تنفيذ اختبار خريطة العمق بواسطة بعض ملحقات الأجهزة (مثل GL_ARB_shadow)، والتي لا تسمح عادةً بالاختيار بين نموذجين للإضاءة (مضاء ومظلل)، وتتطلب المزيد من عمليات العرض:
- قم بتصوير المشهد بأكمله في الظل. بالنسبة لنماذج الإضاءة الأكثر شيوعًا ( انظر نموذج انعكاس فونج )، يجب أن يتم ذلك من الناحية الفنية باستخدام المكون المحيط للضوء فقط، ولكن يتم تعديل ذلك عادةً ليشمل أيضًا ضوءًا منتشرًا خافتًا لمنع الأسطح المنحنية من الظهور بشكل مسطح في الظل.
- قم بتمكين اختبار خريطة العمق وإظهار المشهد مضاءً. لن يتم استبدال المناطق التي يفشل فيها اختبار خريطة العمق وستظل مظللة.
- يمكن استخدام تمريرة إضافية لكل ضوء إضافي، باستخدام المزج الإضافي لدمج تأثيرها مع الأضواء المرسومة بالفعل. (تتطلب كل من هذه التمريرات تمريرة سابقة إضافية لتوليد خريطة الظل المرتبطة بها.)
استخدمت الصور النموذجية في هذه المقالة ملحق OpenGL GL_ARB_shadow_ambient لإنجاز عملية رسم خريطة الظل في تمريرتين.
تنفيذات خريطة الظل في الوقت الحقيقي
أحد العيوب الرئيسية لرسم خرائط الظلال في الوقت الفعلي هو أن حجم وعمق خريطة الظلال يحددان جودة الظلال النهائية. وعادةً ما يكون هذا مرئيًا على هيئة خلل في التعرجات أو استمرارية الظلال. تتمثل إحدى الطرق البسيطة للتغلب على هذا القيد في زيادة حجم خريطة الظلال، ولكن نظرًا لقيود الذاكرة أو الحوسبة أو الأجهزة، فليس من الممكن دائمًا القيام بذلك. تم تطوير تقنيات شائعة الاستخدام لرسم خرائط الظلال في الوقت الفعلي للالتفاف على هذا القيد. وتشمل هذه خرائط الظل المتتالية، [3] وخرائط الظل شبه المنحرفة، [4] وخرائط الظل من منظور مساحة الضوء، [5] أو خرائط الظل المقسمة بالتوازي. [6]
ومن الجدير بالملاحظة أيضًا أن الظلال المولدة، حتى لو كانت خالية من التعرجات، لها حواف صلبة، وهو أمر غير مرغوب فيه دائمًا. من أجل محاكاة الظلال الناعمة في العالم الحقيقي ، تم تطوير العديد من الحلول، إما عن طريق إجراء العديد من عمليات البحث على خريطة الظل، أو إنشاء هندسة تهدف إلى محاكاة الحافة الناعمة أو إنشاء خرائط ظلال عمق غير قياسية. ومن الأمثلة البارزة على ذلك Percentage Closer Filtering، [7] Smoothies، [8] وخرائط Variance Shadow. [9]
تقنيات رسم الظلال
بسيط
- SSM "بسيط"
تقسيم
- PSSM "التقسيم المتوازي" https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch10.html
- CSM "Cascaded" http://developer.download.nvidia.com/SDK/10.5/opengl/src/cascaded_shadow_maps/doc/cascaded_shadow_maps.pdf
التشويه
- LiSPSM "منظور الفضاء الضوئي" https://www.cg.tuwien.ac.at/research/vr/lispsm/
- TSM "شبه منحرف" http://www.comp.nus.edu.sg/~tants/tsm.html
- PSM "المنظور" http://www-sop.inria.fr/reves/Marc.Stamminger/psm/
- CSSM "مساحة الكاميرا" http://bib.irb.hr/datoteka/570987.12_CSSM.pdf
تنعيم
- "تصفية النسبة المئوية الأقرب" في PCF https://developer.nvidia.com/gpugems/GPUGems/gpugems_ch11.html
تصفية
- ESM "الأسي" https://discovery.ucl.ac.uk/id/eprint/10001/1/10001.pdf
- "الالتفاف" CSM https://doclib.uhasselt.be/dspace/bitstream/1942/8040/1/3227.pdf
- "VSM ""التباين"" http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.104.2569&rep=rep1&type=pdf
- SAVSM "تباين المساحة المجمعة" https://developer.nvidia.com/gpugems/gpugems3/part-ii-light-and-shadows/chapter-8-summed-area-variance-shadow-maps
- SMSR "إعادة توجيه صورة ظلية خريطة الظل" http://bondarev.nl/?p=326
ظلال ناعمة
- PCSS "أقرب نسبة مئوية" http://developer.download.nvidia.com/shaderlibrary/docs/shadow_PCSS.pdf
- "VSSM ""تعيين الظل الناعم للتباين"" https://jankautz.com/publications/VSSM_PG2010.pdf"
- SSSS "ظلال ناعمة لمساحة الشاشة" http://www.crcnetbase.com/doi/abs/10.1201/b10648-36
- FIV "متجه الإشعاع الكامل" http://getlab.org/publications/FIV/
متنوعة
- ASM "التكيفي" http://www.cs.cornell.edu/~kb/publications/ASM.pdf
- AVSM "القياس الحجمي التكيفي" https://web.archive.org/web/20101208213624/http://visual-computing.intel-research.net/art/publications/avsm/
- CSSM "مساحة الكاميرا" http://free-zg.t-com.hr/cssm/
- DASM "التكيف العميق"
- DPSM "المكافئ المزدوج" http://sites.google.com/site/osmanbrian2/dpsm.pdf
- DSM "عميق" http://graphics.pixar.com/library/DeepShadows/paper.pdf
- FSM "إلى الأمام" http://www.cs.unc.edu/~zhangh/technotes/shadow/shadow.ps
- LPSM "اللوغاريتمي" http://gamma.cs.unc.edu/LOGSM/
- MDSM "العمق المتعدد" http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.59.3376&rep=rep1&type=pdf
- RTW "مستقيم الخطوط" http://www.cspaul.com/wiki/doku.php?id=publications:rosen.2012.i3d
- RMSM "الدقة المطابقة" http://www.idav.ucdavis.edu/func/return_pdf?pub_id=919
- "توزيع العينة" SDSM https://web.archive.org/web/20101208212121/http://visual-computing.intel-research.net/art/publications/sdsm/
- SPPSM "منظور المستوى الفاصل" http://image.diku.dk/projects/media/morten.mikkelsen.07.pdf
- "صورة ظلية للمدرسة الثانوية العليا" http://graphics.stanford.edu/papers/silmap/silmap.pdf
متنوع
- خرائط عمق الظل (SDM) [10]
- خرائط الظل المنظورية (PSMs)
- خرائط الظل والمنظور الفضائي والضوء (LSPSMs)
- خرائط الظل المتتالية (CSMs) [11]
- خرائط الظل للتباين (VSMs) [12]
انظر أيضا
- حجم الظل ، تقنية أخرى للتظليل
- إرسال الأشعة ، وهي تقنية أبطأ تُستخدم غالبًا في تتبع الأشعة
- رسم الفوتونات ، وهي تقنية أبطأ بكثير قادرة على إنتاج إضاءة واقعية للغاية
- Radiosity ، وهي تقنية أخرى بطيئة جدًا ولكنها واقعية جدًا
قراءة إضافية
- انتقالات شبه الظل السلسة باستخدام خرائط الظلال بقلم ويليم إتش دي بور
- يؤدي تعيين الظل الأمامي اختبار الظل في مساحة العين بدلاً من مساحة الضوء للحفاظ على وصول أكثر تسلسلاً إلى الملمس.
مراجع
- ^ لانس ويليامز. "إلقاء ظلال منحنية على أسطح منحنية" (PDF) . تم الاسترجاع في 2020-12-22 .
{{cite journal}}: تتطلب المجلة الاستشهاد بها|journal=( مساعدة ) - ^ Akenine-Moller, Tomas; Haines, Eric; Hoffman, Naty (2018-08-06). Real-Time Rendering, Fourth Edition. CRC Press. ISBN 978-1-351-81615-1.
- ^ "خرائط الظل المتتالية" (PDF) . NVidia . تم الاسترجاع في 2008-02-14 .
{{cite journal}}: تتطلب المجلة الاستشهاد بها|journal=( مساعدة ) - ^ توبياس مارتن؛ تيوي سينج تان. "التنعيم والاستمرارية باستخدام خرائط الظل شبه المنحرفة" . تم الاسترجاع في 14 فبراير 2008 .
{{cite journal}}: تتطلب المجلة الاستشهاد بها|journal=( مساعدة ) - ^ مايكل ويمر؛ دانيال شيرزر؛ فيرنر بورجاثوفر. "خرائط الضوء والمساحة والمنظور والظل" . تم الاسترجاع في 14 فبراير 2008 .
{{cite journal}}: تتطلب المجلة الاستشهاد بها|journal=( مساعدة ) - ^ Fan Zhang; Hanqiu Sun; Oskari Nyman. "Parallel-Split Shadow Maps on Programmable GPUs". GPU Gems 3 . مؤرشف من الأصل في 17 يناير 2010 . تم الاسترجاع في 2008-02-14 .
- ^ "Shadow Map Antialiasing". NVidia . تم الاسترجاع في 2008-02-14 .
- ^ إريك تشان، فريدو دوران، ماركو كوربيتا . "تقديم ظلال ناعمة مزيفة باستخدام العصائر" . تم الاسترجاع في 2008-02-14 .
{{cite journal}}: تتطلب المجلة الاستشهاد بها|journal=( مساعدة )صيانة CS1: أسماء متعددة: قائمة المؤلفين ( الرابط ) - ^ ويليام دونيلي؛ أندرو لوريتزن. "خرائط الظل للتباين" . تم الاسترجاع في 14 فبراير 2008 .
- ^ "التقنيات الشائعة لتحسين خرائط عمق الظل". Msdn.microsoft.com . تم الاسترجاع في 7 نوفمبر 2021 .
- ^ "Cascaded Shadow Maps". Msdn.microsoft.com . تم الاسترجاع في 7 نوفمبر 2021 .
- ^ دونيلي، ويليام؛ لوريتزن، أندرو (14 مارس 2006). "خرائط الظل للتباين". وقائع ندوة عام 2006 حول الرسومات والألعاب ثلاثية الأبعاد التفاعلية - SI3D '06 . رابطة آلات الحوسبة. ص. 161-165. doi :10.1145/1111411.1111440. ISBN 159593295X. S2CID 538139 . تم الاسترجاع في 7 نوفمبر 2021 – عبر مكتبة ACM الرقمية.
روابط خارجية
- تعيين الظل للأجهزة، nVidia
- تعيين الظلال باستخدام أجهزة OpenGL الحالية وnVidia
- دليل Riemer خطوة بخطوة لتنفيذ Shadow Mapping باستخدام HLSL وDirectX
- تحسينات لتعيين الظل باستخدام GLSL
- خوارزميات وتقنيات الظل في الوقت الفعلي من NVIDIA
- تنفيذ رسم الظل باستخدام Java وOpenGL
