التحدي: تتبع الأشعة غير المقيد – اكتشف
مرآة، مرآة على … مرآة أخرى. في هذا التحدي، ندعوك لاستكشاف العرض غير المقيد في Metal 3 وعكس الأشعة على الأسطح ذات المرايا.
بفضل التحسينات غير المحدودة في Metal 3، يبدو نموذج تطبيق HybridRendering أفضل من أي وقت مضى. إنه يجعل جميع موارد المشهد متاحة للتظليل الخاص به باستخدام Argument Buffers، ثم يستخدم تتبع الأشعة المعدنية لإنتاج انعكاسات على الأسطح المعدنية – مثل تلك الموجودة أدناه.
ولكن على الرغم من أن التطبيق رسم هذا المشهد بشكل جميل، إلا أنه لا يزال هناك قيود: فهو غير قادر على إظهار الانعكاسات داخل الانعكاسات، مثل الأرضية ذات المرايا التي تعكس الكرة ذات المرايا.
وللإنصاف: من الصعب أن تظهر المرايا التي تعكس المرايا! يرتد الضوء بشكل لا نهائي بين السطحين، مما يخلق موقفًا لا يمكن حله حسابيًا. تعمل تطبيقات تتبع الشعاع على حل هذه المشكلة عن طريق إضافة عدد محدود من “ارتدادات” الضوء (أو الشعاع) في المشهد لتوفير المزيد من الواقعية.
في هذا التحدي، ندعوك إلى توسيع كود تتبع الشعاع وزيادة واقعية صورتك عن طريق إضافة واحد (أو أكثر) من ارتدادات الشعاع الإضافية.
ابدأ التحدي
قبل الدخول إلى قاعة المرايا هذه، ننصحك أولاً بمشاهدة فيلم “Go bindless with Metal 3”. بعد المشاهدة، قم بتنزيل نموذج التعليمات البرمجية “عرض الانعكاسات في الوقت الفعلي باستخدام تتبع الشعاع” – وسنستخدمه في هذا التحدي.
انطلق بلا قيود مع Metal 3
تعرف على كيفية إطلاق العنان لتقنيات العرض القوية مثل تتبع الشعاع عندما تصبح بلا قيود مع Metal 3. سنوضح لك كيفية جعل رحلة تطبيقك غير المقيدة ممتعة من خلال تبسيط المخازن المؤقتة للوسيطات، وتخصيص هياكل التسريع من الأكوام، والاستفادة من التحسينات على ال…
شاهد الآن
عرض الانعكاسات في الوقت الفعلي باستخدام تتبع الشعاع
يحتوي التطبيق على ممر حسابي مخصص يحسب الانعكاسات من G-Buffer الرفيع الذي يحتوي على المواضع والأوضاع الطبيعية لكل بكسل في الصورة.
يقرأ تظليل تتبع الشعاع هذه البيانات ويستخدمها مع اتجاه عرض الكاميرا لحساب اتجاه الأشعة المنعكسة. ثم يستخدم المعدن لتتبع هذه الأشعة، والعثور على التقاطعات، وانعكاسات الظل.
raytracing::ray r;
r.origin = positions.read(tid).xyz;
r.direction = normalize(directions.read(tid).xyz);
r.min_distance = 0.1;
r.max_distance = FLT_MAX;
raytracing::intersector<raytracing::instancing, raytracing::triangle_data> inter;
inter.assume_geometry_type( raytracing::geometry_type::triangle );
auto intersection = inter.intersect( r, accelerationStructure, 0xFF );
if ( intersection.type == raytracing::intersection_type::triangle )
{
}
وينتج عن ذلك الصورة التالية:
ولكن هناك مشكلة! سيارات الإطفاء مفقودة من انعكاس الكرة على الأرض. نتحداك في الكشف عن الشاحنات المفقودة عن طريق تعديل تظليل تتبع الأشعة، rtReflection
، لإضافة خطوة إضافية لتتبع الشعاع.
لإكمال هذا التحدي، عليك:
- استخدم الموضع العمودي المنعكس وموضع التقاطع لحساب الارتداد التالي للأشعة.
- قم باستخراج منطق تظليل المادة إلى وظيفة مساعدة تسمح لك بتظليل الانعكاسات داخل الانعكاسات.
- اجمع كل الألوان المنعكسة واكتبها في
outImage
.
عند الانتهاء، استخدم أداة لقطة الشاشة، أو GPU Debugger، أو QuickTime لالتقاط الحل الخاص بك وإظهار عملك لنا من خلال نشره على Twitter باستخدام علامة التصنيف #WWDC22Challenges. وإذا كنت ترغب في مناقشة تتبع الأشعة غير المحدود ومواضيع الرسومات والألعاب الأخرى، انضم إلى الفريق في الأحداث طوال الفترة المتبقية من الأسبوع في WWDC22.
استكشف #WWDC22Challenges على وسائل التواصل الاجتماعي
اقرأ شروط وأحكام تحديات WWDC22