ページ「固定機能シェーダー」と「MonoGame/クラスライブラリ/RenderTargetUsage列挙体」の間の差分

提供: MonoBook
(ページ間の差分)
ナビゲーションに移動 検索に移動
imported>Administrator
 
imported>Administrator
 
1行目: 1行目:
'''固定シェーダー'''とは、[[ゲームフレームワーク]][[ゲームエンジン]]などに標準搭載されている固定機能の[[シェーダー]]のことである。
+
RenderTargetUsage列挙体は、グラフィックデバイス([[MonoGame/クラスライブラリ/GraphicsDeviceクラス|GraphicsDeviceクラス]])に新たなレンダリングターゲット([[MonoGame/クラスライブラリ/RenderTarget2Dクラス|RenderTarget2Dクラス]])を設定したとき、そのレンダリングターゲットの[[データ]]をどのように処理するかを指定するのに使用する列挙体である。
対義語は「[[プログラマブルシェーダー]](環境によってはカスタムエフェクトなどとも呼ばれる)」。
 
  
素人に[[プログラマブルシェーダー]]など書けるわけもなく、そんなものを書いている時間があるなら、まず[[ゲーム]]の本編を作ろう。
+
== 名前空間 ==
そもそも定番の描画処理はわざわざ[[プログラマブルシェーダー]]を持ち出すまでもない。
+
* [[MonoGame/クラスライブラリ/Microsoft.Xna.Framework.Graphics名前空間|Microsoft.Xna.Framework.Graphics名前空間]]
  
[[MonoGame]]でいえば「[[MonoGame/クラスライブラリ/BasicEffectクラス|BasicEffectクラス]]」などがこれに相当する。
+
== 構文 ==
 +
public enum RenderTargetUsage
 +
 
 +
== フィールド ==
 +
{| class="wikitable"
 +
|+
 +
! 値
 +
! 概要
 +
|-
 +
| DiscardContents
 +
| 常にレンダリングターゲットのデータを削除する。
 +
|-
 +
| PlatformContents
 +
| プラットフォームに応じて扱いを変える。使うな危険。
 +
|-
 +
| PreserveContents
 +
| 常にレンダリングターゲットのデータを保持する。
 +
|}
 +
 
 +
== 備考 ==
 +
=== PreserveContentsは遅い ===
 +
PreserveContentsはVRAM容量が少ない環境ではメインメモリへの保存と復元が発生するため絶望的なほど遅くなる。
 +
とくにスマホでは絶望的なようなので、なるべくDiscardContentsを使ったほうが良さそうだ。
 +
 
 +
=== DiscardContentsの注意点 ===
 +
GraphicsDeviceが最初から持っているレンダリングターゲット(DirectXでいうプライマリサーフェイス)に相当するものはDiscardContentsに設定されている。
 +
DiscardContentsの欠点はGraphicsDevice.SetRenderTargetするたびに破棄される点であり、レンダリング系APIの呼出順序を間違えると残念なことになる。
 +
 
 +
たとば以下のコードは正常に動作しない。
 +
<source lang="csharp">
 +
        protected override void Draw(GameTime gameTime)
 +
        {
 +
            // (1)プライマリサーフェイスを塗りつぶす
 +
            _graphics.GraphicsDevice.Clear(Color.CornflowerBlue);
 +
 
 +
            // (2)レンダリングターゲットを切り替える
 +
            _graphics.GraphicsDevice.SetRenderTarget(new RenderTarget2D(GraphicsDevice, 128, 128));
 +
 
 +
            // (3)レンダリングターゲットをプライマリサーフェイスに戻す
 +
            // このときプライマリサーフェイスはDiscardContents設定なので内容がクリアされ(1)の塗りつぶしが無かったことにされる。
 +
            _graphics.GraphicsDevice.SetRenderTarget(null);
 +
 
 +
            base.Draw(gameTime);
 +
        }
 +
</source>
 +
 
 +
DiscardContentsの場合は以下のような呼出順序で書かなければならない。
 +
<source lang="csharp">
 +
        protected override void Draw(GameTime gameTime)
 +
        {
 +
            // (1)レンダリングターゲットを切り替える
 +
            _graphics.GraphicsDevice.SetRenderTarget(new RenderTarget2D(GraphicsDevice, 128, 128));
 +
 
 +
            // (2)レンダリングターゲットをプライマリサーフェイスに戻す(と同時にまっさらになる)
 +
            _graphics.GraphicsDevice.SetRenderTarget(null);
 +
 
 +
            // (3)プライマリサーフェイスを塗りつぶす
 +
            _graphics.GraphicsDevice.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構造体|RenderTargetBinding構造体]]
 +
 
 +
[[category: MonoGame]]

2017年11月8日 (水) 08:55時点における版

RenderTargetUsage列挙体は、グラフィックデバイス(GraphicsDeviceクラス)に新たなレンダリングターゲット(RenderTarget2Dクラス)を設定したとき、そのレンダリングターゲットのデータをどのように処理するかを指定するのに使用する列挙体である。

名前空間

構文

public enum RenderTargetUsage

フィールド

概要
DiscardContents 常にレンダリングターゲットのデータを削除する。
PlatformContents プラットフォームに応じて扱いを変える。使うな危険。
PreserveContents 常にレンダリングターゲットのデータを保持する。

備考

PreserveContentsは遅い

PreserveContentsはVRAM容量が少ない環境ではメインメモリへの保存と復元が発生するため絶望的なほど遅くなる。 とくにスマホでは絶望的なようなので、なるべくDiscardContentsを使ったほうが良さそうだ。

DiscardContentsの注意点

GraphicsDeviceが最初から持っているレンダリングターゲット(DirectXでいうプライマリサーフェイス)に相当するものはDiscardContentsに設定されている。 DiscardContentsの欠点はGraphicsDevice.SetRenderTargetするたびに破棄される点であり、レンダリング系APIの呼出順序を間違えると残念なことになる。

たとば以下のコードは正常に動作しない。

        protected override void Draw(GameTime gameTime)
        {
            // (1)プライマリサーフェイスを塗りつぶす
            _graphics.GraphicsDevice.Clear(Color.CornflowerBlue);

            // (2)レンダリングターゲットを切り替える
            _graphics.GraphicsDevice.SetRenderTarget(new RenderTarget2D(GraphicsDevice, 128, 128));

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

            base.Draw(gameTime);
        }

DiscardContentsの場合は以下のような呼出順序で書かなければならない。

        protected override void Draw(GameTime gameTime)
        {
            // (1)レンダリングターゲットを切り替える
            _graphics.GraphicsDevice.SetRenderTarget(new RenderTarget2D(GraphicsDevice, 128, 128));

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

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

            base.Draw(gameTime);
        }

関連項目