ورود

View Full Version : شفافیت یک پیکسل



1485159
جمعه 27 فروردین 1389, 21:29 عصر
سلام
مثلا من یه پیکسل رو روی مختصات 2 بعدی 10 و 10 رسم کردم، حالا میخوام یه پیکسل با یه رنگ دیگه در همان مختصات رسم کنم به طوری که رنگ 2 پیکسل باهم مخلوط بشن!(شفافیت) و بشه این مقدار شفافیت رو تغییر داد!
ممنون.

pswin.pooya
شنبه 28 فروردین 1389, 00:42 صبح
برای اینکار باید از دستور glBlend استفاده کنید. برای آمیختگی در OpenGL باید در ابتدا اون رو فعال کنی:


glEnable(GL_BLEND);

سپس باید تابع آمیختگی رو مشخص کنی:(اکثرا از این استفاده میکنن)

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);


بعدش میتونی رنگ هر پیکسل رو مشخص کنی:

glColor4f(1,0,0,0.5)

اینجا 0.5 میزان کدری پیکسل رو مشخص میکنه. اگر از GL_RGBA داخل فرمت تکسچرها استفاده کنی. میزان کدری رنگ برابر با کانال آلفا تکسچر میشه. اگر کدری برابر با یک باشه رنگ با رنگ پشتش ترکیب نمیشه.

1485159
شنبه 28 فروردین 1389, 10:56 صبح
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
این پارامتر ها یعنی چی؟
اصلا خود تابع چیکار میکنه؟
ممنون.

1485159
پنج شنبه 13 خرداد 1389, 22:42 عصر
اگه ممکنه در مورد:

این پارامتر ها یعنی چی؟
اصلا خود تابع چیکار میکنه؟
ممنون.
هم توضیح بدین.

SeganX
شنبه 15 خرداد 1389, 01:23 صبح
سیستم های استاندارد مخلوط کردن رنگ پیکسل ها معمولا از تابع ساده جمع استفاده می کنن. البته تو میتونی تابع رو عوض کنی و تغییر بدی اما استانداردش اینه.
فرض کن که رنگ پیکسل زمینه باشه p1 و رنگی که می خوای باهاش مخلوط کنی باشه p2.
در این صورت رنگ پیکسل نهایی میشه مثلا


p = (p1 + p2)/2
این شکل کاملا خلاصه شدس. ضرایب دیگری هم دخیل هستن که اونها رو 1 فرض کردیم. فراموش نکن که p و p1 و p2 همگی بردارهایی با 4 مولفه قرمز، سبز، آبی و آلفا هستند و عمل ریاضی جمع و تفرق و ضرب و تقسیم عملگرهای برداری هستند.یعنی

p2=(r2, g2, b2, a2) , p1=(r1, g1, b1, a2)
در API هایی که ما استفاده می کنیم مثلا ogl یا dx سعی شده که به برنامه نویس امکان دستکاری توی این فرمول فراهم بشه.
این توابع معمولا دوتا پارامتر می گیرن که بشون blen factor گفته میشه. این پارامترها رفتار تابع بالا رو تغییر میدن. پارامتر اول برای p1 و پارامتر دوم هم برای p2. یعنی چیزی شبیه به این

p = (b1*p1 + b2*p2)/2


مثلا در تابعی که پویا ست کرده پارامتر دوم ONE_MINUS_SRC_ALPHA هستش که میشه معادل INVSRCALPHA در dx. خوب همونطور که از اسمش پیداست یعنی b2 رو برای پیکسل دوم اینطوری ست می کنه:

b2=(1-a2,1-a2,1-a2, 1-a1)
و با ضرب b2 در p2 رفتار تابع کاملا تغییر می کنه.
این پارامترها کم نیستن و چون باهم دوبه دو ترکیب میشون نتایج خیلی زیادی میدن.

آنچه که گفتم خلاصه ای از مبحث blend کردن رنگهاست. شکی نیست که توابع blend به این سادگی ها هم نیستن.

1485159
شنبه 15 خرداد 1389, 10:35 صبح
آنچه که گفتم خلاصه ای از مبحث blend کردن رنگهاست. شکی نیست که توابع blend به این سادگی ها هم نیستن.
منبعی در این مورد معرفی میکنید؟ فارسی باشه بهتره ولی اینگلیسی هم عیب نداره.

SeganX
شنبه 15 خرداد 1389, 18:59 عصر
می تونی توی خود سایت ماکروسافت یا انویدیا یا گوگل یه سرچ بزنی. اما خود DX SDK مطالب خوبی در این مورد نوشته. البته توی نسخه های جدیدش مطالب پایه رو حذف کرده. مثلا خیلی از مباحث اولیه که توی SDK2005 بود رو دیگه توی SDK2009 حذف کرده.

pswin.pooya
یک شنبه 16 خرداد 1389, 17:37 عصر
فصل 4 یا 5 ( تحت عنوان blending) داخل کتاب begnning OpenGL game programming در این مورد توضیح داده. همچنین داخل جزوه دکتر مهری هم هستش

1485159
یک شنبه 16 خرداد 1389, 18:15 عصر
جزوه دکتر مهری
میشه دانلودش کرد؟؟

pswin.pooya
جمعه 21 خرداد 1389, 17:43 عصر
میشه دانلودش کرد؟؟

www.opengl.persiangig.com

1485159
سه شنبه 25 خرداد 1389, 13:56 عصر
همچنین داخل جزوه دکتر مهری هم هستش
من که چیزی توی جزوه پیدا نکردم.

pswin.pooya
سه شنبه 25 خرداد 1389, 14:24 عصر
شرمنده، سر کلاس توی lectureهای دکتر آمیختگی بودش اما توی جزوه قرارش ندادن.

فصل پنج صفحه 121 (داخل pdf صفحه 144) کتاب begining OpenGL game profgramming (ویرایش اول) در مورد آمیختگی (blending) صحبت کرده. و در ویرایش دوم این کتاب داخل فصل هشت صفحه 198 (داخل pdf صفحه 223) در این مورد صحبت کرده.