「マルチプルレンダーターゲット」を編集中

ナビゲーションに移動 検索に移動

警告: ログインしていません。編集を行うと、あなたの IP アドレスが公開されます。ログインまたはアカウントを作成すれば、あなたの編集はその利用者名とともに表示されるほか、その他の利点もあります。

この編集を取り消せます。 下記の差分を確認して、本当に取り消していいか検証してください。よろしければ変更を保存して取り消しを完了してください。

最新版 編集中の文章
1行目: 1行目:
'''マルチプル・レンダー・ターゲット'''([[英語]]:Multiple Render Target、略称:MRT)とは、一回の[[シェーダー]]呼び出しで複数の[[レンダーターゲット]]に描画する機能である。
+
'''マルチプルレンダーターゲット'''([[英語]]:Multiple Render Target、略称:MRT)とは、一回の[[シェーダー]]呼び出しで複数のレンダーターゲットに描画する機能である。
  
==対応状況==
+
== 対応状況 ==
 +
* [[MonoGame]]ではHiDefに設定すると使える。
 +
* [[OpenGL ES]]では[[OpenGL ES 3.0]]以降で使える。
  
*DirectX 9から使えるが、DirectX 9.0cくらいまでは対応・非対応の製品が乱立していた。
+
== 概要 ==
**[[ATI]]製品はほとんどいけた。
+
=== 3D ===
**[[NVIDIA]]製品はGeForce 6x00シリーズくらいから対応だと思う。
+
[[3Dテレビ]][[VR]]向けに映像を出力する際には、人間の目と目の間隔分だけ微妙にカメラ視点をズラした2つの画像を出力する。つまり1フレームを表示するには「右目用」と「左目用」の2枚の画像を描くことになる。
**現行製品はすべて対応している。
 
*[[MonoGame]]では「HiDef」に設定すると使える([[OpenGL]]系ではまともに動かない)。
 
*[[OpenGL ES]]では[[OpenGL ES 3.0]]以降で使える。
 
  
==概要==
+
[[シェーダー]]は「実行速度」よりも「起動速度」が段違いに遅いので呼び出す回数を減らせれば劇的に速くなる。つまりカメラの座標がちょっと違うだけなのに2回もシェーダーを回すとかまったくイケてない。
[[遅延レンダリング]]では「[[色]]」や「[[法線]]」、「[[深度]]」などを複数の[[レンダーターゲット]]に出力する。ならば出力先の[[レンダーターゲット]]を複数指定できるようにすれば1回のシェーダー呼び出しで完結できるじゃないか、という代物である。
 
  
[[遅延レンダリング]]が大流行しだした時期に[[Xbox 360]]と[[PS3]]が発売した。
+
そこで出力先の[[レンダーターゲット]][[テクスチャ]])を複数指定できるようにすれば1回のシェーダー呼び出しで完結できるじゃないか、という代物である。
これらには[[遅延レンダリング]]を高速化する目的でMRTが搭載された。
 
  
==メリット==
+
=== 遅延レンダリング ===
[[シェーダー]]の呼び出し、いわゆる「[[Drawコール]]」が減る。
+
[[遅延レンダリング]]では「[[色]]」や「[[法線]]」、「[[深度]]」などを複数の[[レンダーターゲット]]に出力する。
  
==デメリット==
+
ならば出力先の[[レンダーターゲット]]を複数指定できるようにすれば1回のシェーダー呼び出しで完結できるじゃないか、という代物である。
 +
 
 +
== メリット ==
 +
シェーダーの呼び出し、いわゆる「Drawコール」が減る。
 +
 
 +
== デメリット ==
 
当然ながらMRT向けに[[シェーダー]]を書き直さなければならない。
 
当然ながらMRT向けに[[シェーダー]]を書き直さなければならない。
  
[[COBOL]]や[[Java]]や[[PHP]]を愛する[[IT土方]]的な考えであれば「既存のシェーダーを2回呼び出せばいいじゃん」となるところである。この世界では「[[車輪の再発明]]だ」と批判されることであろう。
+
[[COBOL]]や[[Java]]や[[PHP]]を愛する[[IT土方]]的な考えであれば「既存のシェーダーを2回呼び出せばいいじゃん」となるところである。
  
一方、ゲーム業界はそこへ突撃して「この[[ゲーム]]のここがすごい!」と宣伝材料にしようとする。なお[[ゲーム]]の面白さには一切関係ない。
+
一方、ゲーム業界はそこへ突撃して「このゲームのここがすごい!」と宣伝材料にしようとする。
  
 
彼らは相見えない。「[[プログラマー]]」と一括にはできないほど根本的な思想に違いがある。
 
彼らは相見えない。「[[プログラマー]]」と一括にはできないほど根本的な思想に違いがある。
  
==記述例==
+
== 記述例 ==
 
[[ピクセルシェーダー]]の戻り値を構造体にして一度に複数の色を返す感じになる。
 
[[ピクセルシェーダー]]の戻り値を構造体にして一度に複数の色を返す感じになる。
[[HLSL]]の記述例。
+
HLSLの記述例。
<source lang=c>
+
<source>
 
// Rec. 709グレースケール変換定数
 
// Rec. 709グレースケール変換定数
 
const float3 luma = float3(0.2126, 0.7152, 0.0722);
 
const float3 luma = float3(0.2126, 0.7152, 0.0722);
61行目: 63行目:
 
</source>
 
</source>
  
[[OpenGL]]や[[OpenGL ES]]でも似たような感じである。通常はシステム予約の変数「gl_FragColor」に色を設定するが、MRTの場合は「gl_FragData」配列に各種の値を設定する。
+
== 関連項目 ==
<source lang=c>
 
    vec4 ps_c0 = vec4(0.0, 0.5, 1.0, 0.0);
 
    gl_FragData[0] = ps_c0.xxxx;
 
    gl_FragData[1] = ps_c0.yyyx;
 
    gl_FragData[2] = ps_c0.zzzz;
 
</source>
 
 
 
[[OpenGL ES]] 3.0(GLSL ES 3.0)では「gl_FragColor」も「gl_FragData」も廃止された。
 
代わりにlayoutを使う。これによりgl_FragDataは問答無用でvec4の配列であり無駄が多かったのが改善された。ただHLSLのstructの方がわかりやすいね。
 
<source lang=c>
 
    layout (location = 0) out vec3 position;
 
    layout (location = 1) out vec3 normal;
 
    layout (location = 2) out vec4 color;
 
</source>
 
 
 
==関連項目==
 
* [[Rec. 709]]
 
* [[グレースケール変換定数]]
 
* [[MonoGameで遅延レンダリングをする]]
 
* [[ハードウェアインスタンシング]]
 
  
[[category: コンピューター・グラフィックス]]
+
[[category: コンピューターグラフィックス]]
[[category: GPU]]
 

MonoBookへの投稿はすべて、他の投稿者によって編集、変更、除去される場合があります。 自分が書いたものが他の人に容赦なく編集されるのを望まない場合は、ここに投稿しないでください。
また、投稿するのは、自分で書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください(詳細はMonoBook:著作権を参照)。 著作権保護されている作品は、許諾なしに投稿しないでください!

このページを編集するには、下記の確認用の質問に回答してください (詳細):

取り消し 編集の仕方 (新しいウィンドウで開きます)