「MonoGame/クラスライブラリ/RenderTargetUsage列挙体」の版間の差分

imported>Administrator
編集の要約なし
 
(3人の利用者による、間の7版が非表示)
2行目: 2行目:


== 名前空間 ==
== 名前空間 ==
* [[MonoGame/クラスライブラリ/Microsoft.Xna.Framework.Graphics名前空間|Microsoft.Xna.Framework.Graphics名前空間]]
[[MonoGame/クラスライブラリ/Microsoft.Xna.Framework.Graphics名前空間|Microsoft.Xna.Framework.Graphics名前空間]]


== 構文 ==
== 構文 ==
30行目: 30行目:


=== DiscardContentsの注意点 ===
=== DiscardContentsの注意点 ===
GraphicsDeviceが最初から持っているレンダリングターゲット(DirectXでいうプライマリサーフェイス)に相当するものはDiscardContentsに設定されている。
DiscardContents設定になっていると「GraphicsDevice.SetRenderTargetするたびに破棄(初期化)される」という特徴がある。この特性があるためレンダリング系APIの呼出順序を間違えると残念なことになる。
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)
protected override void Draw(GameTime gameTime)
        {
{
            // (1)プライマリサーフェイスを塗りつぶす
    var gd = _graphics.GraphicsDevice;
            _graphics.GraphicsDevice.Clear(Color.CornflowerBlue);


            // (2)レンダリングターゲットを切り替える
    // (1)プライマリサーフェイスを塗りつぶす
            _graphics.GraphicsDevice.SetRenderTarget(new RenderTarget2D(GraphicsDevice, 128, 128));
    gd.Clear(Color.CornflowerBlue);


            // (3)レンダリングターゲットをプライマリサーフェイスに戻す
    // (2)レンダリングターゲットを切り替える
            // このときプライマリサーフェイスはDiscardContents設定なので内容がクリアされ(1)の塗りつぶしが無かったことにされる。
    gd.SetRenderTarget(new RenderTarget2D(GraphicsDevice, 128, 128));
            _graphics.GraphicsDevice.SetRenderTarget(null);


            base.Draw(gameTime);
    // (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)
protected override void Draw(GameTime gameTime)
        {
{
            // (1)レンダリングターゲットを切り替える
    var gd = _graphics.GraphicsDevice;
            _graphics.GraphicsDevice.SetRenderTarget(new RenderTarget2D(GraphicsDevice, 128, 128));
 
    // (1)レンダリングターゲットを切り替える
    gd.SetRenderTarget(new RenderTarget2D(GraphicsDevice, 128, 128));


            // (2)レンダリングターゲットをプライマリサーフェイスに戻す(と同時にまっさらになる)
    // (2)レンダリングターゲットをプライマリサーフェイスに戻す(と同時にまっさらになる)
            _graphics.GraphicsDevice.SetRenderTarget(null);
    // (1)のレンダーターゲットは影響を受けない。
    gd.SetRenderTarget(null);


            // (3)プライマリサーフェイスを塗りつぶす
    // (3)プライマリサーフェイスを塗りつぶす
            _graphics.GraphicsDevice.Clear(Color.CornflowerBlue);
    gd.Clear(Color.CornflowerBlue);


            base.Draw(gameTime);
    base.Draw(gameTime);
        }
}
</source>
</source>


77行目: 88行目:
* [[MonoGame/クラスライブラリ/CubeMapFace列挙体|CubeMapFace列挙体]]
* [[MonoGame/クラスライブラリ/CubeMapFace列挙体|CubeMapFace列挙体]]
* [[MonoGame/クラスライブラリ/RenderTargetBinding構造体|RenderTargetBinding構造体]]
* [[MonoGame/クラスライブラリ/RenderTargetBinding構造体|RenderTargetBinding構造体]]
* [[MonoGame/クラスライブラリ/RenderTargetUsage列挙体|RenderTargetUsage列挙体]]


[[category: MonoGame]]
[[category: MonoGame]]