View Full Version : سوال: مشکل transparency و depth buffer در opengl
SAASTN
چهارشنبه 26 اسفند 1388, 00:19 صبح
سلام
در ابتدا بگم که مشکل من در طراحی و ساخت بازی نیست ولی فکر کنم همین جا باید سوالمو بپرسم.
من یک کامپوننت بر پایه opengl نوشتم که توی اون بتونم اجزای تشکیل دهنده یک ساختمون نمایش بدم:
http://www.rayansazeh.com/userimages/SazehNegar-Screenshot.gif
حالا مسئله اینه که وقتی می خوام چند تا از لایه های تصویر رو با اعمال شفافیت بکشم مجبورم بافر عمق رو غیر فعال کنم. در صورتی که هنوز بهش احتیاج دارم. هم برای اینکه توی فضایی که کار می کنم اشیاء امکان تداخل دارند و هم اینکه با فرض اینکه از تداخل هم صرف نظر کنیم در شرایطی که بیش از دو شیئ روی هم باشند یا میزان شفافیت مقداری غیر از 50% داشته باشه، در تصویر نهایی تلفیق رنگ ها درست اعمال نمی شه.
حالا باید چکار کنم؟؟
ضمنا من خیلی توی این زمینه حرفه ای نیستم، اگر لطف کنید و کمی با حوصله تر پاسخ بدید ممنون می شم.
pswin.pooya
جمعه 06 فروردین 1389, 20:13 عصر
1. بافر عمق رو غیر فعال نکن.
2. اشیاء رو به ترتیب دوری از دوربین رسم کن.
SAASTN
دوشنبه 09 فروردین 1389, 19:55 عصر
1. بافر عمق رو غیر فعال نکن.
2. اشیاء رو به ترتیب دوری از دوربین رسم کن.
ممنون ولی چطور اشیائم رو به ترتیب عمق مرتب کنم؟ زاویه دوربین و موقعیت اشیاء متغیره و از اون مهمتر اینکه همونطور که قبلا هم گفتم اشیائم ممکنه با هم تداخل داشته باشند. یعنی عمقشون با هم اشتراک داره و اساسا نمیشه گفت که بین دو شیئ متقاطع کدوم توی عمق بیشتری هست و باید اول ترسیم بشه.
ضمنا چون اشیائم از نظر بعضی ویژگی ها با هم دسته بندی میشن (مثلا یک گروه شفاف هستند، یک گروه بدون تآثیرات نوری ترسیم می شن و ...) من از لایه بندی استفاده کردم. و صفات اشاره شده رو به لایه ها اختصاص دادم. حالا اگر بخوام ترتیب ترسیم اشیاء رو به هم بزنم (یعنی مثلا اول یک شیئ از لایه اول رو ترسیم کنم بعد یک شیئ از لایه دوم و بعد دوباره یک شیئ از لایه اول رو) مجبورم کد های مربوط به فعال و غیر فعال کردن مشخصات مورد اشاره رو بجای این که قبل از ترسیم هر گروه از اشیا هم نوع قرار بدم، اون ها رو قبل از ترسیم هر شیئ انجام بدم که کار ترسیم رو خیلی کند تر می کنه.:گریه:
pswin.pooya
چهارشنبه 11 فروردین 1389, 00:19 صبح
این مساله کاملا مربوط scene managerت هستش. یعنی اگر یه برنامه ای داری می نویسی که قرار یه کار پیچیده رو انجام بده حتما باید یک مدیر صحنه هم براش طراحی کنی.
اولش باید هر چیزی جداگانه ای رو به صورت یک نود صحنه در نظر بگیری بعدش نودها رو هر دفعه قبل از رسم فاصلشون رو با دوربین محاصبه کنی بعد از اون به ترتیب دوری رسمشون کنی.
برای اینکار یکسری محاسبات ریاضی و یک سری محاسبات گرافیکی لازم هستش مثلا باید بتونی ماتریس دوربین رو بدست بیاری و یا ماتریس نمامدل هر شیت رو داشته باشی. کلا برای اینکه محاسبات دقیقی داشته باشی باید استفاده از glTransalte و glRotate و ... رو کنار بذاری و تمام ماتریس ها رو خودت بسازی.
SAASTN
چهارشنبه 11 فروردین 1389, 21:58 عصر
این مساله کاملا مربوط scene managerت هستش.
ممکنه بیشتر در موردش توضیح بدین؟ توی این سایت گشتم ولی چیزی درموردش پیدا نکردم.
اولش باید هر چیزی جداگانه ای رو به صورت یک نود صحنه در نظر بگیری بعدش نودها رو هر دفعه قبل از رسم فاصلشون رو با دوربین محاصبه کنی بعد از اون به ترتیب دوری رسمشون کنی.
برای پیدا کردن فاصله باید دو نقطه داشته باشیم یعنی من باید هرشیئ رو با یک نقطه متناظر کنم که در مورد اشیائ متداخل کمکی نمی کنه. جدا از اون انجام این پردازش هربار که دوربین یا یکی از اشیائ جابجا میشه سربار سنگینیه. سربار کنار گذاشتن لایه بندی هم به قوت خوش باقیه.
برای اینکار یکسری محاسبات ریاضی و یک سری محاسبات گرافیکی
آیا یک رفرنس جامع در مورد محاسبات فضایی و سه بعدی می شناسید؟ خیلی گشتم ولی چیز بدردبخوری پیدا نکردم.
کلا برای اینکه محاسبات دقیقی داشته باشی باید استفاده از glTransalte و glRotate و ... رو کنار بذاری و تمام ماتریس ها رو خودت بسازی.
این که همش شد CPU پس کارت گرافیک این وسط چکارست؟
سوال: DirectX هم این مشکل رو با شفافیت داره؟ یعنی اونجا هم اگر تلفیق رنگ داشته باشیم باید بافر عمق رو غیر فعال کنیم؟
pswin.pooya
پنج شنبه 12 فروردین 1389, 01:51 صبح
سلام
کلا این مشکل وجود داره و مربوط به دایرکت و یا OpenGL نیستش. موتورهای بزرگ هم مثل OGRE هم خودشونین مرتب سازی رو انجام میدن.
کارت گرافیکی مسئول رسم صحنه هستش نه مدیریت اون و تازه این رو هم باید اضافه کنم که خود دستورهای glTranslate هم Cpu side کار میکنه. هر مقدار محاسبات GPU رو کم کنی و اونها رو CPU بدی برنامت سریعتر و بهتر عمل میکنه.
تقریبا تمامی کتابهای گرافیک اصول ریاضی رو شرح دادن ولی بهتره به کتاب shaders for game programming and artists مراجعه کنی که توی اون یه مقدار ریاضیاتش رو بهتر گفته کلا باید بچسبی به سایتهای خارجی مثل gamedev.net او از اونها سوالات رو بپرسی. البته سپول و کوچول هم ریاضیاتشو خوب میدونن و میتونن بهت کمک زیادی بکنن.
در مورد scene manager هم اگر روی نت بگردی مطلب زیاد پیدا میکنی. یه نمونه خیلی خوب هم موتور کوچول یعنی KGE هستش که به خاطر ساده بودنش میتونه کمک خیلی زیادی مخصوصا تو بحث ماتریسها و مدیر صحنه بهت بکنه. دو فصل آخر کتاب More OpenGL game programming در مورد همین موضوع صحبت کرده و به انواع مدیر صحنه اشاره کرده.
SAASTN
پنج شنبه 12 فروردین 1389, 15:09 عصر
تازه این رو هم باید اضافه کنم که خود دستورهای glTranslate هم Cpu side کار میکنه
نمی دونستم! :متفکر:
سپول و کوچول
از کاربرای این سایت هستند؟ اگر خیلی بیربط پرسیدم نخندیا. قبلا که گفتم توی این زمینه خیلی حرفه ای نیستم.
یک مشکل عمده من با نت اینه که تمام مطالب با هدف ساخت بازی بیان شده و یکم از خواسته های من فاصله داره. شما توی 3dmax کارگردان هستی و دور موضوعت میچرخی ولی توی بازیها شما بازیگر هستی و این جهانه که دورت می چرخه. کارمن شبیه به 3DMaxه. (اون مکعب کوچیکه رو گوشه عکس دیدی؟ پدرم در اومد تا درش اوردم:لبخند:)
ضمنا اگه نیم نگاهی هم به مشکله دیگم داشته باشی ممنون می شم:
http://barnamenevis.org/forum/showthread.php?t=210713
pswin.pooya
جمعه 13 فروردین 1389, 11:23 صبح
بله هر دو داخل سایت فعالیت میکنن و این هم سایتهای تخصصی اونها:
KGE: (موتور کوچول )
http://kocholgp.blogspot.com/
hmrengine: (موتور سپول)
http://hmrengine.com/
سپول
یک شنبه 15 فروردین 1389, 17:30 عصر
این یکی از بزرگترین مشکل ها توی گرافیک کامپیوتری هست
اگه مش ها و مثلث ها بد فرم تداخل دارند و می خوای حتماً alpha transparency داشته باشی ... چند تا راه هست .
آسونترینش که pswin گفت مرتب کردن مش ها به ترتیب از عقب به جلو هست و اینکه ZBufferWrite رو Disable کنی و ZBuffer رو Enable کنی. منتهی این روش فقط تو جاهایی کار می کنه که تداخل عمیق نباشه و مش ها در هم دیگه درگیر نباشند.
یک راه دیگه اینه که از کل صحنه یک bsp tree بسازی و اون bsp رو رندر کنی که کار آسونی نیست. ساختن کامپایلر Bsp کار موتور نویسای نسبتاً حرفه ای هست ولی رندر کردنش سریع و نسبتاً راحت هست. می تونی از کامپایلر Bsp موتور quake3 استفاده کنی (qradiant).
یک راه دیگه هم depth peeling با استفاده از shader ها و بافر های عمیق (Deep buffers) که باز هم لازم به استفاده حرفه ای از شیدر ها هست. و سرعت پایینی هم داره.
مقاله راجع به Depth peeling :
http://developer.download.nvidia.com/SDK/10/opengl/src/dual_depth_peeling/doc/DualDepthPeeling.pdf
مقاله راجع به Bsp trees :
http://www.devmaster.net/articles/bsp-trees/
SAASTN
دوشنبه 16 فروردین 1389, 23:48 عصر
با تشکر فراوان از pswin و سپول.
با توجه به مطالبی که فرمودید و یه بررسی اجمالی اون دوتا مقاله، احتمالا انجام این کار بصورت کاملا درست کار سنگینیه. ما هم کار اصلی برناممون چیز دیگست و نمی تونیم خیلی روی این کامپوننت زمان و نیرو صرف کنیم. پس احتمالا باید بریم سمت همون مرتب کردن اشیا. حالا مسئله ای که هست نحوه محاسبه عمق اشیاست.
یه صحبتی که با همکارم کردیم به این نتیجه رسیدیم که یکبار کل صحنه رو توی مد select ترسیم کنیم و با عمقی که خود gl بهمون میده کار رو پیش ببریم. که باعث میشه توی زمانهایی که زاویه دوربین یا چینش اشیا تغییر می کنه کل صحنه دوبار ترسیم بشه. البته ما خیلی توی محل اشیا جابجایی نداریم ولی ابزارهای pan و rotate و zoom زیاد استفاده می شن. آیا انجام این کار درست هست یا بهتره ماتریس projection رو تشکیل بدیم و خودمون عمق رو محاسبه کنیم؟ اگه خودمون باید عمق رو محاسبه کنیم هم لطفا در موردش راهنمایی کنید.
ممنون
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.