メインメニューを開く

差分

MonoGame/クラスライブラリ/RenderTargetUsage列挙体

195 バイト追加, 2020年9月15日 (火) 02:45
== 名前空間 ==
* [[MonoGame/クラスライブラリ/Microsoft.Xna.Framework.Graphics名前空間|Microsoft.Xna.Framework.Graphics名前空間]]
== 構文 ==
=== DiscardContentsの注意点 ===
GraphicsDeviceが最初から持っているレンダリングターゲット([[DirectX]]でいう[[プライマリサーフェイス]])に相当するものはDiscardContentsに設定されている。DiscardContents設定になっていると「GraphicsDevice.SetRenderTargetするたびに破棄(初期化)される」という特徴がある。この特性があるためレンダリング系APIの呼出順序を間違えると残念なことになる。DiscardContentsの欠点はGraphicsDevice<source lang="csharp">GraphicsDevice.SetRenderTargetするたびに破棄される点であり、レンダリング系APIの呼出順序を間違えると残念なことになる。SetRenderTarget(このRenderTargetは初期化される);</source>
たとば以下のコードは正常に動作しない。ちなみにGraphicsDeviceが最初から持っているレンダリングターゲット([[DirectX]]でいう[[プライマリサーフェイス]]、SetRenterTarget(null))に相当するものは問答無用でDiscardContentsに設定されている。 このため、たとば以下のコードは正常に動作しない。
<source lang="csharp">
protected override void Draw(GameTime gameTime) { // (1)プライマリサーフェイスを塗りつぶす var gd = _graphics.GraphicsDevice.Clear(Color.CornflowerBlue);
// (2)レンダリングターゲットを切り替える(1)プライマリサーフェイスを塗りつぶす _graphics gd.GraphicsDeviceClear(Color.SetRenderTarget(new RenderTarget2D(GraphicsDevice, 128, 128)CornflowerBlue);
// (3)レンダリングターゲットをプライマリサーフェイスに戻す(2)レンダリングターゲットを切り替える // このときプライマリサーフェイスはDiscardContents設定なので内容がクリアされ(1)の塗りつぶしが無かったことにされる。 _graphics.GraphicsDevice gd.SetRenderTarget(nullnew RenderTarget2D(GraphicsDevice, 128, 128));
// (3)レンダリングターゲットをプライマリサーフェイスに戻す // プライマリサーフェイスは問答無用でDiscardContents設定なので // 内容はクリアされ(1)の塗りつぶしは無かったことにされる。 // なお、(2)のレンダーターゲットは影響を受けない。 gd.SetRenderTarget(null);  base.Draw(gameTime); }
</source>
DiscardContentsの場合は以下のような呼出順序で書かなければならない。
<source lang="csharp">
protected override void Draw(GameTime gameTime) { var gd = _graphics.GraphicsDevice;  // (1)レンダリングターゲットを切り替える _graphics.GraphicsDevice gd.SetRenderTarget(new RenderTarget2D(GraphicsDevice, 128, 128));
// (2)レンダリングターゲットをプライマリサーフェイスに戻す(と同時にまっさらになる) _graphics.GraphicsDevice // (1)のレンダーターゲットは影響を受けない。 gd.SetRenderTarget(null);
// (3)プライマリサーフェイスを塗りつぶす _graphics.GraphicsDevice gd.Clear(Color.CornflowerBlue);
base.Draw(gameTime); }
</source>