protected override void OnSizeChanged( EventArgs e )
{
- // 実行時条件チェック。
+ #region " 実行時チェック。"
+ //----------------
if( null == this.デバイスリソース )
{
return; // まだ初期化されてない(ので何もしない)。
Trace.WriteLine( "最小化されました。" );
return; // 何もしない
}
-
- // 描画ターゲットを解除する。
- this.デバイスリソース.D3DDevice.ImmediateContext.OutputMerger.ResetTargets(); // 描画ターゲットの解除
-
- // サイズに依存するリソースを解放する。
- this.デバイスリソース.サイズに依存するリソースを解放する();
-
- // バックバッファのサイズを変更する。
- this.デバイスリソース.SwapChain.ResizeBuffers(
- bufferCount: 3,
- width: this.ClientSize.Width,
- height: this.ClientSize.Height,
- newFormat: SharpDX.DXGI.Format.R8G8B8A8_UNorm,
- swapChainFlags: SharpDX.DXGI.SwapChainFlags.AllowModeSwitch );
+ //----------------
+ #endregion
// サイズに依存するリソースを再作成する。
+ this.デバイスリソース.サイズに依存するリソースを解放する();
this.デバイスリソース.サイズに依存するリソースを作成する();
-
- base.OnSizeChanged( e );
}
[System.Runtime.InteropServices.DllImport( "winmm.dll" )]
public class デバイスリソース
{
public SharpDX.Size2F 設計画面サイズdpx = new SharpDX.Size2F( 640f, 480f );
- public SharpDX.Size2F 物理画面サイズpx;
+ public SharpDX.Size2F 物理画面サイズpx = new SharpDX.Size2F( 0, 0 ); // (0, 0) は、サイズ依存リソース無効の印。
public IntPtr ウィンドウハンドル = IntPtr.Zero;
+
+ public SharpDX.Vector3 カメラの位置;
+ public SharpDX.Vector3 カメラの注視点;
+ public SharpDX.Vector3 カメラの上方向;
public float 視野角 = 45f;
+
public float 不透明度 = 0.5f; // 0:透明~1:不透明
public struct ST定数バッファの転送元データ
{
}
public void サイズに依存するリソースを作成する()
{
- // バックバッファを取得
+ #region " スワップチェーンのサイズを変更する。"
+ //----------------
+ Debug.Assert( null != this.SwapChain ); // スワップチェーンは、デバイスとともに、すでに生成される。
+ this.SwapChain.ResizeBuffers(
+ bufferCount: 2,
+ width: (int) this.物理画面サイズpx.Width,
+ height: (int) this.物理画面サイズpx.Height,
+ newFormat: SharpDX.DXGI.Format.R8G8B8A8_UNorm,
+ swapChainFlags: SharpDX.DXGI.SwapChainFlags.AllowModeSwitch );
+ //----------------
+ #endregion
+
+ // 新しいサイズになったバックバッファを取得して、リソースを作成する。
using( var backBuffer = SharpDX.Direct3D11.Texture2D.FromSwapChain<SharpDX.Direct3D11.Texture2D>( this.bs_SwapChain, 0 ) )
{
#region " RenderTargetView の作成 "
}
public void サイズに依存するリソースを解放する()
{
+ // 描画ターゲットを解除する。
+ this.D3DDevice.ImmediateContext.OutputMerger.ResetTargets();
+
FDK.メディア.テクスチャ.共有リソースを解放する();
this.bs_DepthStencilView?.Dispose();
this.bs_DepthStencil?.Dispose();
this.bs_RenderTargetView?.Dispose();
+ //this.bs_SwapChain?.Dispose(); → スワップチェーンは解放しない(生成・解放はデバイスとセット)。
+
+ // (0,0)は、サイズ依存リソース無効の印。
+ this.物理画面サイズpx = new SharpDX.Size2F( 0, 0 );
}
public void D3Dデバイスが消失していれば再構築する( out bool 異常状態なのでアプリを終了せよ )
{
private SharpDX.Direct3D11.Device bs_D3DDevice = null;
private SharpDX.DXGI.SwapChain bs_SwapChain = null;
+
private SharpDX.Direct3D11.RenderTargetView bs_RenderTargetView = null;
- private SharpDX.Mathematics.Interop.RawViewportF[] bs_ViewPort = new SharpDX.Mathematics.Interop.RawViewportF[ 1 ];
private SharpDX.Direct3D11.Texture2D bs_DepthStencil = null;
private SharpDX.Direct3D11.DepthStencilView bs_DepthStencilView = null;
+
+ private SharpDX.Mathematics.Interop.RawViewportF[] bs_ViewPort = new SharpDX.Mathematics.Interop.RawViewportF[ 1 ];
private SharpDX.Direct3D11.DepthStencilState bs_DepthStencilState = null;
private SharpDX.Direct3D11.VertexShader bs_VertexShader = null;
private SharpDX.Direct3D11.PixelShader bs_PixelShader = null;