我有一種具體的問題。SlimDX9 - 具有RenderToSurface的Device.Reset
我一直在嘗試重置窗口調整大小後更改分辨率的SlimDX9設備。一切都在Pool.Managed,沒有字體,沒有Stateblocks,一切正常,但一個紋理+表面+ RenderToSurface組合。我需要將紋理作爲着色器的renderTarget,稍後進行後處理,所以我需要將紋理調整爲客戶端大小以及後置緩衝區的大小。
我創建這樣的組合:
rtTexture = new Texture(this.Device, this.owner.ClientSize.Width, this.owner.ClientSize.Height, 1, Usage.RenderTarget, Format.A8R8G8B8, Pool.Default);
rtSurface = rtTexture.GetSurfaceLevel(0);
rtHelper = new RenderToSurface(this.Device, this.owner.ClientSize.Width, this.owner.ClientSize.Height, Format.A8R8G8B8, Format.D24S8);
當窗口大小,我做
rtTexture.Dispose();
rtSurface.Dispose();
,我都試過
rtHelper.OnLostDevice();
和
rtHelper.Dispose();
當然,在Device.Reset(getParameters())之後重新創建資源/調用rtHelper.OnResetDevice(),兩者都不起作用。我嘗試了使用Dispose()和OnDeviceLost()的每種組合。
unsuccessfull復位,並且通常InvalidCall後,我得到這個消息
All user created D3DPOOL_DEFAULT surfaces must be freed before ResetEx can succeed. ResetEx Fails.
所以我PIXed的應用,並發現,無論是質地也不表面被佈置(存在「never」中的銷燬列)DESPITE的事實是,對這兩個對象顯式調用.Dispose(),並且在Device.Reset()之前IsDisposed爲true。
刪除組合使復位很好。問題出在RenderToSurface重置和/或紋理+表面的某處。
我這樣使用RenderToSurface:
rtHelper.BeginScene(rtSurface, new Viewport(0, 0, this.owner.ClientSize.Width, this.owner.ClientSize.Height));
{
Device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, FogColor, 1, 0);
terrainEffect.BeginPass(0);
RenderTiles();
terrainEffect.EndPass();
}
rtHelper.EndScene(Filter.None);
它甚至有可能?這是SlimDX中的錯誤嗎?我能做什麼? 我可以以某種方式訪問非託管資源,並手動銷燬它們嗎?
請幫忙,我不知道下一步該怎麼做。我非常感謝對此的任何迴應。謝謝。
編輯:我試着去各地RenderToSurface和使用Device.get/SetRenderTarget方法()和問題仍然存在,表面和紋理不被Device.Reset之前的Dispose()(已毀)。