برنامج OpenGL:كيفية القيام بـ RGBA-> RGBA blitting دون تغيير الوجهة ألفا

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

  •  02-07-2019
  •  | 
  •  

سؤال

لدي نسيج OpenGL RGBA وقمت بمسح نسيج RGBA آخر عليه باستخدام كائن مخزن الإطارات المؤقت.المشكلة هي أنه إذا استخدمت وظائف المزج المعتادة معglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA),يؤدي الوميض الناتج إلى تغيير نسيج الوجهة ألفا، مما يجعله شفافًا قليلاً للأماكن التي كانت فيها ألفا سابقًا 1.أود ألا يتغير سطح الوجهة ألفا أبدًا، ولكن بخلاف ذلك يجب أن يكون التأثير على قيم RGB كما هو تمامًا GL_SRC_ALPHA و GL_ONE_MINUS_SRC_ALPHA.لذلك يجب أن تكون وظائف عامل المزج (As,As,As,0) و (1-As,1-As,1-As,1).كيف يمكنني تحقيق ذلك؟

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

المحلول

يمكنك ضبط أوضاع المزج لـ RGB وalpha على معادلات مختلفة:

void glBlendFuncSeparate(
    GLenum srcRGB, 
    GLenum dstRGB, 
    GLenum srcAlpha, 
    GLenum dstAlpha);

في حالتك تريد استخدام التعدادات التالية:

  glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ZERO, GL_ONE);

لاحظ أنه قد يتعين عليك استيراد وظيفة glBlendFuncSeparate كملحق.من الآمن القيام بذلك بالرغم من ذلك.الوظيفة موجودة لفترة طويلة جدًا.إنه جزء من OpenGL 1.4

هناك طريقة أخرى لفعل الشيء نفسه وهي تعطيل الكتابة إلى قناة ألفا باستخدام glColorMask:

void glColorMask( GLboolean red,
                  GLboolean green,
                  GLboolean blue,
                  GLboolean alpha )

هو - هي استطاع يكون أبطأ بكثير من glBlendFuncSeparate لأن برامج تشغيل OpenGL تعمل على تحسين الوظائف الأكثر استخدامًا وglColorMask هي إحدى وظائف OpenGL التي نادرًا ما تستخدم.

إذا لم تكن محظوظًا، فقد ينتهي بك الأمر إلى محاكاة عرض البرامج عن طريق استدعاء وظائف غريبة :-)

نصائح أخرى

ربما يمكنك استخدامها glColorMask()؟يتيح لك تمكين/تعطيل الكتابة لكل مكون من مكونات الألوان الأربعة.

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