imported>Administrator |
imported>Administrator |
1行目: |
1行目: |
− | '''マルチプルレンダーターゲット'''([[英語]]:Multiple Render Target、略称:MRT)とは、一回の[[シェーダー]]呼び出しで複数のレンダーターゲットに描画する機能である。
| + | #転送 [[マルチプルレンダーターゲット]] |
− | | |
− | == 対応状況 ==
| |
− | * DirectX 9から使えるが、DirectX 9.0cくらいまでは対応・非対応の製品が乱立していた。
| |
− | ** [[ATI]]製品はほとんどいけた。
| |
− | ** [[NVIDIA]]製品はGeForce 6x00シリーズくらいから対応だと思う。
| |
− | ** 現行製品はすべて対応している。
| |
− | * [[MonoGame]]ではHiDefに設定すると使える。
| |
− | * [[OpenGL ES]]では[[OpenGL ES 3.0]]以降で使える。
| |
− | | |
− | == 概要 ==
| |
− | === 3DテレビやVR ===
| |
− | [[3Dテレビ]]や[[VR]]向けに映像を出力する際には、人間の目と目の間隔分だけ微妙にカメラ視点をズラした2つの画像を出力する。つまり1フレームを表示するには「右目用」と「左目用」の2枚の画像を描くことになる。
| |
− | | |
− | [[シェーダー]]は「実行速度」よりも「起動速度」が段違いに遅いので呼び出す回数を減らせれば劇的に速くなる。つまりカメラの座標がちょっと違うだけなのに2回もシェーダーを回すとかまったくイケてない。
| |
− | | |
− | そこで出力先の[[レンダーターゲット]]([[テクスチャ]])を複数指定できるようにすれば1回のシェーダー呼び出しで完結できるじゃないか、という代物である。
| |
− | | |
− | === 遅延レンダリング ===
| |
− | [[遅延レンダリング]]では「[[色]]」や「[[法線]]」、「[[深度]]」などを複数の[[レンダーターゲット]]に出力する。
| |
− | | |
− | ならば出力先の[[レンダーターゲット]]を複数指定できるようにすれば1回のシェーダー呼び出しで完結できるじゃないか、という代物である。
| |
− | | |
− | == メリット ==
| |
− | シェーダーの呼び出し、いわゆる「Drawコール」が減る。
| |
− | | |
− | == デメリット ==
| |
− | 当然ながらMRT向けに[[シェーダー]]を書き直さなければならない。
| |
− | | |
− | [[COBOL]]や[[Java]]や[[PHP]]を愛する[[IT土方]]的な考えであれば「既存のシェーダーを2回呼び出せばいいじゃん」となるところである。この世界では「[[車輪の再発明]]だ」と批判されることであろう。
| |
− | | |
− | 一方、ゲーム業界はそこへ突撃して「この[[ゲーム]]のここがすごい!」と宣伝材料にしようとする。なお[[ゲーム]]の面白さには一切関係ない。
| |
− | | |
− | 彼らは相見えない。「[[プログラマー]]」と一括にはできないほど根本的な思想に違いがある。
| |
− | | |
− | == 記述例 ==
| |
− | [[ピクセルシェーダー]]の戻り値を構造体にして一度に複数の色を返す感じになる。
| |
− | [[HLSL]]の記述例。
| |
− | <source>
| |
− | // Rec. 709グレースケール変換定数
| |
− | const float3 luma = float3(0.2126, 0.7152, 0.0722);
| |
− | | |
− | // ピクセルシェーダー出力
| |
− | struct PS_OUTPUT
| |
− | {
| |
− | float4 rgba:COLOR0; //RendarTargetの0番目に出力
| |
− | float4 gray:COLOR1; //RendarTargetの1番目に出力
| |
− | };
| |
− | | |
− | // ピクセルシェーダー本体
| |
− | // 一般的なピクセルシェーダーの戻り値はRGBAを表す「float4」だが、
| |
− | // マルチプルレンダーターゲットでは構造体で複数の色を返す。
| |
− | PS_OUTPUT psMain( float2 texCoord:TEXCOORD )
| |
− | {
| |
− | PS_OUTPUT psout;
| |
− | | |
− | // そのまま出力
| |
− | float4 color = tex2D(ScreenTexSampler,texCoord);
| |
− | psout.rgba = color;
| |
− | | |
− | // グレースケールに変換して出力
| |
− | float gray = dot(color.rgb, luma);
| |
− | psout.gray = float4(gray,gray,gray,1);
| |
− | | |
− | return psout;
| |
− | }
| |
− | </source>
| |
− | | |
− | == 関連項目 ==
| |
− | * [[Rec. 709]]
| |
− | * [[グレースケール変換定数]]
| |
− | | |
− | [[category: コンピューターグラフィックス]]
| |