التعرض المحلي الديناميكي

مرحبا يا هبر! أقدم لكم ترجمة مقال "التعرض المحلي الديناميكي" للمخرج جون تشابمان.

الصورة

في هذه المقالة ، سوف أقدم بعض الأفكار حول التعرض المحلي الديناميكي في عرض HDR. يحتوي Bart Wronsky بالفعل على مقال ممتاز حول هذا الموضوع وأوصي بشدة بقراءته على الفور إذا لم تكن بالفعل ؛ الأفكار هنا ، إلى حد كبير ، تستند إلى مقالته. في النهاية ، قمت بتضمين بعض الروابط الرائعة الأخرى.

منخفضة / عالية المدى الديناميكي


في الأيام الخوالي (التسعينيات) ، تم عرض الألعاب مباشرةً بتنسيق LDR (النطاق الديناميكي الضيق) المعروض (مساحة جاما ، 8 بت). كانت بسيطة ورخيصة ، ولكن ، من ناحية أخرى ، تتداخل بشكل كبير مع إنشاء صورة واقعية حقيقية.

حاليًا ، خاصةً مع ظهور PBR (العرض القائم فعليًا) ، يتم تقديم الألعاب بنطاق ديناميكي ضخم في الفضاء الخطي بدقة أعلى. مع هذه الحركة ، تكمن المشكلة الحقيقية في الواقعية: كيف يمكننا عرض صورة HDR في LDR ؟

التعرض العالمي للسيارات


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

بعد ذلك يتم تحويل متوسط ​​السطوع إلى قيمة التعريض ، على سبيل المثال ، عن طريق حساب المعاملة التبادلية للسطوع الأقصى المسموح به للمشهد:

float Lavg = exp(textureLod(txLuminance, uv, 99.0).x); float ev100 = log2(Lavg * 100.0 / 12.5); ev100 -= uExposureCompensation; // optional manual bias float exposure = 1.0 / (1.2 * exp2(ev100)); 

تم الحصول عليها من معيار ISO لحساب السرعة بناءً على التشبع ؛ للحصول على شرح كامل ، انظر (3)

نظرًا لأن متوسط ​​السطوع المحتمل غير مستقر في ظل الظروف الديناميكية ، فإنه يتم تنعيمه عادة بمرور الوقت باستخدام وظيفة التباطؤ الأسي (2) :

 Lavg = Lavg + (Lnew - Lavg) * (1.0 - exp(uDeltaTime * -uRate)); 

تعليق المترجم
يجب أن يتم تطبيق هذه الوظيفة في سطوع نسيج اختزال التظليل وفقط أثناء حساب مستوى mip الأخير (1 × 1). علاوة على ذلك ، سيتم كتابته حول هذا الموضوع ، لكن في رأيي من السهل التغاضي عنه.

نظرًا لطبيعتها العالمية ، تعاني هذه الطريقة من التظليل الشديد أو النقاط البارزة لمناطق الصورة التي يوجد بها انحراف عن متوسط ​​السطوع:

الصورة

على الرغم من أن هذا يتوافق مع قدرة العين على التكيف مع التغيرات في مستويات الضوء ، إلا أن التأثير الكلي بعيد تمامًا عما نراه في العالم الواقعي.

AE المحلية


إذا أنشأنا سطوعًا متوسطًا باستخدام الاختزال ، فيمكننا الوصول إلى مستويات mip أقل من المخزن المؤقت للإضاءة (4) للحصول على متوسط ​​سطوع محلي.

 float Lavg = exp(textureLod(txLuminance, uv, uLuminanceLod).x; 

يرجى ملاحظة أنه لكي ينجح ذلك ، يجب تطبيق التباطؤ في الخطوة الأخيرة فقط (عند تسجيل مستوى 1x1 mip) ، وإلا ستكون هناك قطع أثرية.

من الناحية النظرية ، هذه فكرة رائعة: يمكن أن يكون لكل مساحة في الصورة عرض جيد ، بينما تتناقض مع المناطق المجاورة. ومع ذلك ، في الممارسة العملية ، يتم الحصول على نتيجة مثيرة للاشمئزاز:

الصورة

الأكثر غير سارة هي كتل "الهالات" الموجودة في المناطق ذات التباين العالي:

الصورة

ومع ذلك ، يمكن تلطيفها إما عن طريق التصفية المسبقة لمخزن الإضاءة النصفي ، أو ببساطة باستخدام أخذ العينات ثنائية التكافؤ:

الصورة

لا يزال يبدو مثير للاشمئزاز ، ولكن بالفعل أفضل.

أخذ عينات مستويات مختلفة من mipmap في النصوع يغير نصف قطر الهالة. هذه المعلمة مفيدة للتحكم في "المظهر" الكلي للنتيجة ، وكذلك لتقليل تأثير الهالة ، على الرغم من الانخفاض العام في التباين (يصبح مرشح حد) أو فقدان موضع التحكم في التعرض:

الصورة

ومع ذلك ، فإن تجانس الظلال لا يكفي. النتيجة ليست طبيعية على الإطلاق. يشبه أسلوب "HDR photo" المتطرف ، على عكس ما يراه الشخص. ومع ذلك ، بخلط القيم العالمية والمحلية ، يمكننا الحصول على أفضل ما في العالمين:

 float Llocal = exp(textureLod(txLuminance, uv, uLuminanceLod).x; float Lglobal = exp(textureLod(txLuminance, uv, 99.0).x; float L = mix(Lglobal, Llocal, uLocalExposureRatio); // .. use L to compute the final exposure scale as before 

الصورة

عن طريق تغيير عامل الخلط ، يمكنك ضبط التعرض المحلي بحيث يؤدي إلى تقليل الآثار إلى الحد الأدنى وزيادة الواقعية المتصورة إلى الحد الأقصى:

الصورة

نسبة خلط السيارات


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

في الصورة أدناه لدينا مجموعة ديناميكية واسعة. معظمها قيم سطوع متوسطة منخفضة وعدة مناطق ذات كثافة عالية (السماء في النوافذ):

الصورة

بدون التعرض المحلي ، يتم فقد لون السماء. في هذه الحالة ، أود نسبة خلط كبيرة:

الصورة

الآن ، فكر في الصورة أدناه ، والتي لها نطاق ديناميكي صغير بشكل رئيسي ذات قيمة سطوع عالية:

الصورة

في هذه الحالة ، يقلل تطبيق التعرض المحلي من سطوع المناطق "الزاهية" بدرجة كبيرة:

الصورة

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

 float Llocal = exp(textureLod(txLuminance, uv, uLuminanceLod).x; float Lglobal = exp(textureLod(txLuminance, uv, 99.0).x; // average in x float Lmax = exp(textureLod(txLuminance, uv, 99.0).y; // max in y float Lratio = min(saturate(abs(Lmax - Lglobal) / Lmax), uLocalExposureMax); float L = mix(Lglobal, Llocal, Lratio); // .. use L to compute the final exposure scale as before 

يرجى ملاحظة أن uLocalExposureMax ظهر على مدخلاتنا للتحكم في أقصى درجة مطلقة من تأثير التعرض المحلي. حصلت على نتيجة جيدة uLocalExposureMax <0.3 .

الرمز النهائي
 float Llocal = exp(textureLod(txLuminance, uv, uLuminanceLod).x; float Lglobal = exp(textureLod(txLuminance, uv, 99.0).x; // average in x float Lmax = exp(textureLod(txLuminance, uv, 99.0).y; // max in y float Lratio = min(saturate(abs(Lmax - Lglobal) / Lmax), uLocalExposureMax); float L = mix(Lglobal, Llocal, Lratio); float ev100 = log2(L * 100.0 / 12.5); ev100 -= uExposureCompensation; // optional manual bias float exposure = 1.0 / (1.2 * exp2(ev100)); vec3 result = hdrColor * exposure; result += bloom; //etc outColor.rgb = result; 


الخاتمة


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

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

المراجع


  1. Tonemapping المترجمة (بارت Wronski)
  2. تطبيق كاميرا بدنية (Padraic Hennessy)
  3. نقل Frostbite إلى PBR (Sébastien Lagarde ، وآخرون)
  4. نظرة فاحصة على Tonemapping (مات بيتينو)
  5. أهمية الوجود الخطي (لاري غريتز وآخرون)
  6. التقنيات المتقدمة وتحسين خطوط أنابيب HDR / VDR بالألوان (تيموثي لوتيس)

صور HDR مأخوذة من أرشيف sIBL .

Source: https://habr.com/ru/post/ar440018/


All Articles