الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

الBlending في OpenGL .امثلة ومحاولات

مغلق
بدأه Abdullah.Alshammeri في 7 فبراير 2006 · 4 رد · 2,909 مشاهدة · في OpenGL
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم :

اولا عندي شيء احب اقوله :

1- المعلومات التي ساذكرها ان شاء الله .. استفدتها من عدد من المذكرات والكتب .. يعني تستطيع الرجوع الى تلك المذكرات والاستفادة منها بشكل افضل .. اذا كانت لغتك الانقليزية جيدة .

2- الموضوع كله محاولات .. يعني قاعد اتعلم .. وانا اكتب هذا الموضوع . . . اعتبروا هذا الموضوع ( مسودة عمل) :rolleyes:

==========-

من المواضيع الجميلة في OPENGL موضوع Blending ,,, مزج الالوان ..

ماذا سنستفيد من Blending ,,

لو لم يكن هناك فائدة الا الشفافية لكان كافيا ..

اذا اردت ان تعرف تطبيقات الBlending فما عليك الا تشغيل برنامج الفوتوشوب ..

وقم بصنع طبقتين two layers .. وغير في ال Blenging للطبقة العلوية ولاحظ التأثيرات

الدالة التي سنستخدمها هي glBlendFunc

* القناة الفا ... هي الشفافية ... اذا كانت قيمتها 1 .. هذا يعني لا يوجد شفافية .

* يجب تفعيل الBlending عن طريق

glEnable(GL_BLEND)

* اذا اردنا استخدام الblending فامامنا مهمتان :

الاولى : تحديد نوع المزج(ان صح التعبير) للبيكسل المخزن .. المخزن حاليا في البفر

وتسمى destination pixel

الثانية : تحديد نوع المزج .. للبيكسل الهدف .. الذي نريد مزجه مع البيكسل الاساسي source pixel

بالتالي سينتج لدينا بيكسل مهجن .. :rolleyes: ,, من بيكسلين ...

لاحظ الدالة التالية

void glBlendFunc( GLenum sfactor, GLenum dfactor );

البارمترين يأخذان احد الثوابت التالية :

  GL_ZERO                           
  GL_ONE                            
  GL_SRC_COLOR                      
  GL_ONE_MINUS_SRC_COLOR            
  GL_SRC_ALPHA                      
  GL_ONE_MINUS_SRC_ALPHA            
  GL_DST_ALPHA                      
  GL_ONE_MINUS_DST_ALPHA            
  GL_DST_COLOR                      
  GL_ONE_MINUS_DST_COLOR            
  GL_SRC_ALPHA_SATURATE

اختصارا للوقت وحتى يكون هناك استيعاب اكثر ,,,

في المرفقات مثل شامل لهذا الموضوع اعتقد انك ستفهمه بكل تأكيد ..

التحكم :

الاسهم .

المثال بالWIN API وليس glut

ALL_Blending.zip

تم تعديل هذه المشاركة بواسطة الشمري في 7 فبراير 2006 في 13:51

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#2

التطبيق الاول :

سأحاول أن اتكلم عن هذا الموضوع بشيء من التفصيل .

للمعلومية .. وانا قاعد اكتب هذا الموضوع ... قاعد احاول افهم .. ممكن يصير فيه اخطأء (h) ’

عندنا ثلاث مهمات .

بيكسل رقم واحد

بيكسل رقم اثنين

اولا .. نجري عمليات على البيكسل رقم واحد .. لينتج لون محدد .. مثلا

glColor4f(0,0,0,1);

انتبه للدالة السابقة .. هي التي سنستخدمها مع الBlenging . . اربع قنوات .

ثم مجري عمليات على البيكسل رقم اثنين .. لينتج لون معين مثلا

glColor4f(1,2,0,1)

الان نجمع قيمة اللونين

glColor3f(1,2,0);

بدون قناة الفا ... وهو البيكسل المهجن : ) ,,,

باللون الاصفر .

واحد

	glEnable(GL_BLEND);
	glBlendFunc( GL_ONE, GL_ONE );

فعلنا BLENDING .

ثم اخترنا نوع المزج ... رجاااااءاً ركز معي .

البارمتر الاول هو source pixel.

يعني نجري عملياتنا على البيكسل الاول ..

العملية هنا هي GL_ONE وتعني اننا سنضرب كل قناة بالرقم واحد .

نفرض البيكسل لونه اخضر .

	glColor4f(0,1,0,1);

نضرب كل قناة في واحد

	glColor4f( 1*0 , 1*1 , 1*0 ,1);

النتيجة

glColor4f(0,1,0,1);

البيكسل الثاني :

احمر:

	glColor4f(1,0,0,1);

نضرب كل بيكسل في واحد والنتيجة هي ايضا احمر .

نجمع النتيجتين

glColor4f(0,1,0,1) + glColor4f(1,0,0,1) = glColor3f(1,1,0);

وهو اللون الاصفر ///

لاحظ :

/*1*/	void render(void) 
/*2*/	{
/*3*/  glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

/*4*/	/***********************************/
/*5*/  glEnable(GL_BLEND);
/*6*/  glBlendFunc( GL_ONE, GL_ONE );
/*7*/	
/*8*/ 	 glColor4f(1,0,0,1);

/*9*/  glLoadIdentity();        
/*10*/  glTranslatef(-1,-1, -22.0f );
/*11*/   	 glBegin(GL_QUADS); 
/*12*/    glVertex2f(-4, 0 );
/*13*/    glVertex2f( 4, 0 );
/*14*/ 	 glVertex2f( 4,  3 );
/*15*/ 	 glVertex2f(-4,  3 );
/*16*/  glEnd();

/***********************************/

/*17*/  glColor4f(0,1,0,1);
/*18*/	
/*19*/  glLoadIdentity();        
/*20*/  glTranslatef(1 ,1, -22.0f );
/*21*/	
/*22*/   	 glBegin(GL_QUADS); 
/*23*/    glVertex2f(-4, 0 );
/*24*/    glVertex2f( 4, 0 );
/*25*/ 	 glVertex2f( 4,  3 );
/*26*/ 	 glVertex2f(-4,  3 );
/*27*/  glEnd();
/*28*/	/***********************************/

/*29*/	}

والنتيجة ..

5b1ddd2089.jpg

تطبيقات متنوعة :

glBlendFunc(GL_SRC_ALPHA, GL_ONE);

نفرض اننا رسمنا نربع لونه احمر ... نضربه في واحد والنتيجة نفسها (GL_ONE)

نفرض رسمنا المربع الثاني الاخضر .. نضربه في قيمة قناة الفا ...

مثلا

glColor4f(0,1,0,0.5);

نضربه في قيمة الفا .. وهي 0.5 النتيجة

glColor4f(0,0.5,0);

نجمع اللون الاحمر .. مع اللون الاخضر بعد اجراء عملية الضرب .

glColor4f(0,0.5,0) + glColor4f(1,0 ,0) = glColor4f(1,0.5,0)

وهو لون برتقالي تقريبا ..

أي ان المربع الاخضر اذا صار فوق المربع الاحمر .. سيظهر وكأنه شفاف ,,, ولكن سينتج لون جديد ..

تطبيق ثالث منظم ::: نعم منظم ... لاني احس كلامي السابق حشو بدون فائدة :

الدالة :

void glBlendFunc( GLenum sfactor, GLenum dfactor );

البارمتر الاول هو قيمة .. سنضربها في لون شكل رقم 2

البارمرتر الثاني هو لون سنضربها في لون الشكل رقم 1

شكل رقم واحد

	glColor4f(1,0,0,1);

	glLoadIdentity();        
	glTranslatef(-1,-1, -22.0f );
    glBegin(GL_QUADS); 
 	 glVertex2f(-4, 0 );
 	 glVertex2f( 4, 0 );
  glVertex2f( 4,  3 );
  glVertex2f(-4,  3 );
	glEnd();

شكل رقم اثنين

	glColor4f(0,1,0,0.5);

	glLoadIdentity();        
	glTranslatef(1 ,1, -22.0f );

    glBegin(GL_QUADS); 
 	 glVertex2f(-4, 0 );
 	 glVertex2f( 4, 0 );
  glVertex2f( 4,  3 );
  glVertex2f(-4,  3 );
	glEnd();

لاحظ ان .. شكل رقم اثنين سيعلو الشكل رقم واحد .. والشكل رقم ثلاثة سيعلو الشكل رقم اثنين و الشكل رقم واحد .

وان الشكل رقم تسع وخمسين .. سيعلو الشكل رقم ثمان وخمسون وسبع وخمسون وخمس خمسون وانت نازل .

يعني البارمتر الاول في الدالة glBlendFunc تهتم بالتعامل مع الشكل العلوي .

اما البارمتر الثاني فيهتم بالتعامل مع الشكل الاسفل من العلوي . ...

طيب لو صرنا في عالم الثري دي ...

الجواب .. لن نستخدم الblending في عالم الثري دي ..

سوف نلغي تفعيل الZ BUFFER

طبعا ... رح نتناقش في هذا الموضوع لاحقا .

و افلقني .. اذا فهمت شيء .. لاني دخت , :wacko:

حتى الان تعلمنا كيف نستخدم .. GL_SRC_ALPHA و GL_ONE

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

تطبيق :

	


/***********************************/
	glEnable(GL_BLEND);
	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
	glColor4f(1,0,0,1);

	glLoadIdentity();        
	glTranslatef(-1,-1, -22.0f );
    glBegin(GL_QUADS); 
 	 glVertex2f(-4, 0 );
 	 glVertex2f( 4, 0 );
  glVertex2f( 4,  3 );
  glVertex2f(-4,  3 );
	glEnd();

/***********************************/

	glColor4f(0,1,0,0.5);

	glLoadIdentity();        
	glTranslatef(1 ,1, -22.0f );

    glBegin(GL_QUADS); 
 	 glVertex2f(-4, 0 );
 	 glVertex2f( 4, 0 );
  glVertex2f( 4,  3 );
  glVertex2f(-4,  3 );
	glEnd();
/***********************************/

==============

وهذا اخر :

glBlendFunc(GL_SRC_ALPHA, GL_SRC_ALPHA);

GL_SRC_ALPHA × glColor4f(0,1,0,0.5) = glColor3f (0,0.5,0)

كما تعلمنا سابقا ..

ونفس الامر مع البارمتر الثاني ..

GL_SRC_ALPHA × glColor4f(1,0,0,0.5) = glColor3f (0.5, 0,0)

النتيجة

glColor3f (0,0.5,0)+ glColor3f (0.5, 0,0)=glColor3f (0.5, 0.5,0)

وهو ما يبدو شفاف ..

خلاصة الكلام أن هذا التدقيق غير مفيد أبدا : ) ,’’

الزبدة :

هناك تطبيقين مشهورين للBlending

الاول هو الشفافية .. هكذا .

	glColor4f(1.0f,1.0f,1.0f,0.5f);  
	glBlendFunc(GL_SRC_ALPHA,GL_ONE);

بالتالي أي شكل سيرسم سيكون شفافا على الذي قبله على ما اعتقد : ) ,,,

وايضا ستزول الخلفية السوداء من الصورة .

الثاني

ازالة الخلفية السوداء من الصورة ..

	glBlendFunc(GL_SRC_ALPHA_SATURATE,GL_ONE);

ولن يكون شفافا

الثالث :

شفاف .. ولن يزيل اللون الاسود من الصورة .

	glColor4f(1.0f,1.0f,1.0f,0.4);  
	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) ;

طبعا يوجد بعض التطبيقات الاخرى مثل عكس الالوان ..

فقط جرب وستفهم .

الموضوع مثل ماقلنا مليء بالاخطاء بكل تأكيد .. لكن حاولت اني اخرج بنتيجة ..

بقي ان نقول ..

لاتنسى تلغي تفعيل الزد بفر ...

	glDisable(GL_DEPTH_TEST );

اذا فعلت BLENDING

واذا الغيت تفعيل الBLENDING ... ترجع وتفعل DEPTH_TEST

ايضا ..

استخدام BLENDING مع المجسمات الثلاثية الابعاد اعتقد يحتاج كم تلميحة ..

حسب ما رأيت في بعض الامثلة ..

على العموم كان الهدف من هذا الموضوع كسر حاجز الBLENDING ..

لعله في موضوع قادم نغطي الجوانب الاخرى بحول الله وقوته .

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#3

السلام عليكم ..

بصراحة اخي انت تعرف انو انا لسا مبتدئ يعني ما كشي فاهم ..

المهم ..

انا الي لفت نظري شغلة .. وهي

انت قلت هذا البرنامج ب win api

انا الي لفت نظري ان هذا البرنامج صغير مقارنة بالبرنامج الاول للأخ علي رحمه الله والي كان عبارة عن برنامج لتكوين نافذة . ليه ؟؟!!

كما لاحظتُ استخدام الفايلات ..

هل هذه فايلات السي (يعني تخضع لنفس القواعد) ام هي فايلات خاصة ب opengl ، وهل من الممكن استخدام فايلات لغة سي ++

اعذرني على هاي الاسئلة لانها ليست في صلب الموضوع ..

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#4

شوف يا اخي .. من الممكن أن تجد كود يستخدم win api .. وعدد سطوره 200 سطر .. لا نشاء نافذة ..

لانه رح يتأكد من كل خطوة .. لذك تجد في دروس nehe .. جمل شرطيية كثيرة للتاكد .

if( glCreate...(

do something ..

وايضا ستجد أن nehe .. اضاف بعض الدوال التي تجعل النافذة full screen .. بينما انا اختصرت هذه المهمة ..

ايضا تجد nehe .. يملا جميع التركيبات structure بالبيانات .. بينما في الكود الذي رأيت .. اكتفيت بالقيم الافتراضية في الغالب .

اخي .. opengl مرنة .. وwin api مرنة .. كل شخص يسوي فيها ما يريد .. المهم تصنع نافذة ..

اما استخدام files التابعة للسي .. فهذا شيء طبيعي ..

تحميل مجسم من ثري داكس مثلا ... يبدأ بـ :

فتح هذه الملف ..

والقراءة منه ..

فلا يوجد شيء خاص بـ Opengl .. opengl مجرد مكتبة جرافكس .. اي شيء يبدأ بـ gl او glu فهذه دوال opengl .

تم تعديل هذه المشاركة بواسطة الشمري في 20 فبراير 2006 في 22:51

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

هذا الموضوع مغلق.

مواضيع مشابهة