حقوق الطبع والنشر (ج) لعام 2023 مملوكة لشركة Advanced Micro Devices, Inc. جميع الحقوق محفوظة.
يُمنح الإذن مجانًا لأي شخص يحصل على نسخة من هذا البرنامج وملفات الوثائق المرتبطة به ("البرنامج")، للتعامل في البرنامج دون قيود، بما في ذلك، على سبيل المثال لا الحصر، حقوق الاستخدام والنسخ والتعديل والدمج. ونشر و/أو توزيع وترخيص من الباطن و/أو بيع نسخ من البرنامج، والسماح للأشخاص الذين تم توفير البرنامج لهم بالقيام بذلك، وفقًا للشروط التالية: يجب تضمين إشعار حقوق الطبع والنشر أعلاه وإشعار الإذن هذا في جميع النسخ أو أجزاء كبيرة من البرنامج.
يتم توفير البرنامج "كما هو"، دون أي ضمان من أي نوع، صريحًا أو ضمنيًا، بما في ذلك، على سبيل المثال لا الحصر، ضمانات القابلية للتسويق والملاءمة لغرض معين وعدم الانتهاك. لا يتحمل المؤلفون أو أصحاب حقوق الطبع والنشر بأي حال من الأحوال المسؤولية عن أي مطالبة أو أضرار أو مسؤولية أخرى، سواء في إجراء العقد أو الضرر أو غير ذلك، الناشئة عن أو خارج أو فيما يتعلق بالبرنامج أو الاستخدام أو المعاملات الأخرى في برمجة.
يستخدم FSR2 ردود الفعل المؤقتة لإعادة بناء الصور عالية الدقة مع الحفاظ على جودة الصورة وتحسينها مقارنة بالعرض الأصلي.
يمكن لـ FSR2 تمكين "الأداء العملي" لعمليات العرض المكلفة، مثل تتبع شعاع الأجهزة.
HLSL
CS_6_2
CS_6_6*
* - يتم استخدام CS_6_6 في بعض الأجهزة التي تدعم واجهات موجية بعرض 64.
لاستخدام FSR2 يجب عليك اتباع الخطوات التالية:
انقر نقرًا مزدوجًا فوق GenerateSolutions.bat
في دليل build
.
افتح الحل المطابق لواجهة برمجة التطبيقات (API) الخاصة بك، وقم ببناء الحل.
انسخ مكتبة API من bin/ffx_fsr2_api
إلى المجلد الذي يحتوي على مجلد في مشروعك والذي يحتوي على مكتبات الطرف الثالث.
انسخ المكتبة المطابقة للواجهة الخلفية FSR2 التي تريد استخدامها، على سبيل المثال: bin/ffx_fsr2_api/ffx_fsr2_api_dx12_x64.lib
لـ DirectX12.
انسخ ملفات رأس API الأساسية التالية من src/ffx-fsr2-api إلى مشروعك: ffx_fsr2.h
و ffx_types.h
و ffx_error.h
و ffx_fsr2_interface.h
و ffx_util.h
و shaders/ffx_fsr2_common.h
و shaders/ffx_fsr2_resources.h
. يجب توخي الحذر للحفاظ على بنية الدليل النسبي عند وجهة نسخ الملف.
انسخ ملفات الرأس للواجهة الخلفية لواجهة برمجة التطبيقات (API) التي تختارها، على سبيل المثال، بالنسبة لـ DirectX12، يمكنك نسخ dx12/ffx_fsr2_dx12.h
و dx12/shaders/ffx_fsr2_shaders_dx12.h
. يجب توخي الحذر للحفاظ على بنية الدليل النسبي عند وجهة نسخ الملف.
قم بتضمين ملف الرأس ffx_fsr2.h
في قاعدة التعليمات البرمجية الخاصة بك حيث تريد التفاعل مع FSR2.
قم بإنشاء واجهة خلفية لواجهة برمجة التطبيقات المستهدفة الخاصة بك. على سبيل المثال، بالنسبة لـ DirectX12، يجب عليك الاتصال بـ ffxFsr2GetInterfaceDX12
. يجب تخصيص مخزن مؤقت مؤقت بالحجم الذي تم إرجاعه عن طريق استدعاء ffxFsr2GetScratchMemorySizeDX12
وتمرير المؤشر إلى ذلك المخزن المؤقت إلى ffxFsr2GetInterfaceDX12
.
قم بإنشاء سياق FSR2 عن طريق استدعاء ffxFsr2ContextCreate
. يجب ملء بنية المعلمات بما يتوافق مع تكوين التطبيق الخاص بك. راجع الوثائق المرجعية لواجهة برمجة التطبيقات لمزيد من التفاصيل.
يجب عليك استدعاء كل إطار ffxFsr2ContextDispatch
لبدء أحمال عمل FSR2. يجب ملء بنية المعلمات بما يتوافق مع تكوين التطبيق الخاص بك. راجع الوثائق المرجعية لواجهة برمجة التطبيقات لمزيد من التفاصيل، وتأكد من توفير حقل frameTimeDelta
بالمللي ثانية.
عندما ينتهي تطبيقك (أو ترغب في تدمير السياق لسبب آخر)، يجب عليك الاتصال ffxFsr2ContextDestroy
. يجب أن تكون وحدة معالجة الرسومات في وضع الخمول قبل استدعاء هذه الوظيفة.
ينبغي تطبيق ارتعاش وحدات البكسل الفرعية على مصفوفة عرض التطبيق الخاص بك. يجب أن يتم ذلك عند تنفيذ العرض الرئيسي لتطبيقك. يجب عليك استخدام الدالة ffxFsr2GetJitterOffset
لحساب إزاحات الارتعاش الدقيقة. راجع قسم اهتزاز الكاميرا لمزيد من التفاصيل.
للحصول على أفضل جودة للترقية، يُنصح بشدة بملء القناع التفاعلي وقناع الشفافية والتركيب وفقًا لإرشاداتنا. يمكنك أيضًا استخدام ffxFsr2ContextGenerateReactiveMask
كنقطة بداية.
يجب أن تعرض التطبيقات أوضاع القياس، في واجهة المستخدم الخاصة بها بالترتيب التالي: الجودة، والتوازن، والأداء، و(اختياريًا) الأداء الفائق.
يجب أن تعرض التطبيقات أيضًا شريط تمرير لزيادة الوضوح للسماح للمستخدمين النهائيين بتحقيق جودة إضافية.
من أجل راحة المستخدمين النهائيين، توفر FSR2 API عددًا من نسب القياس المحددة مسبقًا والتي تم تسميتها.
جودة | عامل التحجيم لكل البعد |
---|---|
جودة | 1.5x |
متوازن | 1.7x |
أداء | 2.0x |
أداء فائق | 3.0x |
نوصي بشدة أن تعتمد التطبيقات نسبًا متسقة للتسمية والقياس في واجهة المستخدم الخاصة بها. وذلك للتأكد من أن تجربة المستخدم متسقة مع مستخدمي تطبيقك الذين قد يكون لديهم خبرة في التطبيقات الأخرى التي تستخدم FSR2.
اعتمادًا على الأجهزة المستهدفة وتكوين التشغيل، سيعمل FSR2 بمستويات أداء مختلفة.
يلخص الجدول أدناه الأداء المُقاس لـ FSR2 على مجموعة متنوعة من الأجهزة في DX12.
القرار المستهدف | جودة | آر إكس 7900 إكس تي إكس | آر إكس 6950 إكس تي | آر إكس 6900 إكس تي | آر إكس 6800 إكس تي | آر إكس 6800 | آر إكس 6700 إكس تي | آر إكس 6650 إكس تي | آر إكس 5700 إكس تي | آر إكس فيجا 56 | آر إكس 590 |
---|---|---|---|---|---|---|---|---|---|---|---|
3840x2160 | الجودة (1.5x) | 0.7 مللي ثانية | 1.1 مللي ثانية | 1.2 مللي ثانية | 1.2 مللي ثانية | 1.4 مللي ثانية | 2.0 مللي ثانية | 2.8 مللي ثانية | 2.4 مللي ثانية | 4.9 مللي ثانية | 5.4 مللي ثانية |
متوازن (1.7x) | 0.6 مللي ثانية | 1.0 مللي ثانية | 1.0 مللي ثانية | 1.1 مللي ثانية | 1.4 مللي ثانية | 1.8 مللي ثانية | 2.6 مللي ثانية | 2.2 مللي ثانية | 4.1 مللي ثانية | 4.9 مللي ثانية | |
الأداء (2x) | 0.6 مللي ثانية | 0.9 مللي ثانية | 1.0 مللي ثانية | 1.0 مللي ثانية | 1.3 مللي ثانية | 1.7 مللي ثانية | 2.3 مللي ثانية | 2.0 مللي ثانية | 3.6 مللي ثانية | 4.4 مللي ثانية | |
الأداء الفائق. (3x) | 0.5 مللي ثانية | 0.8 مللي ثانية | 0.8 مللي ثانية | 0.9 مللي ثانية | 1.1 مللي ثانية | 1.5 مللي ثانية | 1.8 مللي ثانية | 1.7 مللي ثانية | 2.9 مللي ثانية | 3.7 مللي ثانية | |
2560x1440 | الجودة (1.5x) | 0.3 مللي ثانية | 0.5 مللي ثانية | 0.5 مللي ثانية | 0.5 مللي ثانية | 0.7 مللي ثانية | 0.9 مللي ثانية | 1.2 مللي ثانية | 1.1 مللي ثانية | 1.9 مللي ثانية | 2.3 مللي ثانية |
متوازن (1.7x) | 0.3 مللي ثانية | 0.5 مللي ثانية | 0.5 مللي ثانية | 0.5 مللي ثانية | 0.6 مللي ثانية | 0.8 مللي ثانية | 1.1 مللي ثانية | 1.0 مللي ثانية | 1.7 مللي ثانية | 2.1 مللي ثانية | |
الأداء (2x) | 0.3 مللي ثانية | 0.4 مللي ثانية | 0.4 مللي ثانية | 0.4 مللي ثانية | 0.6 مللي ثانية | 0.8 مللي ثانية | 0.9 مللي ثانية | 0.9 مللي ثانية | 1.5 مللي ثانية | 1.9 مللي ثانية | |
الأداء الفائق. (3x) | 0.2 مللي ثانية | 0.4 مللي ثانية | 0.4 مللي ثانية | 0.4 مللي ثانية | 0.5 مللي ثانية | 0.7 مللي ثانية | 0.8 مللي ثانية | 0.8 مللي ثانية | 1.2 مللي ثانية | 1.7 مللي ثانية | |
1920x1080 | الجودة (1.5x) | 0.2 مللي ثانية | 0.3 مللي ثانية | 0.3 مللي ثانية | 0.3 مللي ثانية | 0.4 مللي ثانية | 0.5 مللي ثانية | 0.6 مللي ثانية | 0.6 مللي ثانية | 1.0 مللي ثانية | 1.3 مللي ثانية |
متوازن (1.7x) | 0.2 مللي ثانية | 0.3 مللي ثانية | 0.3 مللي ثانية | 0.3 مللي ثانية | 0.4 مللي ثانية | 0.5 مللي ثانية | 0.6 مللي ثانية | 0.6 مللي ثانية | 0.9 مللي ثانية | 1.2 مللي ثانية | |
الأداء (2x) | 0.2 مللي ثانية | 0.2 مللي ثانية | 0.2 مللي ثانية | 0.3 مللي ثانية | 0.3 مللي ثانية | 0.5 مللي ثانية | 0.5 مللي ثانية | 0.5 مللي ثانية | 0.8 مللي ثانية | 1.1 مللي ثانية | |
الأداء الفائق. (3x) | 0.1 مللي ثانية | 0.2 مللي ثانية | 0.2 مللي ثانية | 0.2 مللي ثانية | 0.3 مللي ثانية | 0.4 مللي ثانية | 0.4 مللي ثانية | 0.4 مللي ثانية | 0.7 مللي ثانية | 0.9 مللي ثانية |
تم تقريب الأرقام إلى أقرب 0.1 مللي ثانية وهي بدون sharpness
إضافية وتخضع للتغيير.
يتطلب استخدام FSR2 تخصيص بعض الذاكرة المحلية الإضافية لوحدة معالجة الرسومات للاستهلاك بواسطة وحدة معالجة الرسومات. عند استخدام FSR2 API، يتم تخصيص هذه الذاكرة عند إنشاء سياق FSR2، ويتم ذلك عبر سلسلة من عمليات الاسترجاعات التي تشكل الواجهة الخلفية. تُستخدم هذه الذاكرة لتخزين الأسطح الوسيطة التي يتم حسابها بواسطة خوارزمية FSR2 بالإضافة إلى الأسطح الثابتة عبر العديد من إطارات التطبيق. يتضمن الجدول أدناه مقدار الذاكرة التي يستخدمها FSR2 في ظل ظروف التشغيل المختلفة. يشير عمود "مجموعة العمل" إلى إجمالي مقدار الذاكرة التي يستخدمها FSR2 أثناء تنفيذ الخوارزمية على وحدة معالجة الرسومات؛ هذا هو مقدار الذاكرة التي سيتطلبها FSR2 للتشغيل. يشير عمود "الذاكرة الدائمة" إلى المقدار المطلوب من عمود "مجموعة العمل" الذي يجب تركه سليمًا للإطارات اللاحقة للتطبيق؛ تقوم هذه الذاكرة بتخزين البيانات الزمنية التي يستهلكها FSR2. يشير عمود "الذاكرة المستعارة" إلى مقدار عمود "مجموعة العمل" الذي قد يكون مستعارًا بواسطة الأسطح أو الموارد الأخرى التي يستخدمها التطبيق خارج حدود تشغيل FSR2.
يمكنك التحكم في إنشاء المورد في FSR2 عن طريق تجاوز أجزاء إنشاء المورد وتدميره في الواجهة الخلفية لـ FSR2، وإعادة توجيه إشارات الأسماء المستعارة. وهذا يعني أنه لتحقيق التكامل المثالي لـ FSR2، يلزم وجود ذاكرة إضافية تساوي عمود "الذاكرة الدائمة" في الجدول أدناه وفقًا لظروف التشغيل الخاصة بك.
دقة | جودة | مجموعة العمل (ميجابايت) | الذاكرة الدائمة (ميجابايت) | الذاكرة المستعارة (ميجابايت) |
---|---|---|---|---|
3840x2160 | الجودة (1.5x) | 448 ميجابايت | 354 ميجابايت | 93 ميجابايت |
متوازن (1.7x) | 407 ميجابايت | 330 ميجابايت | 77 ميجابايت | |
الأداء (2x) | 376 ميجابايت | 312 ميجابايت | 63 ميجابايت | |
أداء فائق (3x) | 323 ميجابايت | 281 ميجابايت | 42 ميجابايت | |
2560x1440 | الجودة (1.5x) | 207 ميجا بايت | 164 ميجابايت | 43 ميجابايت |
متوازن (1.7x) | 189 ميجابايت | 153 ميجابايت | 36 ميجابايت | |
الأداء (2x) | 172 ميجابايت | 143 ميجابايت | 29 ميجابايت | |
أداء فائق (3x) | 149 ميجابايت | 130 ميجابايت | 19 ميجابايت | |
1920x1080 | الجودة (1.5x) | 115 ميجابايت | 90 ميجابايت | 24 ميجابايت |
متوازن (1.7x) | 105 ميجابايت | 85 ميجابايت | 20 ميجابايت | |
الأداء (2x) | 101 ميجابايت | 83 ميجابايت | 18 ميجابايت | |
أداء فائق (3x) | 84 ميجابايت | 72 ميجابايت | 11 ميجابايت |
الأرقام تقريبية، وتم تقريبها إلى أقرب ميجابايت باستخدام وحدة معالجة الرسومات RX 6700XT في DX12، وهي عرضة للتغيير.
للحصول على تفاصيل حول كيفية إدارة متطلبات ذاكرة FSR2، يرجى الرجوع إلى قسم هذا المستند الذي يتناول إدارة الذاكرة.
FSR2 عبارة عن خوارزمية زمنية، وبالتالي تتطلب الوصول إلى البيانات من الإطار الحالي والسابق. يسرد الجدول التالي كافة المدخلات الخارجية المطلوبة بواسطة FSR2.
يشير عمود الدقة إلى ما إذا كان يجب أن تكون البيانات بدقة "العرض" أو دقة "العرض التقديمي". تشير الدقة "المُقدمة" إلى أن المورد يجب أن يتطابق مع الدقة التي يقوم بها التطبيق بالعرض. على العكس من ذلك، يشير "العرض التقديمي" إلى أن دقة الهدف يجب أن تتطابق مع ما سيتم تقديمه للمستخدم. جميع الموارد هي من الإطار المعروض الحالي، بالنسبة لتطبيقات DirectX(R)12 وVulkan(R) يجب نقل جميع موارد الإدخال إلى
D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE
وVK_ACCESS_SHADER_READ_BIT
على التوالي قبل استدعاءffxFsr2ContextDispatch
.
اسم | دقة | شكل | يكتب | ملحوظات |
---|---|---|---|---|
عازلة اللون | يجعل | APPLICATION SPECIFIED | نَسِيج | المخزن المؤقت لألوان دقة العرض للإطار الحالي الذي يوفره التطبيق. إذا كانت محتويات المخزن المؤقت للألوان في نطاق ديناميكي عالٍ (HDR)، فيجب تعيين علامة FFX_FSR2_ENABLE_HIGH_DYNAMIC_RANGE في حقل flags ببنية FfxFsr2ContextDescription . |
عمق المخزن المؤقت | يجعل | APPLICATION SPECIFIED (1x FLOAT) | نَسِيج | المخزن المؤقت لعمق دقة العرض للإطار الحالي الذي يوفره التطبيق. يجب توفير البيانات كقيمة فاصلة عائمة واحدة، وتكون دقتها تحت سيطرة التطبيق. يجب إرسال تكوين العمق إلى FSR2 عبر حقل flags ببنية FfxFsr2ContextDescription عند إنشاء FfxFsr2Context . يجب عليك تعيين علامة FFX_FSR2_ENABLE_DEPTH_INVERTED إذا كان المخزن المؤقت للعمق الخاص بك مقلوبًا (أي نطاق [1..0])، ويجب عليك تعيين علامة FFX_FSR2_ENABLE_DEPTH_INFINITE إذا كان المخزن المؤقت للعمق الخاص بك يحتوي على مستوى بعيد لا نهائي. إذا كان التطبيق يوفر المخزن المؤقت للعمق بتنسيق D32S8 ، فسيتجاهل FSR2 مكون الاستنسل الخاص بالمخزن المؤقت، ويقوم بإنشاء مورد R32_FLOAT لمعالجة المخزن المؤقت للعمق. على أجهزة GCN وRDNA، يتم تخزين مخازن العمق بشكل منفصل عن مخازن الاستنسل. |
ناقلات الحركة | تقديم أو عرض تقديمي | APPLICATION SPECIFIED (2x FLOAT) | نَسِيج | متجهات الحركة ثنائية الأبعاد للإطار الحالي التي يوفرها التطبيق في نطاق [ (<-width, -height> .. <width, height> ]. إذا كان تطبيقك يعرض متجهات حركة بنطاق مختلف، فيمكنك استخدام حقل motionVectorScale الخاص بـ بنية FfxFsr2DispatchDescription لضبطها لتتناسب مع النطاق المتوقع لـ FSR2 داخليًا، يستخدم FSR2 كميات 16 بت لتمثيل متجهات الحركة في العديد من الحالات يعني أنه على الرغم من أنه يمكن توفير متجهات الحركة بدقة أكبر، فإن FSR2 لن يستفيد من الدقة المتزايدة يجب أن تكون دقة المخزن المؤقت لمتجه الحركة مساوية لدقة العرض، ما لم يتم تعيين علامة FFX_FSR2_ENABLE_DISPLAY_RESOLUTION_MOTION_VECTORS في حقل flags في بنية FfxFsr2ContextDescription عند إنشاء FfxFsr2Context ، وفي هذه الحالة يجب أن يكون مساويًا لدقة العرض التقديمي. |
قناع رد الفعل | يجعل | R8_UNORM | نَسِيج | نظرًا لأن بعض مناطق الصورة المعروضة لا تترك أثرًا في المخزن المؤقت للعمق أو تتضمن متجهات حركة، فإن FSR2 يوفر دعمًا لنسيج القناع التفاعلي الذي يمكن استخدامه للإشارة إلى FSR2 حيث توجد هذه المناطق. ومن الأمثلة الجيدة على ذلك الجسيمات أو الكائنات المخلوطة بألفا والتي لا تكتب متجهات العمق أو الحركة. إذا لم يتم تعيين هذا المورد، فسيتعامل منطق اكتشاف تغيير التظليل الخاص بـ FSR2 مع هذه الحالات بأفضل ما يمكنه، ولكن للحصول على أفضل النتائج، يجب تعيين هذا المورد. لمزيد من المعلومات حول القناع التفاعلي، يرجى الرجوع إلى قسم القناع التفاعلي. |
التعرض | 1x1 | R32_FLOAT | نَسِيج | نسيج 1×1 يحتوي على قيمة التعريض المحسوبة للإطار الحالي. هذا المورد اختياري، وقد يتم حذفه إذا تم تعيين علامة FFX_FSR2_ENABLE_AUTO_EXPOSURE في حقل flags ببنية FfxFsr2ContextDescription عند إنشاء FfxFsr2Context . |
يجب أن يتم عرض جميع المدخلات التي يتم توفيرها في دقة العرض، باستثناء متجهات الحركة، مع عدم الاستقرار. يجب ألا يتم تطبيق الارتعاش على متجهات الحركة، ما لم تكن علامة FFX_FSR2_ENABLE_MOTION_VECTORS_JITTER_CANCELLATION
موجودة.
يوصى بشدة باستخدام مخزن مؤقت مقلوب لانهائي العمق مع FSR2. ومع ذلك، يتم دعم تكوينات المخزن المؤقت للعمق البديلة. يجب أن يقوم التطبيق بإبلاغ FSR2 API بتكوين المخزن المؤقت العميق الخاص به عن طريق تعيين العلامات المناسبة أثناء إنشاء FfxFsr2Context
. يحتوي الجدول أدناه على العلامات المناسبة.
علم FSR2 | ملحوظة |
---|---|
FFX_FSR2_ENABLE_DEPTH_INVERTED | إشارة صغيرة تشير إلى أن بيانات المخزن المؤقت لعمق الإدخال المقدمة معكوسة [max..0]. |
FFX_FSR2_ENABLE_DEPTH_INFINITE | إشارة صغيرة إلى أن بيانات المخزن المؤقت لعمق الإدخال المقدمة تستخدم مستوى بعيدًا لا نهائيًا. |
يتمثل الجزء الأساسي من الخوارزمية الزمنية (سواء كان ذلك في الحواف أو الارتقاء) في توفير متجهات الحركة. يقبل FSR2 متجهات الحركة ثنائية الأبعاد والتي تقوم بتشفير الحركة من بكسل في الإطار الحالي إلى موضع نفس البكسل في الإطار السابق. يتوقع FSR2 أن يتم توفير متجهات الحركة بواسطة التطبيق في النطاق [ <-width, -height> .. <width, height> ] ؛ وهذا يطابق مساحة الشاشة. على سبيل المثال، يمثل متجه الحركة للبكسل الموجود في الزاوية العلوية اليسرى من الشاشة بقيمة <width, height> حركة اجتازت العرض والارتفاع الكاملين لأسطح الإدخال، والتي تنشأ من الزاوية اليمنى السفلية .
إذا كان التطبيق الخاص بك يحسب متجهات الحركة في مساحة أخرى - على سبيل المثال مساحة إحداثيات الجهاز المقيسة - فيمكنك استخدام حقل motionVectorScale
الخاص ببنية FfxFsr2DispatchDescription
لإرشاد FSR2 لضبطها لتتناسب مع النطاق المتوقع لـ FSR2. توضح أمثلة التعليمات البرمجية أدناه كيف يمكن تغيير حجم متجهات الحركة إلى مساحة الشاشة. يوضح مثال كود HLSL وC++ أدناه كيف يمكن قياس متجهات الحركة NDC-space باستخدام FSR2 host API.
// GPU: Example of application NDC motion vector computation
float2 motionVector = (previousPosition.xy / previousPosition.w) - (currentPosition.xy / currentPosition.w);
// CPU: Matching FSR 2.0 motionVectorScale configuration
dispatchParameters.motionVectorScale.x = ( float )renderWidth;
dispatchParameters.motionVectorScale.y = ( float )renderHeight;
داخليًا، يستخدم FSR2 كميات 16 بت لتمثيل متجهات الحركة في كثير من الحالات، مما يعني أنه في حين يمكن توفير متجهات الحركة بدقة أكبر، فإن FSR2 لن يستفيد حاليًا من الدقة المتزايدة. يجب أن تكون دقة المخزن المؤقت لمتجه الحركة مساوية لدقة العرض، ما لم يتم تعيين علامة FFX_FSR2_ENABLE_DISPLAY_RESOLUTION_MOTION_VECTORS
في حقل flags
لبنية FfxFsr2ContextDescription
عند إنشاء FfxFsr2Context
، وفي هذه الحالة يجب أن تكون مساوية لدقة العرض التقديمي.
سيؤدي FSR2 إلى تحسين جودة الجودة عندما يوفر المزيد من الكائنات متجهات الحركة الخاصة بها. ولذلك يُنصح بأن تقوم جميع الكائنات المعتمة والمختبرة ألفا والمخلوطة بكتابة متجهات الحركة الخاصة بها لجميع وحدات البكسل المغطاة. إذا تم تطبيق تأثيرات تظليل قمة الرأس - مثل تمرير الأشعة فوق البنفسجية - فيجب أيضًا أخذ هذه الحسابات في الاعتبار عند حساب الحركة للحصول على أفضل النتائج. بالنسبة للكائنات الممزوجة بألفا، يُنصح بشدة أيضًا بتخزين قيمة ألفا لكل بكسل مغطى على البكسل المقابل في القناع التفاعلي. سيسمح هذا لـ FSR2 بأداء معالجة أفضل للكائنات الممزوجة بألفا أثناء الارتقاء. يعد القناع التفاعلي مهمًا بشكل خاص للكائنات الممزوجة ألفا حيث قد تكون كتابة متجهات الحركة باهظة، مثل الجسيمات.
في سياق FSR2، يعني مصطلح "التفاعلية" مدى تأثير العينات المقدمة للإطار الحالي على إنتاج الصورة النهائية التي تمت ترقيتها. عادةً، تساهم العينات المقدمة للإطار الحالي بكمية متواضعة نسبيًا في النتيجة المحسوبة بواسطة FSR2؛ ومع ذلك، هناك استثناءات. للحصول على أفضل النتائج للكائنات الممزوجة بألفا سريعة الحركة، يتطلب FSR2 مرحلة إعادة الإسقاط والتراكم لتصبح أكثر تفاعلاً مع وحدات البكسل هذه. نظرًا لعدم وجود طريقة جيدة لتحديد وحدات البكسل التي تم عرضها باستخدام مزج ألفا، من خلال اللون أو العمق أو متجهات الحركة، فإن FSR2 يعمل بشكل أفضل عندما تحدد التطبيقات هذه المناطق بشكل واضح.
لذلك، يُنصح بشدة أن توفر التطبيقات قناعًا تفاعليًا لـ FSR2. يرشد القناع التفاعلي FSR2 إلى المكان الذي يجب أن يقلل فيه من اعتماده على المعلومات التاريخية عند تركيب البكسل الحالي، وبدلاً من ذلك يسمح لعينات الإطار الحالي بالمساهمة بشكل أكبر في النتيجة النهائية. يسمح القناع التفاعلي للتطبيق بتوفير قيمة من [0.0..1.0] حيث تشير 0.0 إلى أن البكسل ليس متفاعلًا على الإطلاق (ويجب استخدام إستراتيجية تكوين FSR2 الافتراضية)، وتشير القيمة 1.0 إلى أن البكسل يجب أن يكون كاملاً. رد الفعل. هذا نطاق النقطة العائمة ويمكن تخصيصه لمواقف مختلفة.
في حين أن هناك تطبيقات أخرى للقناع التفاعلي، فإن التطبيق الأساسي للقناع التفاعلي ينتج نتائج أفضل لرفع مستوى الصور التي تتضمن كائنات ممزوجة ألفا. الوكيل الجيد للتفاعل هو في الواقع قيمة ألفا المستخدمة عند تركيب كائن ممزوج ألفا في المشهد، لذلك، يجب أن تكتب التطبيقات alpha
إلى القناع التفاعلي. تجدر الإشارة إلى أنه من غير المرجح أن تؤدي القيمة التفاعلية التي تقترب من 1 إلى نتائج جيدة على الإطلاق. لذلك، نوصي بتثبيت الحد الأقصى للقيمة التفاعلية بحوالي 0.9.
إذا لم يتم توفير قناع تفاعلي لـ FSR2 (عن طريق تعيين الحقل reactive
لـ FfxFsr2DispatchDescription
إلى NULL
) فسيتم استخدام نسيج 1x1 تم إنشاؤه داخليًا بقيمة تفاعلية تم مسحها.
لمساعدة التطبيقات على إنشاء القناع التفاعلي وقناع الشفافية والتركيب، يوفر FSR2 واجهة برمجة التطبيقات (API) المساعدة الاختيارية. تحت الغطاء، تطلق واجهة برمجة التطبيقات (API) تظليلًا حسابيًا يحسب هذه القيم لكل بكسل باستخدام إرشادي قائم على النصوع.
يمكن للتطبيقات التي ترغب في القيام بذلك استدعاء الدالة ffxFsr2ContextGenerateReactiveMask
ويجب أن تمرر نسختين من المخزن المؤقت للألوان، أحدهما يحتوي على هندسة معتمة فقط، والآخر يحتوي على كائنات معتمة ومخلوطة ألفا.
بالإضافة إلى القناع التفاعلي، يوفر FSR2 للتطبيق الإشارة إلى مناطق العرض المتخصصة الأخرى التي يجب أخذها في الاعتبار أثناء عملية الارتقاء. تتضمن أمثلة هذا العرض الخاص مناطق انعكاسات تتبع الأشعة أو الأنسجة المتحركة.
بينما يقوم القناع التفاعلي بضبط توازن التراكم، يقوم قناع الشفافية والتركيب بضبط آليات حماية سجل البكسل. يزيل القناع أيضًا تأثير عامل عدم استقرار النصوع. لا يقوم البكسل ذو القيمة 0 في قناع الشفافية والتركيب بإجراء أي تعديل إضافي على القفل لذلك البكسل. وعلى العكس من ذلك، تشير القيمة 1 إلى أنه يجب إزالة قفل هذا البكسل بالكامل.
إذا لم يتم توفير قناع الشفافية والتركيب إلى FSR2 (عن طريق تعيين حقل transparencyAndComposition
الخاص بـ FfxFsr2DispatchDescription
إلى NULL
) فسيتم استخدام نسيج 1x1 تم إنشاؤه داخليًا مع شفافية وقيمة تكوين تم مسحهما.
يتضمن FSR2.2 ميزة تجريبية لإنشاء قناع تفاعلي وقناع الشفافية والتركيب تلقائيًا. لتمكين ذلك، يجب تعيين حقل enableAutoReactive
الخاص بـ FfxFsr2DispatchDescription
على "TRUE" ويجب توفير نسخة من الأجزاء المعتمة فقط من المخزن المؤقت الخلفي في "colorOpaqueOnly". سيقوم FSR2 تلقائيًا بإنشاء واستخدام القناع التفاعلي وقناع الشفافية والتركيب داخليًا. يتم إنشاء الأقنعة في مسار حسابي من خلال تحليل اختلاف المخزن المؤقت للألوان مع هندسة شفافة وبدونها، بالإضافة إلى مقارنتها بالإطار السابق. واستنادًا إلى نتيجة تلك الحسابات، يتم تعيين قيم القناع التفاعلي وقناع الشفافية والتركيب لكل بكسل. لاستخدام الإنشاء التلقائي للأقنعة، يجب أيضًا توفير القيم الأربع التالية لقياس كثافة الأقنعة والحد منها (لاحظ أن القيم الافتراضية المذكورة هي قيم البداية المقترحة ولكن يجب ضبطها لكل عنوان):
تهدف هذه الميزة إلى المساعدة في دمج FSR2.2 في محرك أو عنوان جديد. ومع ذلك، للحصول على أفضل جودة، ما زلنا نوصي بعرض القناع التفاعلي وقناع الشفافية والتركيب بنفسك، حيث من المتوقع أن يكون إنشاء تلك القيم بناءً على المادة أكثر موثوقية من إنشائها تلقائيًا من الصورة النهائية.
يرجى ملاحظة أن هذه الميزة لا تزال في المرحلة التجريبية وقد تتغير بشكل كبير في المستقبل.
يوفر FSR2 قيمتين تتحكمان في التعريض الضوئي المستخدم عند إجراء الترقية. وهم على النحو التالي:
يجب أن تتطابق قيمة التعريض مع تلك التي يستخدمها التطبيق أثناء أي عمليات تعيين نغمات لاحقة يقوم بها التطبيق. وهذا يعني أن FSR2 سيعمل بشكل متسق مع ما يُحتمل أن يكون مرئيًا في الصورة النهائية ذات الألوان المعينة.
في المراحل المختلفة لخوارزمية FSR2 الموضحة في هذا المستند، سوف يقوم FSR2 بحساب قيمة التعريض الخاصة به للاستخدام الداخلي. تجدر الإشارة إلى أن جميع المخرجات من FSR2 سيتم عكس تعيين النغمات الداخلي هذا قبل كتابة الإخراج النهائي. وهذا يعني أن FSR2 يُرجع النتائج في نفس المجال مثل إشارة الإدخال الأصلية.
يمكن أن يكون لقيم التعريض المختارة بشكل سيء تأثير كبير على الجودة النهائية لترقية FSR2. لذلك، يوصى باستخدام FFX_FSR2_ENABLE_AUTO_EXPOSURE
بواسطة التطبيق، ما لم يكن هناك سبب محدد لعدم القيام بذلك. عند تعيين FFX_FSR2_ENABLE_AUTO_EXPOSURE
في حقل flags
الخاص ببنية FfxFsr2ContextDescription
، يتم استخدام حساب التعريض الموضح في كود HLSL أدناه لحساب قيمة التعريض الضوئي، التي تطابق استجابة التعريض الضوئي لمخزون فيلم ISO 100.
float ComputeAutoExposureFromAverageLog ( float averageLogLuminance)
{
const float averageLuminance = exp (averageLogLuminance);
const float S = 100.0f ; // ISO arithmetic speed
const float K = 12.5f ;
const float exposureIso100 = log2 ((averageLuminance * S) / K);
const float q = 0.65f ;
const float luminanceMax = ( 78.0f / (q * S)) * pow ( 2.0f , exposureIso100);
return 1 / luminanceMax;
}
الهدف الأساسي من FSR2 هو تحسين أداء عرض التطبيق باستخدام خوارزمية الترقية الزمنية التي تعتمد على عدد من المدخلات. ولذلك، فإن وضعه في خط الإنتاج يعد أمرًا أساسيًا لضمان التوازن الصحيح بين أعلى جودة بصرية وأداء رائع.
مع أي نهج لرفع مستوى الصورة، من المهم فهم كيفية وضع خوارزميات مساحة الصورة الأخرى فيما يتعلق بخوارزمية الارتقاء. إن وضع تأثيرات مساحة الصورة الأخرى قبل الترقية له ميزة تشغيلها بدقة أقل، مما يمنح التطبيق ميزة الأداء بالطبع. ومع ذلك، قد لا يكون ذلك مناسبًا لبعض فئات تقنيات مساحة الصورة. على سبيل المثال، قد تقوم العديد من التطبيقات بإدخال ضوضاء أو حبيبات في الصورة النهائية، ربما لمحاكاة كاميرا فعلية. إن القيام بذلك قبل أداة الترقية قد يتسبب في قيام أداة الترقية بتضخيم التشويش، مما يتسبب في حدوث آثار غير مرغوب فيها في الصورة التي تمت ترقيتها الناتجة. يقسم الجدول التالي تقنيات مساحة الصورة في الوقت الحقيقي الشائعة إلى عمودين. تحتوي "المعالجة اللاحقة أ" على كافة التقنيات التي سيتم تشغيلها عادةً قبل ترقية FSR2، مما يعني أنها ستعمل جميعها بدقة عرض. وعلى العكس من ذلك، يحتوي عمود "ما بعد المعالجة ب" على كافة التقنيات التي يوصى بتشغيلها بعد FSR2، مما يعني أنها ستعمل بدقة عرض أكبر.
مرحلة ما بعد المعالجة أ | مرحلة ما بعد المعالجة ب |
---|---|
انعكاسات مساحة الشاشة | حبوب الفيلم |
انسداد مساحة الشاشة المحيطة | انحراف لوني |
دينويزر (الظل، الانعكاسات) | المقالة القصيرة |
التعرض (اختياري) | تعيين النغمات |
يزدهر | |
عمق الميدان | |
طمس الحركة |
يرجى ملاحظة أن التوصيات الواردة هنا هي لأغراض إرشادية فقط وتعتمد على الخصائص الدقيقة لتنفيذ تطبيقك.
في حين أنه من الممكن إنشاء الموارد الوسيطة المناسبة، وتجميع كود التظليل، وتعيين الارتباطات، وإرسال الإرساليات، فمن الأسهل بكثير استخدام واجهة برمجة التطبيقات FSR2 host التي يتم توفيرها.
لاستخدام واجهة برمجة التطبيقات (API)، يجب عليك ربط مكتبات FSR2 (سنتحدث عن تلك المكتبات قريبًا) وتضمين ملف الرأس ffx_fsr2.h
، والذي بدوره يحتوي على تبعيات الرأس التالية:
ffx_assert.h
ffx_error.h
ffx_fsr2_interface.h
ffx_types.h
ffx_util.h
لاستخدام FSR2 API، يجب عليك ربط ffx_fsr2_api_x64.lib
الذي سيوفر الرموز لواجهات برمجة التطبيقات التي تواجه التطبيق. ومع ذلك، تحتوي واجهة برمجة تطبيقات FSR2 على واجهة خلفية معيارية، مما يعني أنه قد يتم استهداف واجهات برمجة تطبيقات ومنصات رسومية مختلفة من خلال استخدام واجهة خلفية مطابقة. لذلك، يجب عليك أيضًا تضمين الواجهة الخلفية lib التي تتوافق مع متطلباتك، بالرجوع إلى الجدول أدناه.
هدف | اسم المكتبة |
---|---|
دايركت اكس (ص)12 | ffx_fsr2_dx12_x64.lib |
فولكان (R) | ffx_fsr2_vk_x64.lib |
يرجى ملاحظة أن البنية المعيارية لواجهة برمجة تطبيقات FSR2 تسمح بتنفيذ الواجهات الخلفية المخصصة. راجع قسم الواجهة الخلفية المعيارية لمزيد من التفاصيل.
للبدء في استخدام واجهة برمجة التطبيقات (API)، يجب أن يقوم التطبيق أولاً بإنشاء بنية FfxFsr2Context
. يجب أن يكون هذا الهيكل موجودًا في مكان ما مع عمر يطابق تقريبًا عمر المخزن المؤقت الخاص بك؛ عادةً ما يكون مكان ما في كومة التطبيق خيارًا جيدًا. عن طريق استدعاء ffxFsr2ContextCreate
سيتم ملء بنية FfxFsr2Context
بالبيانات التي تتطلبها. علاوة على ذلك، سيتم إجراء عدد من الاستدعاءات من ffxFsr2ContextCreate
إلى الواجهة الخلفية التي يتم توفيرها إلى FfxFsr2Context
كجزء من بنية FfxFsr2ContextDescription
. ستقوم هذه الاستدعاءات بتنفيذ مهام مثل إنشاء الموارد الوسيطة التي يتطلبها FSR2 وإعداد التظليل وحالة خط الأنابيب المرتبطة بها. لا يقوم FSR2 API بإجراء أي تخصيص للذاكرة الديناميكية.
في كل إطار من إطارات تطبيقك الذي يتطلب الترقية، يجب عليك الاتصال بـ ffxFsr2ContextDispatch
. تقبل هذه الوظيفة بنية FfxFsr2Context
التي تم إنشاؤها مسبقًا خلال عمر التطبيق بالإضافة إلى وصف لكيفية تنفيذ الترقية بدقة وعلى أي بيانات. يتم توفير هذا الوصف من خلال التطبيق الذي يملأ بنية FfxFsr2DispatchDescription
.
يتم تنفيذ تدمير السياق عن طريق استدعاء ffxFsr2ContextDestroy
. يرجى ملاحظة أن وحدة معالجة الرسومات يجب أن تكون في وضع الخمول قبل محاولة الاتصال ffxFsr2ContextDestroy
، وأن الوظيفة لا تقوم بإجراء مزامنة ضمنية للتأكد من أن الموارد التي يتم الوصول إليها بواسطة FSR2 ليست في حالة طيران حاليًا. السبب وراء هذا الاختيار هو تجنب تقديم FSR2 لعمليات مسح GPU إضافية للتطبيقات التي تقوم بالفعل بإجراء مزامنة كافية عند النقطة التي قد يرغبون فيها في تدمير FfxFsr2Context
، وهذا يسمح للتطبيق بتنفيذ عملية الإنشاء والتفكيك الأكثر كفاءة لواجهة برمجة تطبيقات FSR2 عندما مطلوب.
هناك وظائف مساعدة إضافية يتم توفيرها كجزء من FSR2 API. تؤدي هذه الوظائف المساعدة مهام مثل حساب إزاحات اهتزاز وحدات البكسل الفرعية، بالإضافة إلى حساب دقة العرض بناءً على دقة الإرسال وأوضاع القياس الافتراضية التي يوفرها FSR2.
للحصول على وثائق أكثر شمولاً لواجهة برمجة تطبيقات FSR2، يمكنك الرجوع إلى الوثائق المرجعية لواجهة برمجة التطبيقات المتوفرة.
يعني تصميم واجهة برمجة تطبيقات FSR2 أن التنفيذ الأساسي لخوارزمية FSR2 لا يعرف واجهة برمجة التطبيقات التي يتم عرضها عليها. بدلاً من ذلك، يستدعي FSR2 الوظائف المتوفرة له من خلال واجهة، مما يسمح باستخدام واجهات خلفية مختلفة مع FSR2. يسمح هذا التصميم أيضًا للتطبيقات التي تدمج FSR2 بتوفير تنفيذ الواجهة الخلفية الخاصة بها، مما يعني أن الأنظمة الأساسية التي لا يدعمها FSR2 حاليًا قد يتم استهدافها من خلال تنفيذ عدد قليل من الوظائف. علاوة على ذلك، يمكن للتطبيقات التي لها تجريدات العرض الخاصة بها أيضًا تنفيذ الواجهة الخلفية الخاصة بها، والتحكم في جميع جوانب الوظيفة الأساسية لـ FSR2، بما في ذلك إدارة الذاكرة، وإنشاء الموارد، وتجميع التظليل، وربط موارد التظليل، وتقديم أحمال عمل FSR2 إلى جهاز الرسومات. .
خارج الصندوق، سيتم تجميع واجهة برمجة تطبيقات FSR2 في مكتبات متعددة بعد الفصل الموضح بالفعل بين واجهة برمجة التطبيقات الأساسية والواجهات الخلفية. هذا يعني أنه إذا كنت ترغب في استخدام الواجهات الخلفية المتوفرة مع FSR2، فيجب عليك ربط كل من FSR2 API lib الأساسي بالإضافة إلى الواجهة الخلفية المطابقة لمتطلباتك.
يأتي الإصدار العام من FSR2 مزودًا بواجهات DirectX(R)12 وVulkan(R)، لكن الواجهات الخلفية الأخرى متاحة عند الطلب. تحدث مع ممثل AMD Developer Technology الخاص بك للحصول على مزيد من المعلومات.
إذا تم استخدام FSR2 API مع إحدى الواجهات الخلفية المتوفرة (على سبيل المثال: DirectX(R)12 أو Vulkan(R)) فسيتم إنشاء جميع الموارد التي يتطلبها FSR2 كموارد مخصصة مباشرةً باستخدام جهاز الرسومات الذي يوفره التطبيق المضيف. ومع ذلك، من خلال تجاوز مجموعة وظائف الإنشاء والتدمير الموجودة في الواجهة الخلفية، فمن الممكن للتطبيق أن يتحكم بشكل أكثر دقة في إدارة ذاكرة FSR2.
للقيام بذلك، يمكنك إما توفير واجهة خلفية مخصصة كاملة لـ FSR2 عبر بنية FfxFsr2ContextDescription
التي تم تمريرها إلى وظيفة ffxFsr2ContextCreate
، أو يمكنك استرداد الواجهة الخلفية لواجهة برمجة التطبيقات (API) التي تريدها وتجاوز وظائف إنشاء الموارد وتدميرها للتعامل معها بنفسك. للقيام بذلك، ما عليك سوى الكتابة فوق مؤشرات الدالة fpCreateResource
و fpDestroyResource
.
// Setup DX12 interface.
const size_t scratchBufferSize = ffxFsr2GetScratchMemorySizeDX12();
void * scratchBuffer = malloc(scratchBufferSize);
FfxErrorCode errorCode = ffxFsr2GetInterfaceDX12(&contextDescription.callbacks, m_pDevice-> GetDevice (), scratchBuffer, scratchBufferSize);
FFX_ASSERT (errorCode == FFX_OK);
// Override the resource creation and destruction.
contextDescription.callbacks.createResource = myCreateResource;
contextDescription.callbacks.destroyResource = myDestroyResource;
// Set up the context description.
contextDescription.device = ffxGetDeviceDX12(m_pDevice-> GetDevice ());
contextDescription.maxRenderSize.width = renderWidth;
contextDescription.maxRenderSize.height = renderHeight;
contextDescription.displaySize.width = displayWidth;
contextDescription.displaySize.height = displayHeight;
contextDescription.flags = FFX_FSR2_ENABLE_HIGH_DYNAMIC_RANGE
| FFX_FSR2_ENABLE_DEPTH_INVERTED
| FFX_FSR2_ENABLE_AUTO_EXPOSURE;
// Create the FSR2 context.
errorCode = ffxFsr2ContextCreate(&context, &contextDescription);
FFX_ASSERT (errorCode == FFX_OK);
إحدى المزايا المثيرة للاهتمام لتطبيق يتحكم في إدارة الذاكرة المطلوبة لـ FSR2 هي إمكانية إجراء الاسم المستعار للمورد، مما قد يؤدي إلى توفير الذاكرة. يوضح الجدول الموجود في متطلبات الذاكرة التوفيرات المتاحة من خلال استخدام هذه التقنية. من أجل تحقيق التوفير الموضح في هذا الجدول، يجب العثور على منطقة مناسبة من الذاكرة - لا يلزم أن تظل محتوياتها موجودة عبر استدعاء إرسالات FSR2 - للمشاركة مع الموارد المستعارة المطلوبة لـ FSR2. كل استدعاء FfxFsr2CreateResourceFunc
يتم إجراؤه بواسطة واجهة برمجة التطبيقات الأساسية لـ FSR2 من خلال واجهة الواجهة الخلفية لـ FSR2 سوف يحتوي على مجموعة من العلامات كجزء من بنية FfxCreateResourceDescription
. إذا تم تعيين FFX_RESOURCE_FLAGS_ALIASABLE
في حقل flags
، فهذا يشير إلى أن المورد قد يكون مستعارًا بشكل آمن مع موارد أخرى في إطار العرض.
الحواف المؤقتة (TAA) هي تقنية تستخدم مخرجات الإطارات السابقة لإنشاء مخرجات ذات جودة أعلى من الإطار الحالي. نظرًا لأن FSR2 له هدف مماثل - وإن كان مع هدف إضافي يتمثل أيضًا في زيادة دقة الصورة المقدمة - فلم تعد هناك حاجة لتضمين تصريح TAA منفصل في تطبيقك.
يعتمد FSR2 على التطبيق لتطبيق اهتزاز وحدات البكسل الفرعية أثناء العرض - ويتم تضمين ذلك عادةً في مصفوفة الإسقاط الخاصة بالكاميرا. لتسهيل تطبيق ارتعاش الكاميرا، توفر FSR2 API مجموعة صغيرة من الوظائف المساعدة التي تحسب إزاحة ارتعاش البكسل الفرعي لإطار معين ضمن سلسلة من إزاحات ارتعاش منفصلة.
int32_t ffxFsr2GetJitterPhaseCount ( int32_t renderWidth, int32_t displayWidth);
FfxErrorCode ffxFsr2GetJitterOffset ( float * outX, float * outY, int32_t jitterPhase, int32_t sequenceLength);
داخليًا، تنفذ هذه الوظائف تسلسل هالتون[2،3] [هالتون]. الهدف من تسلسل هالتون هو توفير نقاط منفصلة مكانيا، والتي تغطي المساحة المتاحة.
من المهم أن نفهم أن القيم التي تم إرجاعها من ffxFsr2GetJitterOffset
موجودة في مساحة وحدة البكسل، ومن أجل تركيب ذلك بشكل صحيح في مصفوفة إسقاط، يجب علينا تحويلها إلى إزاحات إسقاط. يوضح الرسم البياني أعلاه بكسلًا واحدًا في مساحة وحدة البكسل وفي مساحة العرض. توضح قائمة التعليمات البرمجية أدناه كيفية تركيب قيمة إزاحة ارتعاش البكسل الفرعي بشكل صحيح في مصفوفة الإسقاط.
const int32_t jitterPhaseCount = ffxFsr2GetJitterPhaseCount(renderWidth, displayWidth);
float jitterX = 0 ;
float jitterY = 0 ;
ffxFsr2GetJitterOffset (&jitterX, &jitterY, index, jitterPhaseCount);
// Calculate the jittered projection matrix.
const float jitterX = 2 . 0f * jitterX / ( float )renderWidth;
const float jitterY = - 2 . 0f * jitterY / ( float )renderHeight;
const Matrix4 jitterTranslationMatrix = translateMatrix(Matrix3::identity, Vector3(jitterX, jitterY, 0 ));
const Matrix4 jitteredProjectionMatrix = jitterTranslationMatrix * projectionMatrix;
يجب تطبيق Jitter على جميع العروض. يتضمن ذلك الكائنات المعتمة والشفافة وكائنات تتبع الأشعة. بالنسبة للكائنات النقطية، يمكن تطبيق قيم ارتعاش البكسل الفرعي المحسوبة بواسطة الدالة ffxFsr2GetJitterOffset
على مصفوفة عرض الكاميرا التي تُستخدم في النهاية لإجراء التحويلات أثناء تظليل قمة الرأس. بالنسبة لعرض تتبع الشعاع، يجب تطبيق ارتعاش البكسل الفرعي على أصل الشعاع - غالبًا موضع الكاميرا.
سواء أكنت اخترت استخدام وظيفة ffxFsr2GetJitterOffset
أو مولد التسلسل الخاص بك ، يجب عليك تعيين حقل jitterOffset
لمجموعة FfxFsr2DispatchDescription
لإبلاغ FSR2 عن إزاحة الهروب التي تم تطبيقها من أجل تقديم كل إطار. علاوة على ذلك ، إذا لم تكن تستخدم وظيفة ffxFsr2GetJitterOffset
الموصى بها ، فيجب توخي الحذر بأن تسلسل الارتعاش الخاص بك لا يولد ناقلًا فارغًا ؛ هذه هي قيمة 0 في كل من الأبعاد X و Y.
يوضح الجدول أدناه طول تسلسل الارتعاش لكل من أوضاع الجودة الافتراضية.
وضع الجودة | عامل التحجيم | طول التسلسل |
---|---|---|
جودة | 1.5x (لكل بعد) | 18 |
متوازن | 1.7x (لكل بعد) | 23 |
أداء | 2.0x (لكل بعد) | 32 |
أداء فائق | 3.0x (لكل بعد) | 72 |
مخصص | [1..n] x (لكل بعد) | ceil(8 * n^2) |
معظم التطبيقات مع تقديم الوقت الحقيقي لها درجة كبيرة من الاتساق الزمني بين أي إطارين متتاليين. ومع ذلك ، هناك حالات قد يتسبب فيها التغيير في تحول الكاميرا إلى تغيير مفاجئ في ما يتم تقديمه. في مثل هذه الحالات ، من غير المرجح أن تكون FSR2 قادرة على إعادة استخدام أي بيانات تراكمت من الإطارات السابقة ، ويجب مسح هذه البيانات مثل استبعادها من النظر في عملية التركيب. للإشارة إلى FSR2 إلى أن قطع القفز قد حدث مع الكاميرا ، يجب عليك تعيين حقل reset
في true
FfxFsr2DispatchDescription
إلى الإطار الأول لتحويل الكاميرا المتقطع.
قد يكون تقديم الأداء أقل بقليل من تشغيل الإطار إلى الإطار النموذجي عند استخدام علامة إعادة تعيين ، حيث سيقوم FSR2 بمسح بعض الموارد الداخلية الإضافية.
عادةً ما يؤدي تطبيق التحيز السلبي MIPMAP إلى توليد صورة صاعدة مع تفاصيل نسيج أفضل. نوصي بتطبيق الصيغة التالية على تحيز MIPMAP الخاص بك:
mipBias = log2(renderResolution/displayResolution) - 1.0 ;
يُقترح أن تقوم التطبيقات بضبط تحيز MIP لمحتوى نسيج محدد عالي التردد والذي يكون عرضة لإظهار مشاكل التعرج الزمني.
يوضح الجدول التالي عامل التحيز MIPMAP الذي ينتج عن تقييم الرمز الكاذب أعلاه لنسب التحجيم التي تتوافق مع أوضاع الجودة المقترحة التي يجب أن تعرضها التطبيقات للمستخدمين النهائيين.
وضع الجودة | عامل التحجيم | تحيز MIPMAP |
---|---|---|
جودة | 1.5x (لكل بعد) | -1.58 |
متوازن | 1.7x (لكل بعد) | -1.76 |
أداء | 2.0x (لكل بعد) | -2.0 |
أداء فائق | 3.0x (لكل بعد) | -2.58 |
يتطلب API FSR2 frameTimeDelta
توفيره بواسطة التطبيق من خلال هيكل FfxFsr2DispatchDescription
. هذه القيمة بالميلي ثانية : إذا كانت تعمل بسرعة 60 إطارًا في الثانية ، فيجب أن تكون القيمة التي تم تمريرها حوالي 16.6F .
يتم استخدام القيمة ضمن المكون الزمني لميزة التعرض التلقائي FSR 2. هذا يسمح لضبط تراكم التاريخ لأغراض الجودة.
يتم دعم صور النطاق الديناميكي العالي في FSR2. لتمكين هذا ، يجب عليك تعيين FFX_FSR2_ENABLE_HIGH_DYNAMIC_RANGE
بت في حقل flags
لهيكل FfxFsr2ContextDescription
. يجب توفير الصور إلى FSR2 في مساحة اللون الخطي.
قد يتم توفير دعم لمساحات الألوان الإضافية في مراجعة مستقبلية لـ FSR2.
تم تصميم FSR2 للاستفادة من تسريع الأجهزة نصف الدقة (FP16) لتحقيق أعلى أداء ممكن. ومع ذلك ، لتوفير الحد الأقصى لمستوى التوافق والمرونة للتطبيقات ، يتضمن FSR2 أيضًا القدرة على تجميع التظليلات باستخدام عمليات الدقة الكاملة (FP32).
يوصى باستخدام إصدار FP16 من FSR2 على جميع الأجهزة التي تدعمه. يمكنك الاستعلام عن مستوى دعم بطاقة الرسومات الخاصة بك لـ FP16 عن طريق الاستعلام D3D[11/12]_SHADER_MIN_PRECISION_16_BIT
قدرة D3D12_FEATURE_DATA_SHADER_MIN_PRECISION_SUPPORT
في DIRECTX (R) 12 - يجب عليك التحقق FSR2. بالنسبة إلى Vulkan ، إذا لم يتم تعيين VkPhysicalDeviceFloat16Int8FeaturesKHR::shaderFloat16
، فيجب عليك التراجع إلى إصدار FP32 من FSR2. وبالمثل ، إذا لم يتم تعيين VkPhysicalDevice16BitStorageFeatures::storageBuffer16BitAccess
، يجب عليك أيضًا التراجع إلى إصدار FP32 من FSR2.
لتمكين مسار FP32 في رمز مصدر التظليل FSR2 ، يجب عليك تحديد FFX_HALF
ليكون 1
. من أجل مشاركة غالبية رمز مصدر الخوارزمية بين كل من FP16 و FP32 (ضمان مستوى عالٍ من مشاركة التعليمات البرمجية لدعم الصيانة المستمرة) ، ستلاحظ أن رمز مصدر تظليل FSR2 يستخدم مجموعة من وحدات الماكروز التي تسهل التبديل بينهما بين أنواع قاعدة 16 بت و 32 بت في مصدر التظليل.
نوع fidelityfx | FP32 | FP16 |
---|---|---|
FFX_MIN16_F | float | min16float |
FFX_MIN16_F2 | float2 | min16float2 |
FFX_MIN16_F3 | float3 | min16float3 |
FFX_MIN16_F4 | float4 | min16float4 |
يعدد الجدول أعلاه التعيينات بين أنواع SDK FidelityFX التجريدية ، والنوع الجوهري اللامع الذي سيتم استبداله اعتمادًا على تكوين مصدر التظليل أثناء التجميع.
تقوم وحدات معالجة الرسومات الحديثة بتنفيذ مجموعات من الخيوط - تسمى واجهات الموجة - معًا بطريقة Simt. يعد العدد الدقيق للموضوعات التي تشكل واجهة موجة واحدة كمية خاصة بالأجهزة. بعض الأجهزة ، مثل دعم GPUs المستندة إلى AMD و RDNA لجمع 64 خيوطًا معًا في واجهة موجة واحدة. اعتمادًا على الخصائص الدقيقة لتنفيذ الخوارزمية ، قد يكون من المفيد أكثر أو أقل تفضيل عرض واجهة الموجة المحددة. مع إدخال Tader Model 6.6 ، أضافت Microsoft القدرة على تحديد عرض واجهة الموجة عبر HLSL. بالنسبة للأجهزة ، مثل RDNA التي تدعم كلاً من عروض الواجهة الموجية 32 و 64 ، تعد هذه أداة مفيدة للغاية لأغراض التحسين ، حيث توفر طريقة نظيفة ومحمولة لطلب مكدس برنامج السائق لتنفيذ واجهة موجة بعرض محدد.
للتطبيقات المستندة إلى DirectX (R) 12 والتي تعمل على وحدات معالجة الرسومات RDNA و RDNA2 واستخدام Microsoft Atgility SDK ، ستقوم واجهة برمجة تطبيقات Host FSR2 بتحديد عرض واجهة الموجة 64.
يمكن تزويد بنية وصف السياق بوظيفة رد اتصال لتمرير التحذيرات النصية من وقت تشغيل FSR 2 إلى التطبيق الأساسي. عضو fpMessage
في الوصف هو من النوع FfxFsr2Message
وهو مؤشر دالة لتمرير رسائل سلسلة من أنواع مختلفة. تعيين هذا المتغير لدالة مناسبة ، وتمرير FFX_FSR2_ENABLE_DEBUG_CHECKING
داخل عضو FfxFsr2ContextDescription
سيمكن الميزة. يوصى بهذا يتم تمكينه فقط في بناء تصحيح الأخطاء.
مثال على نوع الإخراج الذي يمكن أن يحدث عندما يلاحظ المدقق المشكلات المحتملة أدناه:
FSR2_API_DEBUG_WARNING: FFX_FSR2_ENABLE_DEPTH_INFINITE and FFX_FSR2_ENABLE_DEPTH_INVERTED present, cameraFar value is very low which may result in depth separation artefacting
FSR2_API_DEBUG_WARNING: frameTimeDelta is less than 1.0f - this value should be milliseconds (~16.6f for 60fps)
يتم تنفيذ خوارزمية FSR2 في سلسلة من المراحل ، والتي هي كما يلي:
يتم وضع كل مرحلة تمريرة من الخوارزمية في الأقسام التي تلي هذه المرحلة ، ولكن يظهر تدفق البيانات لخوارزمية FSR2 الكاملة في المخطط أدناه.
المرحلة الهرمية للاصطدام بحساب لها مسؤوليتان:
يحتوي الجدول التالي على جميع الموارد التي تستهلكها مرحلة هرم الإضاءة.
تشير الطبقة الزمنية إلى الإطار الذي يجب الحصول عليه من البيانات. "الإطار الحالي" يعني أنه ينبغي الحصول على البيانات من الموارد التي تم إنشاؤها للإطار الذي سيتم تقديمه بعد ذلك. يشير "الإطار السابق" إلى أنه ينبغي الحصول على البيانات من الموارد التي تم إنشاؤها للإطار الذي قدم للتو. يشير عمود الدقة إلى ما إذا كان يجب أن تكون البيانات بدقة "المقدمة" أو "العرض التقديمي". يشير دقة "المقدمة" إلى أن المورد يجب أن يتطابق مع الدقة التي يؤدي بها التطبيق تقديمه. على العكس ، يشير "العرض التقديمي" إلى أن دقة الهدف يجب أن تتطابق مع ما يجب تقديمه للمستخدم.
اسم | طبقة زمنية | دقة | شكل | يكتب | ملحوظات |
---|---|---|---|---|---|
اللون العازلة | الإطار الحالي | يجعل | APPLICATION SPECIFIED | نَسِيج | عازلة لون الدقة في الإطار الحالي الذي يوفره التطبيق. إذا كانت محتويات العازلة الملونة في نطاق ديناميكي عالي (HDR) ، فيجب تعيين علامة FFX_FSR2_ENABLE_HIGH_DYNAMIC_RANGE في حقل flags لهيكل FfxFsr2ContextDescription . |
يحتوي الجدول التالي على جميع الموارد التي يتم إنتاجها أو تعديلها بواسطة مرحلة هرم الحساب.
تشير الطبقة الزمنية إلى الإطار الذي يجب الحصول عليه من البيانات. "الإطار الحالي" يعني أنه ينبغي الحصول على البيانات من الموارد التي تم إنشاؤها للإطار الذي سيتم تقديمه بعد ذلك. يشير "الإطار السابق" إلى أنه ينبغي الحصول على البيانات من الموارد التي تم إنشاؤها للإطار الذي قدم للتو. يشير عمود الدقة إلى ما إذا كان يجب أن تكون البيانات بدقة "المقدمة" أو "العرض التقديمي". يشير دقة "المقدمة" إلى أن المورد يجب أن يتطابق مع الدقة التي يؤدي بها التطبيق تقديمه. على العكس ، يشير "العرض التقديمي" إلى أن دقة الهدف يجب أن تتطابق مع ما يجب تقديمه للمستخدم.
اسم | طبقة زمنية | دقة | شكل | يكتب | ملحوظات |
---|---|---|---|---|---|
التعرض | الإطار الحالي | 1x1 | R32_FLOAT | نَسِيج | نسيج 1x1 يحتوي على قيمة التعرض المحسوبة للإطار الحالي. هذا المورد اختياري ، وقد يتم حذفه إذا تم تعيين علامة FFX_FSR2_ENABLE_AUTO_EXPOSURE في حقل flags من بنية FfxFsr2ContextDescription عند إنشاء FfxFsr2Context . |
اللمعان الحالي | الإطار الحالي | Render * 0.5 + mipchain | R16_FLOAT | نَسِيج | نسيج بنسبة 50 ٪ من ملمس الدقة التي تحتوي على نصوص الإطار الحالي. يتم تخصيص سلسلة MIP كاملة. |
يتم تنفيذ مرحلة هرم الإضاءة لحساب باستخدام Downs FidelityFX Single Pass