OpenGL: هل يمكنني إخفاء شظايا شفافة بالكامل من عمق العمق؟

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

سؤال

هل هناك طريقة لإخبار OpenGL بعدم كتابة عمق الشظايا الشفافة بالكامل في المخزن المؤقت للعمق؟

فقط كن متأكدًا ، أن الملمس الذي أريد تقديمه ليس شبه شفاف ؛ تبلغ قيم Alpha الخاصة بها 1.0 أو 0.0 فقط ، وأنا أستخدم مرشح GL_Nearest ، لذلك لا يتداخل أبدًا في أي قيمة بينهما.

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

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

المحلول

فقط للتوضيح: تريد شظايا مع alpha = 0.0 أن تتم كتابة كلا من colorbuffer ولا depthbuffer؟ علاوة على ذلك ، أفترض أنك تستخدم حاليًا مزجًا لإخفاء وحدات البكسل الشفافة ، لأنه وإلا فإن هذا لا ينبغي أن يكون مشكلة.

في هذه الحالة ، يمكنك ببساطة استخدام تجاهل الشظية في FragmentShader:

if( color.a<=0.0 ){
     discard;
 }

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

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

glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER,0.0f);

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

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