سؤال

فيما يلي إعداداتي لـ opengl ، إذا كانت مهمة: Genacodicetagpre

اعتقدت لفترة من الوقت أن مستويات القطع ستنطبق على أي شيء يكون gl_Position.z خارج -1 إلى 1. ولكن حتى عندما أجبر gl_Position.z على رقم ثابت في التظليل: Genacodicetagpre

لا يزال هناك تخزين مؤقت وقص صحيحان على أساس gl_Position.w!إذن ما هي القواعد؟

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

المحلول

تكمن قيمة gl_Position فيما يسميه OpenGL "مساحة المقطع". إنه نظام إحداثيات متجانس . على وجه الخصوص ، نطاقات XYZ لمساحة القصاصة هي [-W ، + W]. لذلك يكون كل رأس في مساحة المقطع الخاصة به.

لست متأكدًا تمامًا مما تقصده بعبارة "ما هي القواعد". يتم قص gl_Position بقصاصة الفضاء مقابل منطقة العرض في مساحة متجانسة. لذلك يتم قصهم إلى المنطقة [-W، + W] لكل رأس. من الصعب تخيل ذلك في مساحة متجانسة إسقاطية ، لكن الرياضيات تعمل ، لذلك لا يهم.

بعد ذلك ، يتم تحويل الرؤوس المقطوعة إلى مساحة إحداثي جهاز معياري (NDC). هذا يعني قسمة XYZ لمساحة القصاصة على W. كل هذه الرؤوس تقع في النطاق [-1 ، 1].

من هناك ، يحدث تحويل منفذ العرض. تقوم معلمات كود الكود العام بقياس الرؤوس من مساحة NDC [-1 ، 1] إلى منطقة منفذ العرض. هذا يحول النقاط إلى مساحة النافذة ؛ في مساحة النافذة يتم تحويلها إلى نقطية.

يتم التحكم في XY لمساحة النافذة بواسطة رمز الترقيم العام. يتم التحكم في قيم Z لمساحة النافذة بواسطة رمز الترقيم العام. نطاق العمق الافتراضي هو القيمة القريبة من 0 والقيمة البعيدة 1 (تحذير: لا يوجد شيء مشترك بين مصفوفة المنظور والمستويات القريبة / البعيدة مع نطاق العمق. لا تخلط بين الاثنين) لذلك فهو يقوم بتعيين [-1 ، 1] من Z في مساحة NDC إلى [قريب ، بعيد] في مساحة النافذة.

تلك هي "القواعد"

نصائح أخرى

أنت تستخدم glClearDepth (1.0f) ؛ glEnable (GL_DEPTH_TEST) ، glDepthFunc (GL_LEQUAL) ؛

عمق المخزن المؤقت له قيمة بين 0 و 1 (أقصى عمق) ، استخدم GL_LEQUAL مما يعني أن كل شيء سينتقل إلى الشاشة لأن قيمة العمق ستكون أقل من أو تساوي 1.

لمزيد من الوضوح ، تفضل بزيارة: http://www.zeuscmd.com/tutorials/opengl/11-Depth.php

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