في OpenGL، كيف يمكنك الحصول على البنود رسم الخلف إلى الأمام؟

StackOverflow https://stackoverflow.com/questions/185536

  •  06-07-2019
  •  | 
  •  

سؤال

وافتراضيا يبدو أن الأجسام يتم رسمها الأمام إلى الخلف. أنا رسم الكائن UI 2-D، ونود أن خلق إعادته إلى الأمام. على سبيل المثال يمكن أن أقوم بإنشاء مربع أبيض أولا ثم إنشاء مربع أسود أصغر قليلا على رأس بالتالي خلق الجزء الأسود مع حدود بيضاء. هذه الوظيفة كان بعض المناقشات على ذلك، ووصف هذا الأمر بأنه "الرسام خوارزمية "ولكن في نهاية المطاف سبيل المثال أنها أعطت ببساطة جعلت الكائنات في ترتيب عكسي للحصول على التأثير المطلوب. الرقم الأول الخلف إلى الأمام الأبعاد تم لا يمكن أن يتحقق عن طريق بعض التحول (كائنات الأولى تذهب في الخلف، وكائنات اللاحقة الحصول على الاعتماد على أعلى) (gOrtho؟)؟

وسوف أذكر أيضا أنني لست مهتما في محلول باستخدام مكتبة المجمع مثل تخمة.

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

glViewport (0, 0, wd, ht);
glMatrixMode(GL_PROJECTION);           
glLoadIdentity();                      
glOrtho (0.0f, wd, ht, 0.0f, -1.0f, 1.0f);
glMatrixMode(GL_MODELVIEW);             
glLoadIdentity();                       
هل كانت مفيدة؟

المحلول

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

glDepthFunc(GL_NEVER);      // Ignore depth values (Z) to cause drawing bottom to top

وتأكد من أنك لا نسمي هذا:

glEnable (GL_DEPTH_TEST);   // Enables Depth Testing

نصائح أخرى

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

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

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

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

وترتيب الرسم هو الثابت. لا يوجد حل سهل. alogorithm الرسام (كائنات فرز حسب المسافة بينهما فيما يتعلق بالنظر الكاميرا الخاصة بك) هو الأكثر وضوحا، ولكن كما كنت قد اكتشفت، فإنه لا يحل جميع الحالات.

وأود أن أقترح مجموعة من algroithm الرسام وطبقات. على بناء طبقات لعناصر محددة في البرنامج. لذلك كنت حصلت على طبقة الخلفية، الكائنات طبقات، طبقات تأثير خاص، وطبقة واجهة المستخدم الرسومية.

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

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

وسيتم اختيار

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

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

ولقد اعتقدت دائما من خوارزمية الرسام كتقنية بديلة لإزالة سطح الخفية عندما لا يمكنك (أو لا تريد) استخدام العازلة ض.

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