سؤال

بقدر ما أعرف، لا يمكننا قراءة قيمة Z (العمق) في OpenGL ES 2.0.لذا فإنني أتساءل كيف يمكننا الحصول على إحداثيات العالم ثلاثي الأبعاد من نقطة على الشاشة ثنائية الأبعاد؟

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

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

شكرا مقدما! :)

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

المحلول

باستخدام FBO، يمكنك العرض دون عرض النتائج.إذا كنت تستخدم ES 2.0، فيمكن لتظليل الجزء الخاص بك الوصول إلى عمق الجزء الحالي (في إحداثيات النافذة) كجزء من gl_FragCoord، حتى تتمكن من كتابة ذلك إلى المخزن المؤقت للألوان، استخدم glReadPixels للحصول على النتيجة مرة أخرى والمتابعة.بدلًا من ذلك، يمكنك تحميل World-space z كمتغير وكتابة ذلك من تظليل الأجزاء، في حال كانت هذه طريقة أسهل.

لإقناع نفسك، حاول كتابة تظليل سريع يضع gl_FragCoord.z ​​على عجل وبدقة منخفضة، على سبيل المثال.فقط

gl_FragColor = vec4(vec3(gl_FragCoord.z), 1.0);

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

نصائح أخرى

يمكنني استخدام الأشعة الأساسية لاختيار كائن ثلاثي الأبعاد من لمسة شاشة. في الواقع ، أقوم بحساب التقاطع بين الشاشة العادية عند نقطة اللمس والكرة التي تحتوي على كائني. لالتقاط دقيق للغاية أو شكل معقد ، عليك استخدام العديد من المجال.

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

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

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

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

إذا كان لدى أي شخص مقاربة أنظف أحب أن أسمعها.

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