メインメニューを開く

差分

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

316 バイト追加, 2020年9月15日 (火) 02:45
RenderTargetUsage列挙体は、グラフィックデバイス([[MonoGame/クラスライブラリ/GraphicsDeviceクラス|GraphicsDeviceクラス]])に新たなレンダリングターゲット([[MonoGame/クラスライブラリ/RenderTarget2Dクラス|RenderTarget2Dクラス]])を設定したとき、そのレンダリングターゲットの[[データ]]をどのように処理するかを指定するのに使用する列挙体である。をどのように処理するかを指定するのに使用する[[列挙体]]である。
== 名前空間 ==
* [[MonoGame/クラスライブラリ/Microsoft.Xna.Framework.Graphics名前空間|Microsoft.Xna.Framework.Graphics名前空間]]
== 構文 ==
== 備考 ==
=== PreserveContentsは遅い ===
PreserveContentsはVRAM容量が少ない環境ではメインメモリへの保存と復元が発生するため絶望的なほど遅くなる。PreserveContentsは[[VRAM]]容量が少ない環境では[[メインメモリ]]への保存と復元が発生するため絶望的なほど遅くなる。とくにスマホでは絶望的なようなので、なるべくDiscardContentsを使ったほうが良さそうだ。[[PC]]ではまず問題になることはないようだが、一部の[[スマホ]]では絶望的な速度になるようだ。なるべくDiscardContentsを使ったほうが良さそうだ。
=== 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>
== 関連項目 ==
* [[MonoGame/クラスライブラリ/GraphicsDeviceクラス|GraphicsDeviceクラス]]
** [[MonoGame/クラスライブラリ/GraphicsDeviceクラス/SetRenderTargetメソッド|GraphicsDeviceクラス/SetRenderTargetメソッド]]** [[MonoGame/クラスライブラリ/GraphicsDeviceクラス/SetRenderTargetsメソッド|GraphicsDeviceクラス/SetRenderTargetsメソッド]]** [[MonoGame/クラスライブラリ/GraphicsDeviceクラス/GetRenderTargetsメソッド|GraphicsDeviceクラス/GetRenderTargetsメソッド]]
* [[MonoGame/クラスライブラリ/RenderTarget2Dクラス|RenderTarget2Dクラス]]
* [[MonoGame/クラスライブラリ/RenderTargetCubeクラス|RenderTargetCubeクラス]]
* [[MonoGame/クラスライブラリ/CubeMapFace列挙体|CubeMapFace列挙体]]
* [[MonoGame/クラスライブラリ/RenderTargetBinding構造体|CRenderTargetBinding構造体RenderTargetBinding構造体]]* [[MonoGame/クラスライブラリ/RenderTargetUsage列挙体|RenderTargetUsage列挙体]]
[[category: MonoGame]]