View Full Version : رندر جزئی در DirectX
hi.alir
دوشنبه 31 خرداد 1389, 10:23 صبح
فرض کنید که در کل 10 شی داریم. از این 10 شی 8 شی ثابت هستند.
حالا چطوری باید تو DirectX هشت شی ثابت رو رسم کرد و دیگه بهشون دست نزد و از این به بعد فقط رو 2 شی دیگه عملیات انجام بشه.
من وقتی می خوام فرم رو به روز کنم، کل device رو پاک می کنم، چی کار باید بکنم که اون ثابت ها پاک نشن و البته دوباره هم رندر نشن؟
به عبارت دیگه، 8 شی ثابت دست نخورده باقی بمونند و 2 شی غیر ثابت در هر فریم پاک بشن و بعد از نو رسم بشن.
سپول
دوشنبه 31 خرداد 1389, 13:06 عصر
اگه دوربینت حرکت نمی کنه و یک صحنه ثابت مثل بازی های Adventure ای داری، می تونی اشیاء ثابت رو اول بکشی، اون رو در یک بافر نگه داری (همراه با Depth Buffer اون).
برای اشیاء متحرک، تو هر فریم، از بافری که اول ساختی همراه با Depth استفاده می کنی، و در یک بافر جدید عمل Blend یا در شیدر عمل Blend رو انجام می دی و بافر رنگ نهایی درست می شه. چون از Depth Buffer صحنه استاتیک استفاده می کنه برای کشیدن، اشیاء هم درست در جای خودشون قرار می گیرند و روی همدیگه نمیان.
البته اگه اینجوری هست کلاً بهتره که صحنه ثابت همراه با Depth Buffer اش رو از قبل (یا توی نرم افزاری مثل max) رندر کنی و در زمان بازی اون رو لود کنی
hi.alir
دوشنبه 31 خرداد 1389, 16:24 عصر
نه در واقع. من مسئله رو یکم ساده تر کردم. اصلش اینه:
10 تا شی داریم که بعضی از اشیا تو بعضی از فریم ها تغییر نمی کنند. حالا مثلا داریم فریم رو رندر می کنیم شی ای که تغییر نکرده رو دوباره رندر نکنیم. حالا مگه حتما باید کل بافر رو پاک کنیم؟ نمیشه مقداریش رو پاک کرد و مقداریش سر جاش بمونه؟
دوربین حرکت نمی کنه و اشیا هم رو ی هم نمی افتند.
سپول
دوشنبه 31 خرداد 1389, 16:55 عصر
ببین اگه منظورت دقیقاً یک چیزیه مثل بازی های adventure ای که صحنه معمولاً ثابت هست و یک سری شیء متحرک هست اون وسط، روش کار همون شکلیه که تو پست بالا گفتم.
اگه اشیاء استاتیک معلوم نیست، یعنی در هر فریم هر کدوم از object ها می تونن متحرک هم باشن، بهتره که خودت رو به زحمت نندازی و کل صحنه رو هر فریم بکشی، چون فقط کارت سخت می شه، با Scissor Rect و Stencil می شه بخش هایی از بافر رو غیر فعال کرد، اما فقط در Pixel Pipeline تاثیر داره و کلا کار احمقانه ای هست برای یه همچین صحنه ای.
یک کار دیگه هم می تونی انجام بدی، اگر اشیاء استاتیک صحنه ممکنه تکون بخورن، اون روشی که تو پست بالا گفتم رو می شه به کار ببری، به شرطی که یک Dirty Flag ای چیزی برای اشیاء استاتیک بگذاری که در صورتی که تکون خورد و احتیاج به دوباره کشیدن بود، بافر رنگ و عمق (Depth Buffer) رو دوباره Clear کنه و از نو بکشه، در واقع اینجوری فقط در جاهایی که تغییری تو اشیاء استاتیک بوجود بیاد بافر عمق و رنگ update می شه.
khorzu
پنج شنبه 03 تیر 1389, 21:33 عصر
با پارامتر pRects می تونید فقط یک یاچند بخش از اسکرین پاک کنید . البته این برای صحنه های دو بعدی بدرد می خوره . در این حالت با استرچ رکت می شه رو بک بافر پیکسل کپی کنید . و توی پرزنت هم همین رکت رو پاس کنید .
HRESULT IDirect3DDevice9::Clear( DWORD Count, CONST D3DRECT * pRects, DWORD Flags, D3DCOLOR Color, float Z, DWORD Stencil );
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.