سؤال

أهوي!

كنت أبحث في تحديث بعض كود الاختبار القديم في محاولة لصقل الميزات الجديدة المضافة إلى GLKit. لقد تمكنت حتى الآن من إعداد GLKViewController والبدء في تقديم بعض الأشكال الأساسية ولكني كافحت للعثور على أي معلومات لائقة بخصوص GLKBaseEffect.

تنص وثائق GLKBaseEffect على ما يلي:

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

ما أجد صعوبة في تمييزه هو ؛

هل أحتاج إلى كائن GLKBaseEffect لكل "نموذج" أقوم بعرضه؟ أو هل يمكنني استخدام GLKBaseEffect واحد لكل "مشهد" وببساطة قم بتغيير الخصائص على الفور قبل الاتصال بـ PreparToDraw؟

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

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

هل يمكن لأي شخص إلقاء أي ضوء على هذا؟ لا يزال GLKit جديدًا إلى حد ما على iOS (وبالنسبة لي) لذا فإن أي معلومات ستكون موضع تقدير كبير.

هل كانت مفيدة؟

المحلول

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

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

إبحار سعيد ..

نصائح أخرى

كل تغيير في الخصائص "الأساسية" (نوع الإضاءة ، نموذج الإضاءة ، ثنائي الجوانب ، اللون المادي ، ...) سيؤدي إلى تحميل برنامج تظليل جديد مع استدعاء "PreparToDraw" التالي.

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

ومع ذلك ، يجب أن يكون اهتمامك الأساسي هو ترتيب الكائنات الخاصة بك لتقديمها.على الأقل تجميع كل الكائنات التي تستخدم نفس برنامج تظليل.ثم قم بإنشاء واستخدام كائن GLKBaseEffect واحد لكل مجموعة من هذه المجموعات. إذا لم تكن متأكدًا مما إذا كان تغيير خاصية GLKBaseEffect سيؤدي إلى تحميل برنامج shader جديد ، فإنني أوصي باستخدام Instruments للتحقق من مكالمات OpenGL.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top