「MonoGame/クラスライブラリ/RenderTargetUsage列挙体」の版間の差分
imported>Administrator |
Administrator (トーク | 投稿記録) 編集の要約なし |
||
| 30行目: | 30行目: | ||
=== DiscardContentsの注意点 === | === DiscardContentsの注意点 === | ||
DiscardContentsは「GraphicsDevice.SetRenderTargetするたびに破棄(初期化)される」という特徴がある。この特性があるためレンダリング系APIの呼出順序を間違えると残念なことになる。 | |||
<source lang="csharp"> | |||
GraphicsDevice.SetRenderTarget(このRenderTargetは初期化される); | |||
</source> | |||
ちなみにGraphicsDeviceが最初から持っているレンダリングターゲット([[DirectX]]でいう[[プライマリサーフェイス]]、SetRenterTarget(null))に相当するものはDiscardContentsに設定されている。 | |||
このため、たとば以下のコードは正常に動作しない。 | |||
<source lang="csharp"> | <source lang="csharp"> | ||
protected override void Draw(GameTime gameTime) | |||
{ | |||
var gd = _graphics.GraphicsDevice; | |||
// (1)プライマリサーフェイスを塗りつぶす | |||
gd.Clear(Color.CornflowerBlue); | |||
// (2)レンダリングターゲットを切り替える | |||
gd.SetRenderTarget(new RenderTarget2D(GraphicsDevice, 128, 128)); | |||
// (3)レンダリングターゲットをプライマリサーフェイスに戻す | |||
// このときプライマリサーフェイスはDiscardContents設定なので内容がクリアされ(1)の塗りつぶしが無かったことにされる。 | |||
// (2)のレンダーターゲットは影響を受けない。 | |||
gd.SetRenderTarget(null); | |||
base.Draw(gameTime); | |||
} | |||
</source> | </source> | ||
DiscardContentsの場合は以下のような呼出順序で書かなければならない。 | DiscardContentsの場合は以下のような呼出順序で書かなければならない。 | ||
<source lang="csharp"> | <source lang="csharp"> | ||
protected override void Draw(GameTime gameTime) | |||
{ | |||
var gd = _graphics.GraphicsDevice; | |||
// (1)レンダリングターゲットを切り替える | |||
gd.SetRenderTarget(new RenderTarget2D(GraphicsDevice, 128, 128)); | |||
// (2)レンダリングターゲットをプライマリサーフェイスに戻す(と同時にまっさらになる) | |||
// (1)のレンダーターゲットは影響を受けない。 | |||
gd.SetRenderTarget(null); | |||
// (3)プライマリサーフェイスを塗りつぶす | |||
gd.Clear(Color.CornflowerBlue); | |||
base.Draw(gameTime); | |||
} | |||
</source> | </source> | ||