View Full Version : کپی کردن یک surface در حافظه پیش فرض به یک surface در Systemmemory
hi.alir
شنبه 24 مهر 1389, 20:44 عصر
چطوری باید این کار رو انجام بدم؟
SeganX
یک شنبه 25 مهر 1389, 13:36 عصر
اگه surface اصلیت از default باشه که باید دستی lock کنی و کل بافر رو مثلا با memcpy کپی کنی. اما اگه surface اصلیت از sysmem باشه از این هم می تونی استفاده کنی:
IDirect3DDevice9::UpdateSurface
اینجا پارامتر های تابع لیست شده:
http://msdn.microsoft.com/en-us/library/bb205857%28VS.85%29.aspx
hi.alir
یک شنبه 25 مهر 1389, 16:37 عصر
اخه اون surface قابل دسترسی نیست؟ Backbuffer هست :لبخند:
می خواستم BackBuffer رو تغییر بدم.
khorzu
دوشنبه 26 مهر 1389, 12:19 عصر
HRESULT IDirect3DDevice9::GetBackBuffer(
UINT iSwapChain,
UINT BackBuffer,
D3DBACKBUFFER_TYPE Type,
IDirect3DSurface9 ** ppBackBuffer
);
hi.alir
دوشنبه 26 مهر 1389, 12:45 عصر
تابع GetBackBuffer همون BackBuffer توی ( اگه اشتباه نکنم ) Graphic card هست و قابل دسترسی و تغییر دادن نیست و باید به Systemmemory انتقال داده بشه. مشکل من همین انتقاله هست.
khorzu
سه شنبه 27 مهر 1389, 11:18 صبح
تابع GetBackBuffer همون BackBuffer توی ( اگه اشتباه نکنم ) Graphic card هست و قابل دسترسی و تغییر دادن نیست و باید به Systemmemory انتقال داده بشه. مشکل من همین انتقاله هست.
تا اونجایی که من می دونم همه منابعی که داخل کارت گرافیک استفاده میشند (بافت ها ، رئوس ، ایندکس ها ، سورفیس ها و شیدر ها) با متدهایی (مثل lock) قابل دسترسی اند ؛ تنها چیزی که قابل دسترسی نیست فرونت بافره. بک بافر یک سورفیس معمولیه (با مموری پول default؟) و اگه پوینترشو داشته باشید می شه همه کار هایی رو که با بقیه سورفیس ها می کنید با اون هم کرد همچنین با SetRenderTarget (http://msdn.microsoft.com/en-us/library/bb174455(VS.85).aspx) می شه هر سورفیسی رو بک بافر قرار داد. (تکنیک ترسیم بر روی بافت هم با همین متود کار می کنه .)
با این حساب توی این مورد شما تنها راهی که وجود داره همونیه که جناب SeganX اشاره فرمودند . به طور جزئی تر شما باید یک سورفیس با فرمت و ابعاد بک بافر و مموری پول systemMemory بسازیدبعد بک بافر و این سورفیس رو لاک کنید و با memcpy کل بلاک داده بک بافر رو توی سورفیس توی RAM کپی کنید.
- می شه بگید این کار رو برای چی انجام می دید ؟
hi.alir
سه شنبه 27 مهر 1389, 12:56 عصر
تا اونجایی که من می دونم همه منابعی که داخل کارت گرافیک استفاده میشند (بافت ها ، رئوس ، ایندکس ها ، سورفیس ها و شیدر ها) با متدهایی (مثل lock) قابل دسترسی اند
من امتحان کردم.
می شه بگید این کار رو برای چی انجام می دید ؟
یک سری افکت مثل blur و ...
khorzu
چهارشنبه 28 مهر 1389, 08:49 صبح
من امتحان کردم.
من هم .http://www.pic4ever.com/images/2i8d4ao.gif
یک سری افکت مثل blur و ...
ابن جوری که کامپیوتر منفجر می شه ... چرا با سایه زن این کارو نمی کنید .
seyedof
چهارشنبه 28 مهر 1389, 22:30 عصر
سلام
راه اینکار این نیست که. باید از Render to Texture استفاده کنید. یعنی صحنه رو توی یک تکسچر رندر کنین بعد همین صحنه رو به عنوان تکسچر استفاده کنید برای اینکه روش افکتهای مورد نظر (معمولا Post Effect) ها رو انجام بدین. Lock کردن و انتقال بین حافظه گرافیک و حافظه سیستم کار بسیار کندی است و اصلا توصیه نمیشه مگر در موارد خیلی ضروری که راه حل دیگه ای هم موجود نباشه.
ممنون علی
hi.alir
پنج شنبه 29 مهر 1389, 06:41 صبح
اتفاقا خودم هم دنبال اینکار بودم.
SeganX
جمعه 30 مهر 1389, 02:02 صبح
اصلا نیازی نیست surface ها و texture هایی که واسه post استفاده می کنید رو روی sysmem بسازید . بهتر اینه که اون ها رو روی حافظه default بسازید و بعد اگر که نمی خواید از antialias استفاده کنید بهترین راه همون راهیه که آقای seyedof گفت. اما اگه می خواید از antialias استفاده کنید می تونید از این تابع استفاده کنید:
IDirect3DDevice9::StretchRect
این هم لینک توضیحاتش:
http://msdn.microsoft.com/en-us/library/bb174471%28VS.85%29.aspx
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.